Pergunta

Eu recentemente vindo a trabalhar com código de outra pessoa e eu percebi que essa pessoa tem uma filosofia muito diferente em relação a variáveis ??particulares e parâmetros de método do que eu. Eu geralmente sinto que variáveis ??privadas só deve ser usado em um caso quando:

  1. As necessidades variáveis ??a serem armazenados para recuperação posterior.
  2. Os dados armazenados na variável é utilizada globalmente na classe.
  3. Quando as necessidades variáveis ??para ser manipulado globalmente (algo decididamente diferente da necessidade de ler a variável por cada método de classe).
  4. Quando isso vai tornar a programação substancialmente mais fácil. (É certo vago, mas um tem que ser em muitas circunstâncias para evitar pintar-se em um canto).

(eu admito, que muitos dos acima são um pouco repetative, mas cada um deles parecem bastante diferente para merecer tal tratamento ...)
Parece apenas que este é o meio mais eficiente de prevenir a mudança de uma variável por acidente. Também parece que seguir essas normas permitirá a eventual manipulação de referências externas (se a classe é eventualmente modificada), assim deixando-o com mais opções no futuro. Trata-se simplesmente de uma questão de estilo (como um verdadeiro suporte ou convenções de nomenclatura da Hungria), ou eu tenho justificação nesta crença? Existe realmente uma boa prática neste caso?

Editar
Eu acho que isso precisa ser corrigido. Eu usei "globalmente" acima onde eu realmente quis dizer, "globalmente por métodos de instância" não "globalmente acessível por qualquer coisa, em qualquer lugar".
edit2
Um exemplo foi convidado para:

class foo
{
    private $_my_private_variable;

    public function __constructor__()
    {
     }

    public function useFoo( $variable )
    {
        // This is the line I am wondering about,
        // there does not seem to be a need for storing it.
        $this->_my_private_variable = $variable; 
        $this->_doSometing();
    }

    private function _doSomething()
    {

        /*
          do something with $this->_my_private_variable.
        */
        // This is the only place _my_private_variable is used.
        echo $this->_my_private_variable;
    }
}

Esta é a maneira que eu teria feito isso:

class foo
{

    public function __constructor__()
    {
     }

    public function useFoo( $variable )
    {
        $this->_doSometing( $variable );
    }

    private function _doSomething( $passed_variable )
    {
        /*
          do something with the parameter.
        */
        echo $passed_variable;
    }
}
Foi útil?

Solução

Em geral, os membros da classe deve representar Estado do objeto de classe.

Não são locais temporários para os parâmetros do método (que é o método parâmetros são para).

Outras dicas

Eu afirmo que não é uma questão de estilo, mas sim uma questão de legibilidade / manutenção. Uma variável deve ter um uso e um uso apenas. “Reciclagem” variáveis ??para diferentes fins só porque eles acontecem para exigir o mesmo tipo não faz qualquer sentido.

De sua descrição soa como se o código da outra pessoa que você trabalhou faz exatamente isso, uma vez que todos os outros usos são basicamente cobertos pela sua lista. Simplificando, ele usa variáveis ??de membro privadas para atuar como temporários dependendo da situação. Estou certo de assumir isso? Se assim for, o código é horrível.

Quanto menor o escopo léxico e tempo de vida de qualquer variável dada, menos possibilidade de utilização errónea e melhor para a eliminação de recursos.

Ter um variável de membro implica que ele será holding estatal que precisa ser realizada entre chamadas de método. Se o valor não precisa ao vivo entre as chamadas que não tem razão de existir fora do escopo de uma única chamada, e assim (se é que existe) deve ser uma variável dentro do próprio método.

O estilo é sempre um difícil, uma vez que você desenvolver um você pode ficar preso em um pouco de uma rotina e pode ser difícil ver por que você faz pode não ser o melhor caminho.

Você só deve criar variáveis ??quando e onde eles são necessários, e eliminá-los quando você está feito. Se a classe não precisa de uma variável de nível de classe para função, então ele simplesmente não precisa de um. Criando variáveis ??onde você não precisa deles é muito má prática.

Os membros da classe deve ser um dos seguintes:

  • A dependência de uma classe
  • Uma variável que representa o estado da classe
  • Um método da classe

Eu não estou certo que há uma afirmado melhores práticas para o uso de variáveis ??de escopo global contra sempre passando como parâmetros do método. (Por "variáveis ??privadas", eu estou supondo que você quer dizer variáveis ??de escopo global.)

Usando uma variável de escopo global é a única maneira de implementar propriedades em .NET (mesmo propriedades automáticas em última análise, usar uma variável de escopo global, não apenas que você tem de declarar-se).

Há uma linha de argumento para sempre usando parâmetros do método porque torna completamente claro onde o valor está vindo. Eu não acho que ele realmente ajuda a prevenir o método de fazer alterações para o valor subjacente e pode, na minha opinião, dificultar as coisas para ler, às vezes.

Eu discordo de implementá-lo para acesso global ou para facilitar a programação. Ao expor estes globalmente sem filtrar qualquer tipo de torná-lo mais difícil de determinar o acesso no futuro.

Uma vez que as propriedades do objeto são destinadas a estado de retenção, como afirmaram os outros, a minha política é ter todos eles privados por padrão, a menos que tenha uma boa razão para expô-los.

É muito mais fácil para torná-los públicos, mais tarde, se você tem que, simplesmente por escrever um método getter por exemplo (que eu também não tenho que pensar direito no início de escrever uma classe). Mas se recuperando em uma propriedade pública, mais tarde, pode exigir uma enorme quantidade de código a ser re-escrita.

Eu gosto de mantê-lo flexível enquanto não ter que pensar sobre isso mais do que o necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top