Utilisation de «ceci» à Golang

12

Sur ce qui se rapproche le plus de Golang, un guide de style se trouve ici , sous Receiver Names, il est écrit:

Le nom du récepteur d'une méthode doit refléter son identité; souvent une abréviation d'une ou deux lettres de son type suffit (comme "c" ou "cl" pour "Client"). N'utilisez pas de noms génériques tels que "moi", "ceci" ou "soi", identificateurs typiques des langages orientés objet qui mettent davantage l'accent sur les méthodes que sur les fonctions. Le nom n'a pas besoin d'être aussi descriptif que celui d'un argument de méthode, car son rôle est évident et ne sert à rien de documentaire.

Personnellement, j'ai toujours utilisé "this" comme identifiant car "this" est au centre de ce sur quoi je travaille lorsque j'écris et édite la fonction. Cela semble juste et (pour moi au moins) cela a du sens.

Si le nom n'a pas besoin d'être descriptif, son rôle est évident et il ne sert à rien de documentaire , pourquoi l'utilisation de "ceci" serait-elle mal vue?

Adam
la source
3
Question similaire avec plus de réponses: stackoverflow.com/questions/23482068
Trenton

Réponses:

11

Nous devrions demander à l'auteur de ce guide de style de le savoir avec certitude, mais je pense que la principale raison pour laquelle je suis en quelque sorte d'accord avec lui est que la connexion entre struct et méthode est beaucoup plus lâche dans Go que dans d'autres langues .

En substance, lorsque vous écrivez une méthode comme celle-ci:

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

C'est presque exactement la même chose que d'écrire une fonction comme celle-ci:

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

La seule différence est un léger changement de syntaxe dans la façon dont nous appelons la fonction / méthode.

Dans d'autres langues, la variable this/ self/ quelle que soit la variable possède généralement des propriétés spéciales, comme être fournie magiquement par le langage ou avoir un accès spécial à des méthodes privées (rappelez-vous que Go n'a pas de champs / méthodes privés). Bien que le "récepteur" soit toujours "magiquement fourni" dans une certaine mesure, il est tellement similaire à un argument de fonction régulière qu'il ne compte sans doute pas.

De plus, dans les langages POO "traditionnels", les méthodes struct / classe sont toutes fournies avec la définition struct / class, de sorte qu'aucune autre ne peut être ajoutée de l'extérieur. Dans Go, pour autant que je sache, n'importe qui peut ajouter plus de méthodes à n'importe quoi (dans le cadre de son propre code, bien sûr).

Je n'ai pas assez écrit Go pour créer mon propre guide de style, mais personnellement, j'utiliserais probablement des thisméthodes définies dans le même fichier que la structure qu'ils reçoivent, et un nom de récepteur plus descriptif sur les méthodes que j'attache aux structures d'autres fichiers .

Ixrec
la source
C'est une bonne explication, je suppose que je suis habitué au C # et à d'autres langages OOP, donc je reviens aux conventions que je connais.
Adam
1
@Adam j'éviterais thissi pour aucune autre raison que de me rappeler que je ne suis pas dans une langue OOP traditionnelle.
Michael Hampton
4
Il n'y a pas de réelle différence entre "ceci" et "récepteur" (et s'il vous plaît, arrêtez d'abuser du mot "magie" - chaque fonctionnalité d'un langage de programmation de haut niveau peut être appelée "magie", cela ne fait rien de négatif, votre tentative de choisir "ceci" pour être "magique" n'a aucun sens).
mvmn
6

Je ne suis pas convaincu par ce guide de style et je ne pense pas que quelque chose soit meilleur que this, meou self. Parce que this, meou selfrend très clair que la variable est une instance de la structure de contexte. Je ne dis pas qu'une variable de nom de structure en casse inférieure est une mauvaise idée, j'aime juste la façon qui la thisrend super claire.

Qian Chen
la source
sans explication, cette réponse peut devenir inutile au cas où quelqu'un d'autre posterait une opinion contraire. Par exemple, si quelqu'un publie une affirmation comme "Je suis convaincu par ce guide de style et je pense que c'est mieux que this, meou self" , comment cette réponse aiderait-elle le lecteur à choisir entre deux opinions opposées? Pensez à le modifier sous une meilleure forme, afin de respecter les directives de réponse
gnat
Je pense avoir clairement expliqué ce que je voulais dire.
Qian Chen
1
Je suis d'accord. Je pense qu'il y a trop de cerveaux empoisonnés par le contexte javascript. Si vous mettez cela de côté. Que cela se réfère au contexte actuel est beaucoup plus simple. Et plus facile si vous renommez des structures plus tard ou copiez-collez une partie d'une implémentation. Gong pour la ligne hl etc des noms cryptiques courts ne facilite pas les choses.
Sentient
0

C'est du point de vue de JavaScript où thisle mot-clé a une signification réelle pour le compilateur, mais d'après ce que je comprends, s'ils acceptent les abréviations à deux lettres pour le type d'objet, il devrait être assez facile de l'utiliser à la place. La raison de la différence est que dans un bloc de code asynchrone de plus en plus profond, il pourrait être très facile de mal interpréter ce que "ceci", ou le récepteur, est dans un contexte plus profond; et il est possible que ce ne soit pas le même objet.

En JavaScript par exemple, un module de contrôle peut démarrer une boîte de dialogue et déclarer une onLoadfonction en ligne pour cela. Mais à ce stade, il pourrait être très facile pour un autre codeur de mal interpréter l' thisintérieur onLoadpour se référer au module de contrôle, pas au dialogue; ou vice versa. Cela pourrait être évité si le contrôle était appelé ctrlet la boîte de dialogue dg.

Katana314
la source
3
Je ne suis pas le downvoter, mais la plupart des comportements déroutants de thisJavascript ne s'appliquent tout simplement pas à Go, donc je suppose que c'est pourquoi.
Ixrec
@Ixrec Hm ... d'accord. J'essayais de l'étendre à des situations où vous pouviez choisir thisle nom de; par exemple, les codeurs JS écrivent souvent var self = thispour conserver la même référence; mais selon le guide de conception de Go, cela pourrait alors avoir les mêmes problèmes de confusion, et devrait théoriquement utiliser une référence plus descriptive.
Katana314