L'uso di "questo" in Golang


12

Sulla cosa più vicina Golang ha una guida di stile trovata qui , sotto Nomi dei ricevitori questo è scritto:

Il nome del destinatario di un metodo dovrebbe riflettere la sua identità; spesso è sufficiente un'abbreviazione di una o due lettere del suo tipo (come "c" o "cl" per "Cliente"). Non usare nomi generici come "io", "questo" o "sé", identificatori tipici dei linguaggi orientati agli oggetti che pongono maggiormente l'accento sui metodi rispetto alle funzioni. Il nome non deve necessariamente essere descrittivo come quello di un argomento di metodo, in quanto il suo ruolo è ovvio e non serve a scopi documentali.

Personalmente ho sempre usato "this" come identificatore perché "this" è al centro di ciò su cui sto lavorando quando scrivo e modifico la funzione. Sembra giusto e (almeno per me) ha senso.

Se il nome non deve essere descrittivo, il suo ruolo è ovvio e non ha scopi documentali , perché l'uso di "questo" dovrebbe essere disapprovato?


3
Domanda simile con più risposte: stackoverflow.com/questions/23482068
Trenton

Risposte:


11

Dovremmo chiedere all'autore di quella guida di stile di sapere con certezza, ma penso che il motivo principale per cui sono d'accordo con lui è che la connessione tra struct e metodo è molto più libera in Go rispetto ad altre lingue .

In sostanza, quando scrivi un metodo come questo:

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

È quasi la stessa cosa che scrivere una funzione come questa:

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

L'unica differenza è una leggera modifica della sintassi nel modo in cui chiamiamo la funzione / metodo.

In altre lingue la variabile this/ self/ qualunque abbia in genere alcune proprietà speciali come essere fornita magicamente dalla lingua o avere un accesso speciale a metodi privati ​​(ricorda che Go non ha campi / metodi privati). Sebbene il "ricevitore" sia ancora in qualche modo "fornito magicamente", è così simile a un normale argomento di funzione che probabilmente non conta.

Inoltre, nei linguaggi OOP "tradizionali", tutti i metodi struct / class vengono forniti con la definizione di struct / class, in modo tale che non è possibile aggiungere altro dall'esterno. In Go, per quanto ne so, chiunque può aggiungere più metodi a qualsiasi cosa (ovviamente nell'ambito del proprio codice).

Non ho scritto abbastanza Vai a creare la mia guida di stile, ma personalmente probabilmente userei thisnei metodi definiti nello stesso file della struttura che ricevono, e qualche nome del destinatario più descrittivo sui metodi che allego a strutture da altri file .


Questa è una buona spiegazione, suppongo di essere abituato a C # e ad altri linguaggi OOP, quindi sto tornando alle convenzioni che conosco.
Adam,

1
@Adam eviterei thisse non altro per ricordare a me stesso che non sono in una lingua OOP tradizionale.
Michael Hampton,

4
Non c'è una vera differenza tra "questo" e "ricevitore" (e per favore smetti di abusare della parola "magia" - ogni caratteristica di un linguaggio di programmazione di alto livello può essere chiamata "magia", questo non rende nulla di negativo, il tuo tentativo di scegliere "questo" per essere "magico" non ha senso).
mvmn,

6

Non sono convinto da questo stile di guida e non credo che qualsiasi cosa è meglio di this, meo self. Perché this, meo selfrende libero eccellente che la variabile è un'istanza del contesto struct. Non sto dicendo che una variabile con un nome di struttura con caratteri minuscoli sia una cattiva idea, mi piace solo il modo in cui la thisrende super chiara.


senza una spiegazione, questa risposta potrebbe diventare inutile nel caso in cui qualcun altro pubblichi un'opinione opposta. Ad esempio, se qualcuno pubblica un'affermazione come "Sono convinto da questa guida di stile e penso che sia meglio di this, meo self" , in che modo questa risposta aiuterebbe il lettore a scegliere due opinioni opposte? Valuta di modificarlo in una forma migliore, per soddisfare le linee guida su Come rispondere
moscerino il

Penso di aver spiegato chiaramente cosa volevo dire.
Qian Chen,

1
Sono d'accordo. Penso che ci siano troppi cervelli avvelenati dal contesto javascript. Se lo metti da parte. Che questo si riferisca al contesto attuale è molto più semplice. E più semplice se rinominate le strutture in un secondo momento o copiate incolla parte di un'implementazione. Il gong per i brevi nomi criptici linea hl ecc. Non lo rende più facile di così.
Sentient,

0

Questo è da una prospettiva di JavaScript dove thisha un significato di parola chiave reale per il compilatore, ma dalla mia comprensione, se stanno bene con abbreviazioni di due lettere per il tipo di oggetto, dovrebbe essere abbastanza facile da usare invece. La ragione della differenza è che in un blocco abbastanza grande di codice asincrono progressivamente più profondo, potrebbe essere molto facile interpretare erroneamente cosa "questo", o il ricevitore, si trova in un contesto più profondo; ed è possibile che non sarà lo stesso oggetto.

In JavaScript, ad esempio, un modulo di controllo potrebbe avviare una finestra di dialogo e dichiarare una onLoadfunzione in linea per essa. Ma a quel punto, potrebbe essere molto facile per un altro programmatore interpretare erroneamente thisall'interno onLoadper fare riferimento al modulo di controllo, non alla finestra di dialogo; o vice versa. Ciò potrebbe essere evitato se il controllo fosse indicato come ctrle la finestra di dialogo come dg.


3
Non sono il downvoter, ma la maggior parte dei comportamenti confusi di thisin Javascript semplicemente non si applicano a Go, quindi immagino che sia per questo.
Ixrec,

@Ixrec Hm ... ok. Stavo cercando di estenderlo a situazioni in cui potevi scegliere thisil nome; per esempio, spesso i programmatori JS scriveranno var self = thisper mantenere lo stesso riferimento; ma secondo la guida alla progettazione di Go, che potrebbe avere gli stessi problemi di confusione e teoricamente dovrebbe usare un riferimento più descrittivo.
Katana314,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.