Pergunta

Eu tenho uma pergunta genérica sobre o escopo e encapsulamento. Tome dois cenários:

Cenário 1:

// a global application level constant
public static const IS_DEMO_MODE:Boolean = false;   

... // somewhere deep in the codebase

private function _myFunction():void
{
    if (IS_DEMO_MODE == true) {
      // If Demo Mode do not allow this function to complete
      return;       
    }
    else {
       // Function behaves normally
       // Code ...
    }

}

Cenário 2:

// a global application level constant
public static const IS_DEMO_MODE:Boolean = false;   

... // somewhere deep in the codebase

 // call the function and pass in the constant
_myFunction(IS_DEMO_MODE);


private function _myFunction(isDemoMode:Boolean):void
{
    if (isDemoMode == true) {
      // If Demo Mode do not allow this function to complete
      return;       
    }
    else {
       // Function behaves normally
       // Code ...
    }

}

Funcionalmente falando estes dois trechos de código fazer o mesmo exatamente a mesma coisa. Eu estou tentando compreender as subtilezas do estilo de codificação e por que uma forma pode ser preferido sobre o outro? Parece que o cenário 2 é melhor do ponto de encapsulamento de vista. Mas o cenário 1 é mais infalível em que o booleano que está na condicional vem de apenas um lugar, a constante global. Você não tem que se preocupar com uma chamada de função que, enquanto corretamente receber um parâmetro poderia passar o valor errado. Mas o cenário 2 parece valer a pena porque você remover a dependência da constante e pode ter a função de se comportar de forma mais dinâmica. Quaisquer pensamentos sobre isso? Existem outras soluções de compromisso que eu estou olhando por cima?

O mesmo conceito e pergunta aplicado a objetos e classes também. Mas eu simplesmente apresentar o exemplo em termos de uma função para a simplicidade do exemplo de código.

Foi útil?

Solução

Na segunda abordagem, você pode fazer _myFunction ao vivo em um módulo separado, sem dependência do global - por isso é mais fácil de teste, mais fácil de reutilização, e ajuda a controlar o seu gráfico de dependência, que muitas vezes se torna um problema sério em grandes bases de código. Se você inserir dependências você poderia facilmente evitar, você está fazendo apenas o problema de dependência-graph pior, e muito poucos benefícios potenciais poderia possivelmente pagar por isso.

Na verdade, para ganhar este tipo de vantagens, um grande padrão de dependência é objeto explicitamente INJECT que de outra forma criar dependências (geralmente indesejáveis ??e indesejadas) entre módulos - veja aqui para um começo. Como um fanático de testes, baixo acoplamento, e reutilização, eu estou tornando-se gradualmente um fanático de injeção de dependência também, então eu não sonharia de acessar uma constante global onde passá-lo como um argumento é uma alternativa óbvia ...; - ).

Outras dicas

2 seria preferível se você queria a mesma unidade de compilação a ser ligado contra ambas as versões (especialmente como uma biblioteca compartilhada em um caminho fixo a nível mundial), ou se você executou várias instâncias no mesmo processo. Caso contrário, se você estiver em uma situação onde a reconstruir tudo, de fonte não é obstáculo, # 1 é melhor.

Algumas coisas são realmente global. constantes globais não são perigosos em tudo.

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