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.

Foi útil?

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;
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top