Diese Frage, wann privat und wann geschützt in Klassen verwendet werden soll, brachte mich zum Nachdenken. (Ich werde diese Frage auch auf die letzten Klassen und Methoden ausdehnen, da sie verwandt sind. Ich programmiere in Java, denke aber, dass dies für jede OOP-Sprache relevant ist.)
Die akzeptierte Antwort lautet:
Eine gute Faustregel lautet: Machen Sie alles so privat wie möglich.
- Machen Sie alle Klassen endgültig, es sei denn, Sie müssen sie sofort unterordnen.
- Machen Sie alle Methoden endgültig, es sei denn, Sie müssen sie sofort in Unterklassen unterteilen und überschreiben.
- Machen Sie alle Methodenparameter endgültig, es sei denn, Sie müssen sie im Hauptteil der Methode ändern, was in den meisten Fällen ohnehin umständlich ist.
Das ist ziemlich einfach und klar, aber was ist, wenn ich hauptsächlich Bibliotheken (Open Source auf GitHub) anstelle von Anwendungen schreibe?
Ich könnte viele Bibliotheken und Situationen nennen, in denen
- Eine Bibliothek wurde auf eine Weise erweitert, an die die Entwickler niemals gedacht hätten
- Dies musste aufgrund von Sichtbarkeitsbeschränkungen mit "Klassenladeprogramm-Magie" und anderen Hacks durchgeführt werden
- Bibliotheken wurden auf eine Weise verwendet, für die sie nicht gebaut wurden, und die benötigte Funktionalität wurde "gehackt"
- Bibliotheken konnten aufgrund eines kleinen Problems (Fehler, fehlende Funktionalität, "falsches" Verhalten) nicht verwendet werden, das aufgrund einer eingeschränkten Sichtbarkeit nicht geändert werden konnte
- Ein Problem, das nicht behoben werden konnte, führte zu riesigen, hässlichen und fehlerhaften Problemumgehungen, bei denen das Überschreiben einer einfachen (privaten oder endgültigen) Funktion hätte helfen können
Und ich fing tatsächlich an, diese zu benennen, bis die Frage zu lang wurde und ich beschloss, sie zu entfernen.
Ich mag die Idee, nicht mehr Code als nötig zu haben, mehr Sichtbarkeit als nötig, mehr Abstraktion als nötig. Dies funktioniert möglicherweise auch beim Schreiben einer Anwendung für den Endbenutzer, bei der der Code nur von denjenigen verwendet wird, die ihn schreiben. Aber wie hält es sich, wenn der Code von anderen Entwicklern verwendet werden soll, bei denen es unwahrscheinlich ist, dass der ursprüngliche Entwickler im Voraus über jeden möglichen Anwendungsfall nachgedacht hat und Änderungen / Umgestaltungen schwierig / unmöglich sind?
Wie wird in solchen Projekten mit objektorientierten Sprachen am häufigsten mit der Sichtbarkeit umgegangen, da große Open-Source-Bibliotheken nichts Neues sind?