Weil sie es nicht besser wissen.
Die ursprünglichen Autoren klammern sich wahrscheinlich an ein Missverständnis der SOLID-Prinzipien, das aus einer verwirrten und komplizierten C ++ - Welt stammt.
Ich hoffe, Sie werden feststellen, dass die Rubin-, Python- und Perlwelten nicht die Probleme haben, die die Antworten hier für den Grund der Versiegelung halten. Beachten Sie, dass es orthogonal zur dynamischen Typisierung ist. Zugriffsmodifikatoren sind in den meisten (allen?) Sprachen einfach zu bedienen. C ++ - Felder können durch Umwandeln in einen anderen Typ verworfen werden (C ++ ist schwächer). Java und C # können Reflektion verwenden. Zugriffsmodifikatoren machen die Dinge gerade so schwierig, dass Sie es nicht tun können, es sei denn, Sie möchten WIRKLICH.
Das Versiegeln von Klassen und das Markieren von Mitgliedern als privat verstößt ausdrücklich gegen das Prinzip, dass einfache Dinge einfach sein sollten und schwierige Dinge möglich sein sollten. Plötzlich sollten Dinge einfach sein, nicht wahr?
Ich möchte Sie ermutigen, den Standpunkt der ursprünglichen Autoren zu verstehen. Ein Großteil davon stammt von einer akademischen Idee der Verkapselung, die in der realen Welt niemals absoluten Erfolg gezeigt hat. Ich habe noch nie ein Framework oder eine Bibliothek gesehen, in der sich ein Entwickler irgendwo nicht gewünscht hätte, dass es ein wenig anders funktioniert, und keinen guten Grund hatte, es zu ändern. Es gibt zwei Möglichkeiten, die die ursprünglichen Softwareentwickler geplagt haben, die Mitglieder besiegelt und privat gemacht haben.
- Arroganz - sie glaubten wirklich, sie seien offen für Erweiterungen und geschlossen für Modifikationen
- Selbstzufriedenheit - sie wussten, dass es andere Anwendungsfälle geben könnte, entschieden sich jedoch, nicht für diese Anwendungsfälle zu schreiben
Ich denke, im Unternehmensrahmen wird # 2 wahrscheinlich der Fall sein. Diese C ++ -, Java- und .NET-Frameworks müssen "fertig" sein und bestimmten Richtlinien folgen. Diese Richtlinien beziehen sich normalerweise auf versiegelte Typen, es sei denn, der Typ wurde explizit als Teil einer Typhierarchie und privater Member für viele Dinge entworfen, die für andere nützlich sein könnten. Da sie sich jedoch nicht direkt auf diese Klasse beziehen, werden sie nicht verfügbar gemacht . Das Extrahieren eines neuen Typs wäre zu teuer, um ihn zu unterstützen, zu dokumentieren usw.
Die gesamte Idee hinter Zugriffsmodifikatoren ist, dass Programmierer vor sich selbst geschützt werden sollten. "C-Programmierung ist schlecht, weil Sie sich damit in den Fuß schießen können." Es ist keine Philosophie, der ich als Programmierer zustimme.
Ich bevorzuge Pythons Name Mangling-Ansatz. Sie können ganz einfach (viel einfacher als Nachdenken) Privates ersetzen, wenn Sie dies benötigen. Eine großartige Beschreibung dazu finden Sie hier: http://bytebaker.com/2009/03/31/python-properties-vs-java-access-modifiers/
Rubys privater Modifizierer ist eigentlich eher wie in C # geschützt und hat keinen privaten als C # Modifizierer. Geschützt ist ein bisschen anders. Hier gibt es eine gute Erklärung: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/
Denken Sie daran, dass Ihre statische Sprache nicht den veralteten Stilen des in dieser Sprache verfassten Codes entsprechen muss.