Qual é a vantagem de ter este ponteiro / auto obrigatória explícita?
-
05-09-2019 - |
Pergunta
Qual é a vantagem de ter this
/ self
/ me
ponteiro obrigatório explícita?
De acordo com a OOP teoria, um método é suposto para funcionar principalmente (apenas?) Em variáveis ??de membro e argumentos do método. Após isso, ele deve ser mais fácil para se referir a variáveis ??de membro do que externo (do lado do objeto de vista) variáveis ??... this
explícita torna mais detalhado, assim, mais difícil para referem-se a variáveis ??de membro do que os externos. Isso parece contra-intuitivo para mim.
Solução
Além de variáveis ??de membro e parâmetros do método você também tem variáveis ??locais. Uma das coisas mais importantes sobre o objeto é o seu estado interno. Explícita dereferencing variável de membro deixa muito claro onde você está fazendo referência nesse estado e onde você está modificando esse estado.
Por exemplo, se você tem um código como:
someMethod(some, parameters) {
... a segment of code
foo = 42;
... another segment of code
}
ao navegar rapidamente através dele, você tem que ter um modelo mental das variáveis ??definidas no segmento anterior para saber se é apenas uma variável temporária ou ele se transformar o estado objetos. Considerando this.foo = 42 torna óbvio que o estado objetos é mutado. E se dereferencing explícita é usada exclusivamente, você pode ter certeza que a variável é temporária no caso contrário.
Shorter, métodos bem fatorados torná-lo um pouco menos importante, mas ainda assim, compreensibilidade longo prazo supera um pouco de conveniência ao escrever o código.
Outras dicas
Se você está falando "self
explícito" no sentido de Python, aqui está um interessante discussão sobre o tema. Aqui está Guido responder para artigo de Bruce Eckel. Os comentários sobre o artigo de Bruce também são esclarecedoras (alguns deles, de qualquer maneira).
Você precisa disso para passar o ponteiro / referência ao objeto atual em outro lugar ou para proteger contra a auto-atribuição em um operador de atribuição.
E se os argumentos para um método tem o mesmo nome que as variáveis ??de membro? Então você pode usar this.x = x
por exemplo. Onde this.x
é a variável de membro e x
é o argumento método.
Isso é apenas um (trivial) exemplo.
Eu geralmente uso deste (em C ++) só quando eu estou escrevendo o operador atribuição ou construtor de cópia , pois ajuda a identificar claramente as variáveis. Outro lugar onde eu possa pensar em usá-lo é se a sua função nomes parâmetro variáveis ??são os mesmos que os nomes de variável de membro ou eu quero matar meu objeto usando excluir este .
Por exemplo, seria onde nomes de membros são os mesmos que aqueles passados ??para o método
public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
{
this.screenTemplateID = screenTemplateID;
this.screenTemplateName = screenTemplateName;
this.isDefault = isDefault;
}