Noch einmal die Links, die ich bereits gepostet habe:
Selbst dort finde ich "The main reason is that a programmer himself wants to get access to the encapsulated (please notice, I’m specifically not using term “hidden”) data. And if these data will be somehow incorrectly changed or there will be any error — the full responsibility for this is completely on the programmer, but not simply a “typing error” or “someone has casually changed some field”. But if such cases become frequent, we may nevertheless note a bad programming practice and style, since usually it’s the best to “talk” with objects only via public API." womit eigentlich alles gesagt ist.
Die Welt der Programmierung ist halt nicht schwarz/weiß. Weil das so ist, erlauben Ruby und Python den Zugriff, selbst wenn es schlechter Programmierstil ist und nach Möglichkeit vermieden werden sollte.
Ich behaupte keinesfalls dass man diese Möglichkeiten überhaupt oder gar häufig nutzen sollte. Ich wollte nur sagen, dass wir uns hier im Bereich von Konventionen, nicht von notwendig effektiver Kapselung bewegen. Kapselung als Pattern ist wichtig, aber es in Sondernfällen zu missachten ist den Entwickler von Ruby und Python so wichtig, dass sie es möglich gemacht haben. Übertragen auf JavaScript heißt das für mich, dass eine Pseudo-Kapselung z.B. mit Präfixen wie _ oftmals ausreicht.
Und meine Persönliche Erfahrung sagt mir, daß auf alles, was nicht gekapselt ist, auch aus irgendeinem Grund jemand zugreift.
Wenn ein Programmierer das tut, dann ist es halt sein Problem, wenn der Code irgendwann bricht (s.o.). Deswegen gibt es entsprechende Hindernisse.
Dann wird ein Balkon nach dem anderen an ein Objekt gebaut. Sind die Daten gekapselt, muss jemand der darauf Zugriff haben möchte mit dem Entwickler reden.
So funktioniert die Welt der Softwareentwicklung leider nicht immer, zumindest nicht die Open-Source-Welt hinsichtlich Ruby, Python und JavaScript. Manchmal bleibt einem nichts anderes übrig, als Code zu forken oder zu monkey-patchen. Dazu ist es praktisch, auf Interna zugreifen zu können. Das ist nicht schön und nicht ideal, aber Realität.
Sprachen wie Ruby und Python haben einfach keine effektive Kapselung.
Das mag sein, ist dann aber eine Schwachstelle der Sprache.
Das sehen die Designer dieser Sprachen ganz anders, sonst hätten sie diese Möglichkeit erst gar nicht eingeräumt, und die Entwickler dieser Sprachen sehen es auch anders und freuen sich, dass sie diese Möglichkeit für Ausnahmefälle und Übergangslösungen haben.
Gerade friend im C++ ist ja nicht dazu da, die Kapselung zu umgehen, sondern sie zu erhöhen, indem eine Methode nicht öffentlich gemacht werden muß, sondern einem speziellen Objekt Zugriff auf die Interna gestattet wird. Das ist auch nicht gut und auch immer anders lösbar, aber ein Kompromiss den man eingehen kann um größere Umstruckturierungen zu vermeiden, weil die Zeit fehlt.
Das klingt doch ziemlich vernünftig.
Mathias