Uma pergunta acerca do âmbito e encapsulamento
-
05-07-2019 - |
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.
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.