16

Was ist der Vorteil von this/self/me Zeiger obligatorisch explizit?Was hat den Vorteil, dass dieser/self -Zeiger explizit explizit ist?

Nach der Theorie OOP soll eine Methode hauptsächlich (nur?) Auf Membervariablen und Methodenargumenten funktionieren. Danach sollte es einfacher sein auf Elementvariablen als auf externe Variablen (vom Objekt der Seite der Ansicht) Variablen zu verweisen ... Explizit this macht es ausführlicher so härter, um auf Elementvariablen als auf externe Variablen beziehen. Das scheint mir widersinnig zu sein.

Antwort

19

Neben Membervariablen und Methodenparametern haben Sie auch lokale Variablen. Eines der wichtigsten Dinge über das Objekt ist sein interner Zustand. Durch die explizite Dereferenzierung von Membervariablen wird deutlich, wo Sie auf diesen Status verweisen und wo Sie diesen Status ändern.

Zum Beispiel, wenn Sie Code haben wie:

someMethod(some, parameters) { 
    ... a segment of code 
    foo = 42; 
    ... another segment of code 
} 

wenn schnell durch Surfen, Sie haben ein mentales Modell der Variablen in dem vorhergehenden Segment definiert haben zu wissen, ob es nur eine temporäre Variable ist oder Verändert es den Objektstatus? Während this.foo = 42 zeigt, dass der Objektstatus mutiert ist. Und wenn explizit explizite Dereferenzierung verwendet wird, können Sie sicher sein, dass die Variable im umgekehrten Fall temporär ist.

Kürzere, gut durchdachte Methoden machen es ein bisschen weniger wichtig, aber dennoch, langfristige Verständlichkeit trumpft ein wenig Bequemlichkeit beim Schreiben des Codes.

+2

Ergo, "Code Lesbarkeit". –

+0

Es ist nützlich, wenn ein Scoping-Problem auftritt (ein lokal beschränkter foo wird die Klassenmitgliedsvariable foo verbergen), aber unter Berücksichtigung von Kommentaren von OP woanders ist es nicht zwingend erforderlich, nur praktisch. –

+0

Ich brauche auch ein "mentales Modell", um zu wissen, ob ich innerhalb eines "if" oder "while" bin; Warum stellen wir nicht alle diese Befehle mit diesen Informationen voran? – einpoklum

3

Was ist, wenn die Argumente einer Methode den gleichen Namen wie die Membervariablen haben? Dann können Sie zum Beispiel this.x = x verwenden. Dabei ist this.x die Elementvariable und x ist das Methodenargument. Das ist nur ein (triviales) Beispiel.

+1

Ich habe das Wort "obligatorisch" hinzugefügt, weil ich danach gefragt habe. –

3

Sie benötigen es, um den Zeiger/Verweis auf das aktuelle Objekt an anderer Stelle weiterzuleiten oder um es vor einer Selbstzuweisung in einem Zuweisungsoperator zu schützen.

+0

Ich habe das Wort "obligatorisch" hinzugefügt, weil ich danach gefragt habe. –

2

ich verwende in der Regel dieses (in C++) nur dann, wenn ich schreibe den Zuweisungsoperator oder Copykonstruktor wie es in hilft deutlich die Variablen zu identifizieren. Anderer Ort, an dem ich es verwenden kann, ist, wenn die Variablennamen Ihrer Funktionsparameter die gleichen wie die Namen Ihrer Mitgliedsvariablen sind oder ich mein Objekt mit löschen möchte, löschen Sie diese.

+0

Ist es nur ich oder ruft das "Löschen" wirklich falsch? –

+0

im Allgemeinen ist es eine schlechte Idee..aber Sie möchten in einigen Fällen wie ein Referenzobjekt zu tun. – Naveen

+0

Sie haben bei einem Objekt mit Referenzzählung keine andere Wahl, wenn Sie die Aktion "Zähler dekrementieren, Wert prüfen und ggf. löschen" als eine einzige Methode verwenden möchten. – sharptooth

1

Eg wäre, wo Mitgliedsnamen gleich sind wie diejenigen Methode übergeben

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault) 
     { 
      this.screenTemplateID = screenTemplateID; 
      this.screenTemplateName = screenTemplateName; 
      this.isDefault = isDefault; 
     } 
4

Wenn Sie sprechen über „explicit self“ im Sinne von Python, hier ist ein interesting discussion zum Thema. Hier ist Guido responding zu Bruce Eckel's article. Die Kommentare zu Bruce Artikel sind ebenfalls aufschlussreich (einige davon jedenfalls).

+0

Sehr gute Verbindung. Vielen Dank. –

+0

Gern geschehen. –