Uso de "isto" em Golang

12

Na coisa mais próxima que Golang tem de um guia de estilos encontrado aqui , em Nomes de Receptores, está escrito:

O nome do destinatário de um método deve refletir sua identidade; geralmente é suficiente uma abreviação de uma ou duas letras do tipo (como "c" ou "cl" para "Cliente"). Não use nomes genéricos como "me", "this" ou "self", identificadores típicos de linguagens orientadas a objetos que dão mais ênfase aos métodos e não às funções. O nome não precisa ser tão descritivo quanto o de um argumento de método, pois seu papel é óbvio e não serve para nenhum propósito documental.

Pessoalmente, sempre usei "this" como identificador, porque "this" é o foco do trabalho em que escrevo e edito a função. Parece certo e (pelo menos para mim) faz sentido.

Se o nome não precisa ser descritivo, seu papel é óbvio e não serve para nenhum propósito documental , por que o uso de "isso" seria menosprezado?

Adão
fonte
3
Pergunta semelhante com mais respostas: stackoverflow.com/questions/23482068
Trenton

Respostas:

11

Teríamos que pedir ao autor desse guia de estilo para ter certeza, mas acho que o principal motivo pelo qual concordo com ele é que a conexão entre struct e método é muito mais frouxa no Go do que em outros idiomas .

Em essência, quando você escreve um método como este:

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

Isso é quase exatamente a mesma coisa que escrever uma função como esta:

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

A única diferença é uma ligeira mudança de sintaxe na forma como chamamos a função / método.

Em outros idiomas, a variável this/ self/ qualquer que seja, normalmente possui algumas propriedades especiais, como magicamente fornecidas pelo idioma ou ter acesso especial a métodos privados (lembre-se de que o Go não possui campos / métodos privados). Embora o "receptor" ainda esteja sendo "fornecido magicamente" até certo ponto, é tão semelhante a um argumento de função regular que, sem dúvida, não conta.

Além disso, nas linguagens OOP "tradicionais", todos os métodos struct / class 'vêm com a definição struct / class, de forma que não mais podem ser adicionados de fora. No Go, até onde eu sei, alguém pode adicionar mais métodos a qualquer coisa (dentro do escopo de seu próprio código, é claro).

Ainda não escrevi o suficiente sobre Go para criar meu próprio guia de estilo, mas, pessoalmente, provavelmente usaria thismétodos definidos no mesmo arquivo que a estrutura que recebem e algum nome mais descritivo do receptor nos métodos que anexo às estruturas de outros arquivos. .

Ixrec
fonte
Essa é uma boa explicação, suponho que estou acostumado a C # e outras linguagens OOP, portanto, estou voltando às convenções que conheço.
Adam
1
@ Adam Eu evitaria thisse por nenhuma outra razão senão me lembrar que não estou em um idioma tradicional de POO.
Michael Hampton
4
Não há diferença real entre "this" e "receiver" (e por favor, pare de abusar da palavra "magic" - todos os recursos de uma linguagem de programação de alto nível podem ser chamados de "magic", isso não torna nada negativo, sua tentativa de escolher "isso" por ser "mágico" não faz sentido).
Mvmn
6

Não estou convencido por este guia de estilo e acho que nada é melhor do que this, meou self. Porque this, meou selfdeixa super claro que a variável é uma instância da estrutura de contexto. Não estou dizendo que uma variável de nome de estrutura com letras minúsculas é uma má idéia, apenas gosto da maneira que a thistorna super clara.

Qian Chen
fonte
sem uma explicação, essa resposta pode se tornar inútil se outra pessoa postar uma opinião oposta. Por exemplo, se alguém postar uma afirmação como "Estou convencido por este guia de estilo e acho que é melhor que this, meou self" , como essa resposta ajudaria o leitor a escolher duas opiniões opostas? Considere editar ing-lo em uma melhor forma, para atender Como responder diretrizes
mosquito
Acho que expliquei claramente o que queria dizer.
Qian Chen
1
Concordo. Eu acho que há muitos cérebros envenenados pelo contexto javascript. Se você deixar isso de lado. Que isso se refere ao contexto atual é muito mais simples. E mais fácil se você renomear estruturas mais tarde, ou copiar e colar parte de uma implementação. O gongo para nomes curtos, linha hl etc, não torna mais fácil do que isso.
Senciente
0

Isso é da perspectiva do JavaScript, onde thiso significado real da palavra-chave é para o compilador, mas, pelo que entendi, se estiverem de acordo com as abreviações de duas letras para o tipo de objeto, deve ser fácil usá-lo. A razão da diferença é que, em um bloco decentemente grande de código assíncrono progressivamente mais profundo, pode ser muito fácil interpretar mal o que "this", ou o receptor, está em um contexto mais profundo; e é possível que não seja o mesmo objeto.

Em JavaScript, por exemplo, um módulo de controle pode iniciar uma caixa de diálogo e declarar uma onLoadfunção embutida para ela. Mas, nesse ponto, poderia ser muito fácil para outro codificador interpretar mal o thisinterior onLoadpara se referir ao módulo de controle, não à caixa de diálogo; ou vice-versa. Isso poderia ser evitado se o controle fosse referido como ctrle a caixa de diálogo como dg.

Katana314
fonte
3
Eu não sou o menos favorável, mas a maioria dos comportamentos confusos do thisJavascript simplesmente não se aplica ao Go, então acho que é por isso.
Ixrec
@Ixrec Hm ... ok. Eu estava tentando estendê-lo a situações em que você podia escolher thiso nome; por exemplo, frequentemente os codificadores JS escrevem var self = thispara manter a mesma referência; mas, de acordo com o guia de design de Go, isso poderia ter os mesmos problemas de confusão e, teoricamente, deveria usar uma referência mais descritiva.
Katana314