Wie würden Sie Objekteigenschaften von innerhalb einer Objektmethode?

stimmen
81

Was ist die „puristische“ oder „richtige“ Art und Weise die Eigenschaften eines Objekts innerhalb einer Objektmethode zuzugreifen, die nicht ein Getter / Setter-Methode ist?

Ich weiß von außerhalb des Objekts, dass Sie einen Getter / Setter verwenden sollten, sondern von innen würden Sie gerade tun:

Java:

String property = this.property;

PHP:

$property = $this->property;

oder würden Sie tun:

Java:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

Verzeihen Sie mir, wenn meine Java ein wenig aus ist, ist es ein Jahr her, dass ich in Java programmiert ...

BEARBEITEN:

Es scheint, die Menschen gehen davon aus ich spreche über private oder geschützte Variablen / Eigenschaften nur. Als ich OO gelernt wurde ich gelehrt Getter / Setter für jede einzelne Eigenschaft zu verwenden, selbst wenn sie öffentlich war (und eigentlich war mir nie gesagt, jede Variable / Eigenschaft öffentlich zu machen). So kann ich von einer falschen Annahme, Anfahren aus dem Stand heraus. Es scheint, dass die Menschen diese Frage zu beantworten vielleicht sagen, dass Sie öffentliche Eigenschaften und dass diese nicht brauchen Getter und Setter, das geht gegen das, was ich wurde gelehrt haben sollte und was ich sprach, obwohl es vielleicht, die diskutiert werden muss, wie Gut. Das ist wahrscheinlich ein gutes Thema für eine andere Frage aber ...

Veröffentlicht am 01/08/2008 um 17:10
quelle vom benutzer
In anderen Sprachen...                            


18 antworten

stimmen
58

Diese religiöse Kriegspotential hat, aber es scheint mir , dass , wenn Sie einen Getter / Setter verwenden, können Sie es sowohl intern als auch nutzen sollten - sowohl verwendet , wird auf dem Weg zu Wartungsproblemen führen (zB jemand fügt Code in einen Setter , die benötigt jedes Mal ausgeführt wird, dass das Eigentum gesetzt und die Eigenschaft festgelegt wird intern w / o dieser Setter) genannt wird.

Beantwortet am 01/08/2008 um 17:13
quelle vom benutzer

stimmen
41

Persönlich fühle ich mich wie es wichtig ist, im Einklang zu bleiben. Wenn Sie Getter und Setter haben, sie verwenden. Das einzige Mal, dass ich ein Feld zugreifen würde direkt ist, wenn die Accessor viel Overhead hat. Es kann sich wie Sie Ihren Code unnötig sind Blähungen, aber es kann sicherlich eine ganze Menge Kopfschmerzen in der Zukunft retten. Das klassische Beispiel:

Später können Sie wünschen, die Art und Weise zu verändern, dass Feld arbeitet. Vielleicht sollte es on-the-fly berechnet werden oder vielleicht möchten Sie eine andere Art für den Sicherungsspeicher verwenden. Wenn Sie Eigenschaften direkt zugreifen, wie eine Änderung, dass kann eine Menge von Code in einem Seegang foop brechen.

Beantwortet am 01/08/2008 um 19:23
quelle vom benutzer

stimmen
25

Ich bin ziemlich überrascht, wie einig sich die Stimmung ist , dass gettersund Setter sind fein und gut. Ich schlage vor , den Brand Artikel von Allen Holub „ Getter und Setter sind böse “. Zugegeben, das ist der Titel für Schockwert, aber der Autor macht gültige Punkte.

Im Wesentlichen , wenn Sie gettersund settersfür jeden einzelnen privaten Bereich, können Sie diese Felder so gut wie öffentlich machen. Sie würden sehr werden bedrängten den Typ eines privaten Feld zu jeder Klasse ohne Wellen - Effekte zu ändern, dass Anrufe getter.

Darüber hinaus ist aus einer streng OO Sicht sollten Objekte Nachrichten (Methoden), die um ihre (hoffentlich) Einzel Verantwortung entsprechen reagiert werden. Die überwiegende Mehrheit gettersund setterskeinen Sinn für ihre konstituierenden Objekte machen; Pen.dispenseInkOnto(Surface)als macht mir mehr Sinn Pen.getColor().

Getter und Setter ermutigen auch Anwender der Klasse das Objekt für einige Daten zu bitten, eine Berechnung durchführen, und dann einen anderen Wert in dem Objekt festgelegt, besser als prozeduralen Programmierung bekannt. Sie würden besser gedient, einfach das Objekt zu sagen , zu tun , was Sie in erster Linie würden; auch bekannt als die Informationen Expert Idiom.

Getter und Setter sind jedoch notwendiges Übel an der Grenze der Schichten - UI, Persistenz, und so weiter. Eingeschränkter Zugriff auf die Interna der Klasse, wie zum Beispiel C ++ 's Freund Stichwort, Java - Paket geschützten Zugang, den internen Zugriff .NET und der Freund der Klasse Pattern kann Ihnen helfen, die Sichtbarkeit zu reduzieren gettersund Setter nur diejenigen , die sie benötigen.

Beantwortet am 19/09/2008 um 01:13
quelle vom benutzer

stimmen
18

Es hängt davon ab, wie die Eigenschaft verwendet wird. Zum Beispiel, sagen Sie einen Student Objekt, das einen Namen Eigenschaft hat. Sie könnten Ihre Get-Methode verwenden Sie den Namen aus der Datenbank zu ziehen, wenn es bereits abgerufen worden ist. So können Sie reduzieren unnötige Anrufe auf die Datenbank.

Lassen Sie sich jetzt sagen, Sie einen privaten Integer-Zähler in Ihrem Objekt haben, das zählt, wie oft der Name aufgerufen wurde. Sie können nicht wollen, aus dem Inneren des Objekts die Get-Methode verwenden, da es eine ungültige Zahl erzeugen würde.

Beantwortet am 01/08/2008 um 17:19
quelle vom benutzer

stimmen
13

PHP bietet eine Vielzahl von Möglichkeiten, einschließlich der magischen Methoden zu behandeln __getund __set, aber ich ziehe es explizit Getter und Setter. Hier ist der Grund:

  1. Die Validierung kann in Setter (und Getter für diese Angelegenheit) gestellt werden
  2. Intellisense arbeitet mit expliziten Methoden
  3. Keine Frage, ob eine Eigenschaft nur gelesen wird, nur schreiben oder Lese-Schreib
  4. Abrufen von virtuellen Eigenschaften (dh berechnete Werte) die gleichen wie regelmäßige Eigenschaften aussehen
  5. Sie können ganz einfach ein Objekt-Eigenschaft, die eigentlich nie irgendwo definiert, die dann ohne Papiere geht
Beantwortet am 24/09/2008 um 18:24
quelle vom benutzer

stimmen
12

Bin ich hier nur über Bord?

Vielleicht ;)

Ein anderer Ansatz wäre, eine private / geschützte Methode zu verwenden, um tatsächlich das zu tun bekommen (Caching / db / etc) und ein öffentlicher Wrapper für es, das erhöht die Zählung:

PHP:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

und dann von innerhalb des Objekts selbst:

PHP:

$name = $this->_getName();

Auf diese Weise können Sie immer noch das erste Argument für etwas anderes nutzen (wie einen Flag für das Senden, ob nicht im Cache gespeicherten Daten hier vielleicht gewöhnungs).

Beantwortet am 01/08/2008 um 17:43
quelle vom benutzer

stimmen
11

Ich muss den Punkt hier fehlt, warum sollten Sie einen Getter innerhalb eines Objekts verwenden, um eine Eigenschaft des Objekts zugreifen?

Vor diesem Hintergrund die Getter zu Ende sollte einen Getter nennen, die einen Getter nennen sollte.

Also würde ich innerhalb einer Objektmethode Zugriff sagen, ein Objekt direkt, vor allem da eine andere Methode in diesem Objekt aufgerufen wird (was nur die Eigenschaft zugreifen direkt sowieso dann zurück) ist nur eine sinnlose, verschwenderisch Übung (oder habe ich die Frage falsch verstanden ).

Beantwortet am 04/06/2011 um 16:42
quelle vom benutzer

stimmen
7

Ich würde sagen, es ist besser, die Zugriffsmethoden auch innerhalb des Objekts zu verwenden. Hier sind die Punkte, die sofort zu meinem Sinn kommen:

1) Es sollte im Interesse der Aufrechterhaltung Konsistenz bei Zugriffen außerhalb des Objekts gemacht erfolgen.

2) In einigen Fällen könnten diese Accessormethoden mehr tun, als nur das Feld zuzugreifen; sie könnten (obwohl seine seltenen) einige zusätzliche Verarbeitung tun. Wenn dies der Fall ist, indem Sie das Feld Zugriff direkt würden Sie fehlen heraus, dass eine zusätzliche Verarbeitung und Ihr Programm schief gehen könnte, wenn diese Verarbeitung immer während dieser Zugriffe durchgeführt werden

Beantwortet am 20/01/2010 um 09:32
quelle vom benutzer

stimmen
7

Die puristische OO Weise ist sowohl zu vermeiden und die Folgen Gesetz von Demeter durch die Verwendung der nicht Sagen Sie fragen Ansatz.

Anstatt den Wert der Eigenschaft des Objekts erhalten, die eng Paare die zwei Klasse, das Objekt als Parameter zB verwenden

  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }

Wo das Hotel war ein nativer Typ, zB int, verwenden Sie eine Zugriffsmethode, nennen Sie es für Problemdomäne nicht die Programmierung Domäne.

  doSomethingWithProperty( this.daysPerWeek() ) ;

Diese ermöglicht es Ihnen, Verkapselung und keine post-Bedingungen oder abhängig Invarianten zu halten. Sie können auch die Setter-Methode verwenden, um alle Vorbedingungen oder abhängig Invarianten zu halten, jedoch fallen nicht in die Falle sie Setter zu benennen, auf die Hollywood-Prinzip gehen Sie zurück zur Benennung, wenn das Idiom verwenden.

Beantwortet am 24/09/2008 um 18:04
quelle vom benutzer

stimmen
7

Wenn von „Purist“ meinen Sie „die meisten Kapselung“, dann in der Regel erkläre ich alle meine Felder als private und verwenden Sie dann this.field aus der Klasse selbst, sondern auch alle anderen Klassen, einschließlich Unterklassen, mit Zugang Instanz Zustand der Getter.

Beantwortet am 22/08/2008 um 12:15
quelle vom benutzer

stimmen
6

Es kommt darauf an. Es ist mehr ein Stil Problem als alles andere, und es gibt keine feste Regel.

Beantwortet am 01/10/2008 um 11:51
quelle vom benutzer

stimmen
6

Wenn ich nicht die Eigenschaft bearbeiten werde ich eine verwende get_property()öffentliche Methode , wenn es in diesem Fall in einem anderen Objekt einen besonderen Anlass wie ein MySQLi Objekt ist werde ich öffentlich nur Eigentum und bezeichnen es als $obj->object_property.

Im Inneren des Objekts ist es immer $ this-> Eigenschaft für mich.

Beantwortet am 22/08/2008 um 12:34
quelle vom benutzer

stimmen
6

Private Felder mit öffentlichen oder geschützten Eigenschaften. Der Zugriff auf die Werte soll die Eigenschaften durchlaufen und auf eine lokale Variable kopiert werden, wenn sie mehr als einmal in einem Verfahren verwendet werden. Wenn und nur wenn Sie den Rest Ihrer Anwendung haben so völlig gezwickt, geschaukelt aus, und sonst optimiert, wo Werte zugreifen, indem sie durch ihre assosciated Eigenschaften gehen hat zu einem Engpass werden (Und das wird nie passieren, das garantiere ich) sollten Sie einmal ansatz zu prüfen, etwas im Stich gelassen andere als direkt die Eigenschaften ihrer Träger Variablen berühren.

.NET-Entwickler können die automatischen Eigenschaften verwenden, um dies zu erzwingen, da Sie nicht einmal die Unterstützung Variablen zur Entwurfszeit sehen können.

Beantwortet am 18/08/2008 um 18:43
quelle vom benutzer

stimmen
6

Ich habe mit Setter gefunden / Getter aus meinem Code leichter zu lesen. Ich mag auch die Kontrolle es gibt, wenn andere Klassen die Methoden verwenden, und wenn ich die Daten ändern die Eigenschaft speichern.

Beantwortet am 18/08/2008 um 18:37
quelle vom benutzer

stimmen
6

Ich kann falsch sein, weil ich Autodidakt bin, aber ich habe nie Benutzer öffentliche Eigenschaften in meinen Java-Klassen, sie sind immer privat oder geschützt, so dass außerhalb Code von Getter / Setter zugreifen muß. Es ist besser für die Wartung / Änderung Zwecke. Und innerhalb der Klasse Code ... Wenn Getter-Methode trivial ist verwende ich das Hotel direkt, aber ich benutze immer die Setter-Methoden, weil ich einfach Code hinzufügen könnte Ereignisse auszulösen, wenn ich will.

Beantwortet am 06/08/2008 um 15:43
quelle vom benutzer

stimmen
5

Ich mag die Antwort von cmcculloh , aber es scheint , als ob die korrekteste die Antwort ist Greg Hurlman . Verwenden Sie Getter / Setter die ganze Zeit , wenn Sie mit ihnen aus dem getgo gestartet und / oder verwendet werden , um mit ihnen zu arbeiten.

Als Nebenwirkung, finde ich persönlich, dass unter Verwendung von Getter / Setter der Code einfacher macht später zu lesen und zu debuggen.

Beantwortet am 15/09/2008 um 10:46
quelle vom benutzer

stimmen
5

Nun, es scheint mit C # 3.0 Eigenschaften Default-Implementierung wird die Entscheidung für Sie getroffen; Sie haben die Eigenschaft, mit der (möglicherweise privat) Eigenschaft Setter einzustellen.

Ich persönlich benutze nur die privaten Mitglieds hinter sich, wenn nicht so das Objekt in einem weniger als wünschenswerten Zustand zu fallen, würde dazu führen, tun, wie zum Beispiel bei der Initialisierung oder beim Caching / träges Laden beteiligt ist.

Beantwortet am 01/08/2008 um 17:56
quelle vom benutzer

stimmen
4

Wie in einigen Kommentaren angegeben: Manchmal sollten Sie, manchmal sollten Sie nicht. Der große Teil über private Variablen ist, dass Sie in der Lage sind alle Orte, um zu sehen, sie verwendet werden, wenn Sie etwas ändern. Wenn Ihr Getter / Setter etwas tut, die Sie benötigen, verwenden Sie es. Wenn es keine Rolle Sie entscheiden.

Der umgekehrte Fall könnte das gemacht werden, wenn Sie die Getter / Setter und jemand ändert die Getter / Setter sie alle Orte, zu analysieren, haben die Getter und Setter verwendet wird intern, um zu sehen, ob es etwas nach oben vermasselt.

Beantwortet am 01/08/2008 um 18:01
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more