Lassen Sie mich dies vorwegnehmen, indem Sie sagen, dass ich hier hauptsächlich über den Methodenzugriff spreche und in etwas geringerem Maße Klassen als endgültig und nicht als Mitgliederzugriff markiere .
Die alte Weisheit
"Markiere es als privat, es sei denn, du hast einen guten Grund, es nicht zu tun."
machte Sinn in Tagen, als es geschrieben wurde, bevor Open Source den Entwicklerbibliotheksraum und VCS / Dependency mgmt dominierte. wurde dank Github, Maven usw. hyperkooperativ. Damals gab es auch Geld zu verdienen, indem die Art und Weise, wie eine Bibliothek genutzt werden konnte, eingeschränkt wurde. Ich habe wahrscheinlich die ersten 8 oder 9 Jahre meiner Karriere damit verbracht, mich strikt an diese "Best Practice" zu halten.
Heute halte ich es für einen schlechten Rat. Manchmal gibt es ein vernünftiges Argument, um eine Methode als privat oder als Klassenfinale zu markieren, aber es ist äußerst selten, und selbst dann verbessert es wahrscheinlich nichts.
Hast du jemals:
- Sie waren enttäuscht, überrascht oder verletzt von einer Bibliothek usw., die einen Fehler hatte, der mit Vererbung und wenigen Codezeilen hätte behoben werden können, aber aufgrund privater / endgültiger Methoden und Klassen gezwungen waren, auf einen offiziellen Patch zu warten, der möglicherweise nie kommen würde? Ich habe.
- Wollten Sie eine Bibliothek für einen etwas anderen Anwendungsfall verwenden, als von den Autoren vorgestellt, konnten dies jedoch aufgrund privater / endgültiger Methoden und Klassen nicht? Ich habe.
- Sie wurden enttäuscht, überrascht oder verletzt von einer Bibliothek usw., deren Erweiterbarkeit zu freizügig war? Ich habe nicht.
Dies sind die drei größten Rationalisierungen, die ich für das standardmäßige Markieren von Methoden gehört habe:
Rationalisierung Nr. 1: Es ist unsicher und es gibt keinen Grund, eine bestimmte Methode zu überschreiben
Ich kann nicht zählen, wie oft ich mich geirrt habe, ob es jemals notwendig sein wird, eine bestimmte von mir geschriebene Methode zu überschreiben. Nachdem ich an mehreren populären Open-Source-Bibliotheken gearbeitet hatte, lernte ich auf die harte Tour die wahren Kosten für das Markieren von privaten Dingen. Oft entfällt die einzig praktikable Lösung für unvorhergesehene Probleme oder Anwendungsfälle. Umgekehrt habe ich es in mehr als 16 Jahren beruflicher Entwicklung nie bereut, eine aus Gründen der API-Sicherheit geschützte statt private Methode markiert zu haben. Wenn ein Entwickler eine Klasse erweitert und eine Methode überschreibt, sagt er bewusst: "Ich weiß, was ich tue." und aus Gründen der Produktivität sollte das ausreichen. Zeitraum. Wenn es gefährlich ist, notieren Sie es in der Klasse / Methode Javadocs, schlagen Sie die Tür nicht einfach blind zu.
Standardmäßig geschützte Markierungsmethoden sind eine Abschwächung für eines der Hauptprobleme in der modernen SW-Entwicklung: ein Versagen der Vorstellungskraft.
Rationalisierung Nr. 2: Sie hält die öffentliche API / Javadocs sauber
Dieser ist vernünftiger und je nach Zielgruppe vielleicht sogar das Richtige, aber es lohnt sich zu überlegen, wie hoch die Kosten für die "Sauberkeit" der API tatsächlich sind: Erweiterbarkeit. Aus den oben genannten Gründen ist es wahrscheinlich sinnvoller, für alle Fälle standardmäßig geschützte Dinge zu markieren.
Rationalisierung Nr. 3: Meine Software ist kommerziell und ich muss ihre Verwendung einschränken.
Dies ist auch vernünftig, aber als Verbraucher würde ich mich jedes Mal für den weniger restriktiven Wettbewerber entscheiden (vorausgesetzt, es bestehen keine signifikanten Qualitätsunterschiede).
Sag niemals nie
Ich sage nicht, niemals Methoden als privat zu markieren. Ich sage, die bessere Faustregel lautet: "Methoden schützen, es sei denn, es gibt einen guten Grund, dies nicht zu tun".
Dieser Rat ist am besten für diejenigen geeignet, die an Bibliotheken oder größeren Projekten arbeiten, die in Module unterteilt wurden. Bei kleineren oder monolithischeren Projekten spielt dies keine Rolle, da Sie ohnehin den gesamten Code kontrollieren und es einfach ist, die Zugriffsebene Ihres Codes zu ändern, wenn Sie ihn benötigen. Selbst dann würde ich immer noch den gleichen Rat geben :-)