Ohne Getter kann man keinen guten Code schreiben.
Der Grund dafür ist nicht, dass Getter die Kapselung nicht brechen, sondern dass sie es tun. Es liegt nicht daran, dass Getter die Leute nicht dazu verleiten, OOP nicht zu folgen, wodurch sie Methoden mit den Daten setzen müssten, auf die sie einwirken. Tun sie. Nein, du brauchst Getter wegen der Grenzen.
Die Idee der Kapselung und des Zusammenhaltens von Methoden mit den Daten, auf die sie wirken, funktioniert einfach nicht, wenn Sie auf eine Grenze stoßen, die Sie vom Verschieben einer Methode abhält und Sie daher zum Verschieben von Daten zwingt.
Es ist wirklich so einfach. Wenn Sie Getter verwenden, wenn es keine Grenze gibt, haben Sie am Ende keine realen Objekte. Alles beginnt sich dem Verfahren anzunähern. Welches funktioniert so gut wie nie zuvor.
True OOP kann man nicht überall verbreiten. Es funktioniert nur innerhalb dieser Grenzen.
Diese Grenzen sind nicht hauchdünn. Sie haben Code in ihnen. Dieser Code kann nicht OOP sein. Es kann auch nicht funktionieren. Nein, dieser Code hat unsere Ideale gestrippt, damit er mit der harten Realität umgehen kann.
Michael Fetters nannte diese Code- Faszie nach dem weißen Bindegewebe, das Teile einer Orange zusammenhält.
Dies ist eine wunderbare Art, darüber nachzudenken. Es wird erklärt, warum es in Ordnung ist, beide Arten von Code in derselben Codebasis zu haben. Ohne diese Perspektive klammern sich viele neue Programmierer hart an ihre Ideale, haben dann das Herz gebrochen und geben diese Ideale auf, wenn sie an ihre erste Grenze stoßen.
Die Ideale funktionieren nur an ihrem richtigen Ort. Gib sie nicht auf, nur weil sie nicht überall funktionieren. Verwenden Sie sie dort, wo sie arbeiten. Dieser Ort ist der saftige Teil, den die Faszie schützt.
Ein einfaches Beispiel für eine Grenze ist eine Sammlung. Dies hält etwas und hat keine Ahnung, was es ist. Wie könnte ein Kollektionsdesigner möglicherweise die Verhaltensfunktionalität des gehaltenen Objekts in die Sammlung verschieben, wenn er keine Ahnung hat, was es halten wird? Das kannst du nicht. Sie stoßen an eine Grenze. Deshalb haben Kollektionen Getter.
Wenn Sie das wüssten, könnten Sie dieses Verhalten verschieben und vermeiden, den Status zu verschieben. Wenn Sie es wissen, sollten Sie es tun. Du weißt es einfach nicht immer.
Manche Leute nennen das einfach pragmatisch. Und es ist. Aber es ist schön zu wissen, warum wir pragmatisch sein müssen.
Sie haben zum Ausdruck gebracht, dass Sie semantische Argumente nicht hören wollen, und scheinen zu befürworten, überall "vernünftige Getter" zu setzen. Sie möchten, dass diese Idee in Frage gestellt wird. Ich denke, ich kann zeigen, dass die Idee Probleme mit der Art und Weise hat, wie Sie sie eingerahmt haben. Ich glaube aber auch, dass ich weiß, woher du kommst, weil ich dort war.
Wenn Sie überall Getters wollen, schauen Sie sich Python an. Es gibt kein privates Schlüsselwort. Dennoch macht Python OOP ganz gut. Wie? Sie benutzen einen semantischen Trick. Sie nennen alles, was privat sein soll, mit einem führenden Unterstrich. Sie dürfen sogar davon lesen, vorausgesetzt, Sie übernehmen die Verantwortung dafür. "Wir sind alle Erwachsene hier", sagen sie oft.
Was ist also der Unterschied zwischen dem, alles in Java oder C # zu verbessern? Tut mir leid, aber es ist Semantik. Pythons unterstreichen die Konvention und signalisieren Ihnen deutlich, dass Sie hinter der Tür des Mitarbeiters herumstöbern. Schlagen Sie auf alles und Sie verlieren dieses Signal. Mit Reflektion hätten Sie das Private sowieso abstreifen und trotzdem nicht das semantische Signal verlieren können. Hier gibt es einfach kein strukturelles Argument.
Wir müssen also entscheiden, wo das Schild "nur für Angestellte" aufgehängt werden soll. Was ist als privat zu betrachten? Sie nennen das "vernünftige Getter". Wie ich bereits sagte, ist die beste Rechtfertigung für einen Getter eine Grenze, die uns von unseren Idealen abhält. Das sollte nicht dazu führen, dass alles besser wird. Wenn es zu einem Getter kommt, sollten Sie erwägen, das Verhalten weiter in das saftige Bit zu verschieben, in dem Sie es schützen können.
Diese Trennung hat zu einigen Begriffen geführt. Ein Datenübertragungsobjekt oder DTO enthält kein Verhalten. Die einzigen Methoden sind Getter und manchmal Setter, manchmal Konstruktoren. Dieser Name ist bedauerlich, weil er überhaupt kein echtes Objekt ist. Die Getter und Setter sind eigentlich nur Debugging-Codes, mit denen Sie einen Haltepunkt setzen können. Ohne diese Notwendigkeit wären sie nur ein Haufen öffentlicher Felder. In C ++ haben wir sie Structs genannt. Der einzige Unterschied zu einer C ++ - Klasse bestand darin, dass sie standardmäßig öffentlich waren.
DTOs sind nett, weil Sie sie über eine Grenzmauer werfen und Ihre anderen Methoden sicher in einem netten saftigen Verhaltensobjekt aufbewahren können. Ein wahres Objekt. Es gibt keine Getter, die die Kapselung verletzen könnten. Meine Verhaltensobjekte können DTOs essen, indem sie als Parameterobjekte verwendet werden . Manchmal muss ich eine defensive Kopie davon erstellen , um einen gemeinsamen veränderlichen Zustand zu verhindern . Ich verbreite keine veränderlichen DTOs innerhalb des saftigen Teils innerhalb der Grenze. Ich kapsle sie ein. Ich verstecke sie. Und wenn ich endlich an eine neue Grenze stoße, drehe ich ein neues DTO auf und werfe es über die Mauer, wodurch es das Problem eines anderen macht.
Aber Sie möchten Gettern zur Verfügung stellen, die Identität ausdrücken. Nun, Glückwunsch, Sie haben eine Grenze gefunden. Entitäten haben eine Identität, die über ihre Referenz hinausgeht. Das heißt, jenseits ihrer Speicheradresse. Also muss es irgendwo aufbewahrt werden. Und etwas muss in der Lage sein, sich anhand seiner Identität auf dieses Ding zu beziehen. Ein Getter, der Identität ausdrückt, ist durchaus vernünftig. Ein Haufen Code, der diesen Getter verwendet, um Entscheidungen zu treffen, die die Entität selbst hätte treffen können, ist dies nicht.
Am Ende ist es nicht die Existenz von Gettern, die falsch ist. Sie sind viel besser als öffentliche Felder. Schlecht ist, wenn sie so tun, als wären Sie objektorientiert, wenn Sie es nicht sind. Getter sind gut. Objektorientiert zu sein ist gut. Getter sind nicht objektorientiert. Verwenden Sie Getter, um einen sicheren Ort für die Objektorientierung zu finden.