Ist es in einem Anti-Pattern, immer get und set-Methoden zu verwenden, um auf die Member-Felder einer Klasse zuzugreifen? [Duplikat]

8

In Java-Klassen wird es als gut oder schlecht angesehen, auf Mitgliederfelder mit ihren Getter und Setter zuzugreifen?

z. B. was ist besser:

%Vor%

Im Allgemeinen denke ich, dass der direkte Zugriff auf das Feld aufgrund des KISS-Prinzips am besten ist, und jemand kann die get-Methode später mit unvorhersehbaren Ergebnissen überschreiben.

Aber meine Kollegen argumentieren, dass es besser ist, eine Abstraktionsschicht beizubehalten. Gibt es einen Konsens darüber?

    
Pablojim 07.07.2009, 21:41
quelle

11 Antworten

7

Das Kernproblem hier ist, dass der direkte Feldzugriff nicht zum Abfangen durch von Unterklassen überschriebene Methoden, AOP, dynamische Proxies und dergleichen geeignet ist. Dies kann je nach Fall gut oder schlecht sein. Ich würde sagen, dass die Verwendung von Getter und Setter intern kein Anti-Pattern oder Pattern ist. Es ist eine gute oder schlechte Sache, abhängig von der Situation und dem Design Ihrer Klasse.

    
Jherico 07.07.2009, 21:53
quelle
9

Ehrlich gesagt hängt es meiner Meinung nach davon ab, wofür Sie es verwenden. Im Zweifelsfall belasse ich diese zusätzliche Abstraktionsstufe immer dort, falls ich sie später in einer Unterklasse überschreiben muss. Viele Male bin ich vor dem Schmerz bewahrt worden, eine Klasse umzuschreiben, nur weil ich einen Getter oder einen Setter offen gelassen habe, um ihn zu überschreiben.

Eine andere Sache ist, dass andere Clients / Programmierer möglicherweise Ihre Klasse in einer Weise verwenden müssen, an die Sie noch nicht gedacht haben, zum Beispiel, indem Sie die Agreement-Klasse aus einer Datenbank herausziehen. In diesem Fall haben Sie es, wenn sie Ihre Klasse außer Kraft setzen, für sie (oder möglicherweise auch für Sie) schmerzlos gemacht, zu modifizieren, wie diese Daten abgerufen werden.

Wenn Sie also nicht absolut sicher sind, dass es nur eine Möglichkeit gibt, auf dieses Feld zuzugreifen, und dass es zu 100% direkt ist, ist es wahrscheinlich am besten, das Abrufen und Ändern von Werten zu entkoppeln, damit Sie sich zu einem späteren Zeitpunkt retten können Härte umschreiben.

    
Zachary Murray 07.07.2009 21:47
quelle
7

Ich denke, dass die öffentliche Schnittstelle einer Klasse die Verkapselung um den Zustand darstellt und daher auch die anderen Funktionen der Klasse von dieser Verkapselung profitieren.

Wenn Sie ein Feld in eine public get Methode gepackt haben, gibt es einen Grund, warum Sie das getan haben. Vielleicht gibt es in dieser Methode Logik, um das Feld zu laden oder einen Audit-Trail bereitzustellen. Was auch immer der Grund für die Methode ist, Ihre Klasse wird diese Logik wahrscheinlich auch brauchen.

    
Andrew Hare 07.07.2009 21:42
quelle
4

Es klingt für mich so, als würden einige Leute diese Frage so interpretieren, als ob es um Getter und Setter geht, die extern benutzt werden; Meine Interpretation von Pablojims Frage war, dass es darum geht, sie innerhalb der Klasse zu verwenden, im Gegensatz zu der Klasse, die direkt auf ihre Felder zugreift. (Welche sind privat.)

In diesem Licht bin ich mit Jherico und Patros; Verwenden Sie direkten Zugriff innerhalb der Klasse, es sei denn, es gibt einen Grund dafür.

    
lumpynose 07.07.2009 22:08
quelle
2

Eine Schicht Abstraktion ist in Java eine gute Sache.

Das Problem ist, dass der gesamte Code, der direkt auf Ihre Membervariablen zugreift, ohne dass die Klasse dies bemerkt, nicht unter der Kontrolle Ihrer Klasse steht.

Wenn Sie also entscheiden, Ihre Klasse so zu bearbeiten, dass ein Mitglied, das in einer Abteilung als Beispiel verwendet wird, niemals 0 sein soll, müssen Sie sicherstellen können, dass dieser Wert nur so geändert wird, dass dies gewährleistet ist . Sie würden also einen Setter für diese Methode hinzufügen und das Mitglied in "Privat" ändern. Aber jetzt müssen Sie den gesamten Code, der auf das Mitglied zugreift, ohne den Setter ändern.
Wenn Sie wissen, dass Sie den Wert von außerhalb der Klasse ändern und nur dann einen Setter bereitstellen, wenn Sie nicht wissen, machen Sie die Variable privat und wenn Sie später Zugriff benötigen, können Sie einen Getter oder Setter bereitstellen.

Er erhält ein Anti-Pattern, wenn es bestimmte Methoden in anderen Objekten gibt, die get immer für ein Member verwenden, dann einige Berechnungen durchführt und dann get verwendet. Dies zeigt, dass entweder das Mitglied in der anderen Klasse sein sollte oder dass die Methode in dieser Klasse sein muss.

Ein Getter und ein Setter zu haben, ohne darüber nachzudenken, für jedes Mitglied bricht die Kapselung und ist keine gute Design-Wahl. Für mehr Innenseiten lesen Sie diesen Artikel

    
Janusz 07.07.2009 21:45
quelle
1

Ich arbeite jetzt an etwas, das mich zu den Gettern macht: Wir verlegen jetzt einen Teil unserer Eigenschaften in eine "Eigentumstasche", was bedeutet, dass Sie nicht einfach auf die Variable verweisen können. Also müssen wir nicht nur den Getter ändern, sondern auch alle Orte ändern, die auf diese Variable verweisen. Es ist etwas zu beachten.

    
Tamar 07.07.2009 21:51
quelle
0

Damit es ein Anti-Pattern ist, müsste es entschieden schädlich sein. Ich sehe nicht, wie es möglicherweise etwas schaden kann, Getter und Setter zu definieren. Es ist höchstens eine Verschwendung von Zeit (und Tipparbeit), die es sinnlos macht, aber kein Antipattern.

    
jalf 07.07.2009 21:44
quelle
0

Es hängt davon ab, wofür Sie Ihre Getter und Setter verwenden. Im Allgemeinen benutze ich sie, wenn ich überprüfen muss, ob Daten in eine Klasse kommen oder Daten formatieren, die ausgehen. In dieser Hinsicht verwende ich Getter und Setter wirklich als Interface-Layer zwischen dieser Klasse und anderen Klassen, die möglicherweise Zugriff auf ihre Daten benötigen.

Ich tendiere dazu, meinen internen Code so zu schreiben, dass er weiß, wie man mit privaten Daten für diese Klasse umgeht, so dass der Zugriff mit eigenen Getter und Setter im Allgemeinen unnötig und unerwünscht ist.

Es hängt jedoch alles davon ab, wie Sie Ihre Getter und Setter verwenden.

    
Bob Somers 07.07.2009 21:48
quelle
0

Meine Faustregel ist, dass, wenn sie etwas Komplexeres tun, als nur den Wert zu setzen oder zurückzugeben, die Setzer / Getter verwenden. Andernfalls wird es nicht benötigt, da Sie Probleme beheben können, die durch Änderungen an den Membervariablen verursacht werden.

    
patros 07.07.2009 21:49
quelle
0

Sie haben recht damit, dass es lästig ist, all diese zusätzliche Arbeit für jede Attributvariable zu tun. Warum erlaubt die Sprache etwas so Grundlegendes, dass niemand es tut? Es gibt jedoch zwingende Gründe dafür, keinen direkten Attributzugriff zuzulassen.

Ich bevorzuge Eiffels Unified Access Prinzip. Sie können einem Attribut niemals zuweisen, und auf Attribute und Funktionen wird auf die gleiche Weise zugegriffen:

%Vor%     
clemahieu 07.07.2009 22:06
quelle
0

Ich denke, das ist etwas, das von Fall zu Fall betrachtet werden muss. Die Verwendung eines Getters im gesamten Klassencode macht es komplizierter und macht es wahrscheinlich etwas langsamer. Es ist jedoch auch erweiterbar und wiederverwendbar.

Was ich normalerweise getan habe, ist den Getter zu benutzen, wenn ich irgendeinen Grund, warum jemand meinen Getter mit einem anderen überschreiben will, vorhersehen kann. Wenn es etwas so einfaches und einfaches ist, dass es keinen Sinn ergibt, verwende ich im Allgemeinen keine Getter.

Wenn Sie Ihren Code schreiben, um auf die Variablen ohne den Getter zuzugreifen, sollten Sie erwägen, die Getter-Funktion "final" zu machen. Auf diese Weise wird niemand versuchen, deinen Code außer Kraft zu setzen und sich die Haare auszureißen und sich zu wundern, warum es nicht funktioniert. (Beachten Sie, dass Spring- und Hibernate-Proxys dies möglicherweise zu einer schlechten Idee machen.)

    
Grimarr 09.07.2009 03:26
quelle

Tags und Links