Verwendung von "dies" in Golang

12

Golang steht einem Styleguide am nächsten, der hier unter Empfängernamen zu finden ist:

Der Name des Empfängers einer Methode sollte ein Spiegelbild ihrer Identität sein. häufig genügt eine Abkürzung mit einem oder zwei Buchstaben dieses Typs (z. B. "c" oder "cl" für "Client"). Verwenden Sie keine generischen Namen wie "ich", "dies" oder "selbst", Bezeichner, die für objektorientierte Sprachen typisch sind und bei denen Methoden stärker im Vordergrund stehen als Funktionen. Der Name muss nicht so beschreibend sein wie der eines Methodenarguments, da seine Rolle offensichtlich ist und keinem dokumentarischen Zweck dient.

Ich persönlich habe immer nur "dies" als Kennung verwendet, weil "dies" der Schwerpunkt meiner Arbeit ist, wenn ich die Funktion schreibe und bearbeite. Es klingt richtig und (zumindest für mich) macht es Sinn.

Wenn der Name nicht beschreibend sein muss, seine Rolle offensichtlich ist und keinem dokumentarischen Zweck dient , warum sollte die Verwendung von "dies" verpönt werden?

Adam
quelle
3
Ähnliche Frage mit mehr Antworten: stackoverflow.com/questions/23482068
Trenton

Antworten:

11

Wir müssten den Autor dieses Styleguides fragen, um sicher zu sein, aber ich denke, der Hauptgrund, warum ich ihm zustimme, ist, dass die Verbindung zwischen Struktur und Methode in Go viel lockerer ist als in anderen Sprachen .

Wenn Sie eine Methode wie diese schreiben:

func (m *MultiShape) area() float64 {
  ...
}

Das ist fast genau das Gleiche wie das Schreiben einer solchen Funktion:

func area(m *MultiShape) float64 {
  ...
}

Der einzige Unterschied ist eine geringfügige Änderung der Syntax in der Art und Weise, wie wir die Funktion / Methode aufrufen.

In anderen Sprachen hat die Variable this/ self/ Whatever normalerweise einige spezielle Eigenschaften, z. B. die magische Bereitstellung durch die Sprache oder den besonderen Zugriff auf private Methoden (denken Sie daran, dass Go keine privaten Felder / Methoden hat). Obwohl der "Empfänger" bis zu einem gewissen Grad immer noch "magisch bereitgestellt" wird, ist er einem regulären Funktionsargument so ähnlich, dass es wohl nicht zählt.

Außerdem werden in "traditionellen" OOP-Sprachen alle struct / class-Methoden mit der struct / class-Definition geliefert, sodass von außen keine weiteren hinzugefügt werden können. Soweit ich weiß, kann in Go jeder mehr Methoden hinzufügen (natürlich im Rahmen seines eigenen Codes).

Ich habe nicht genug Go geschrieben, um meinen eigenen thisStyleguide zu erstellen , aber ich persönlich würde wahrscheinlich Methoden verwenden, die in derselben Datei wie die Struktur definiert sind, die sie erhalten, und einen aussagekräftigeren Empfängernamen für Methoden, die ich an Strukturen aus anderen Dateien anhänge .

Ixrec
quelle
Das ist eine gute Erklärung, ich bin wohl an C # und andere OOP-Sprachen gewöhnt, also kehre ich zu Konventionen zurück, die ich kenne.
Adam
1
@Adam Ich würde es thisaus keinem anderen Grund vermeiden, als mich daran zu erinnern, dass ich nicht in einer traditionellen OOP-Sprache bin.
Michael Hampton
4
Es gibt keinen wirklichen Unterschied zwischen "diesem" und "Empfänger" (und bitte hören Sie auf, das Wort "Magie" zu missbrauchen - jede Funktion einer höheren Programmiersprache kann als "Magie" bezeichnet werden. Dies macht es nicht negativ, Ihr Versuch Wählen Sie "dies", um "magisch" zu sein.
MVMN
6

Ich bin nicht von diesem Style Guide überzeugt und ich glaube nicht , alles ist besser als this, meoder self. Weil this, meoder selfmacht es super klar , dass die Variable eine Instanz der Kontext - Struktur. Ich sage nicht, dass eine Strukturvariable mit niedrigerem Gehäuse eine schlechte Idee ist, ich mag nur die Art und Weise, thisdie es super klar macht.

Qian Chen
quelle
Ohne eine Erklärung kann diese Antwort unbrauchbar werden, wenn jemand anderes eine gegenteilige Meinung vertritt. Zum Beispiel, wenn jemand Beiträge ein Anspruch wie „Ich wird von diesem Style Guide überzeugt bin und ich denke , es ist besser, als this, meoder self , wie würden Leser dieser Antwort Hilfe von zwei gegensätzlichen Meinungen zu holen? Betrachten wir bearbeiten es in eine bessere Form ing, zu treffen wie man Antwort Richtlinien
gnat
Ich glaube, ich habe klar erklärt, was ich sagen wollte.
Qian Chen
1
Genau. Ich denke, es gibt zu viele Gehirne, die durch den Javascript-Kontext vergiftet wurden. Wenn Sie das beiseite legen. Dass sich dies auf den aktuellen Kontext bezieht, ist viel einfacher. Und einfacher, wenn Sie später Strukturen umbenennen oder einen Teil einer Implementierung kopieren und einfügen. Gong für kurze kryptische Namen Zeile hl usw. macht es nicht einfacher als dies.
Sentient
0

Dies ist aus einer Perspektive von JavaScript, in thisder der Compiler eine tatsächliche Schlüsselwortbedeutung hat. Nach meinem Verständnis sollte es jedoch einfach genug sein, diese aus zwei Buchstaben für den Objekttyp zu verwenden. Der Grund für den Unterschied ist, dass es in einem anständig großen Block von zunehmend tieferem asynchronem Code sehr leicht sein kann, falsch zu interpretieren, was "dies" oder der Empfänger in einem tieferen Kontext ist; und es ist möglich, dass es nicht dasselbe Objekt ist.

In JavaScript beispielsweise kann ein Steuermodul einen Dialog starten und eine onLoadFunktion inline dafür deklarieren . Zu diesem Zeitpunkt kann es für einen anderen Codierer sehr leicht sein, das thisInnere falsch zu interpretieren onLoad, um auf das Steuermodul und nicht auf den Dialog zu verweisen. oder umgekehrt. Dies könnte vermieden werden, wenn das Steuerelement als ctrlund der Dialog als bezeichnet würden dg.

Katana314
quelle
3
Ich bin nicht der Downvoter, aber die meisten verwirrenden Verhaltensweisen thisin Javascript gelten einfach nicht für Go. Ich vermute, deshalb.
Ixrec
@Ixrec Hm ... okay. Ich habe versucht, es auf Situationen auszudehnen, in denen man den thisNamen wählen konnte ; Beispielsweise schreiben JS-Codierer häufig var self = this, um dieselbe Referenz beizubehalten. Laut Go's Design Guide könnte dies dann die gleichen Verwirrungsprobleme haben und sollte theoretisch eine aussagekräftigere Referenz verwenden.
Katana314