Lógica e Dados em Harmonia
Outro princípio corolário ao das consequências locais é manter em harmonia lógica e dados.
Devem-se colocar a lógica e os dados sobre os quais ela opera próximos um do outro, se possível no mesmo método, ou no mesmo objeto, ou ao menos no mesmo pacote.
Para fazer uma mudança, é provável que se tenha de alterar a lógica e os dados ao mesmo tempo.
Se eles estão em harmonia, as consequências dessa mudança serão locais.
No início, nem sempre é óbvio onde devem ficar a lógica e os dados para se satisfazer esse princípio.
Pode-se estar escrevendo código em A e perceber que são necessários dados que estão em B.
Só depois de o código estar funcionando é que se nota que ele está muito distante dos dados.
Assim, é preciso optar: mover o código para próximo dos dados, mover os dados para próximo do código, colocá-los juntos em um objeto auxiliar, ou entender que, naquele momento, não possível pensar em como juntá-los de forma que se comuniquem eficazmente.
Simetria
Simetria é mais código que teoria. Basicamente seria algo como: ao invés de colocar o código count++ entre os métodos init() e output(), coloque um novo método que terá o conunt++ como conteúdo, esse novo método deve ter um nome que auxilie um fácil entendimento do código, processCount(), por exemplo. Então teremos: init(); processCount(); output().
Outro princípio que se usa o tempo todo é a simetria. Programas são cheios de simetria.
Um método add() é acompanhado de um método remove(). Em um grupo de métodos, todos têm os mesmos parâmetros.
Todos os campos de um objeto têm o mesmo tempo de vida. Identificar e expressar claramente a simetria torna o código mais fácil de ler.
Se os leitores puderem entender uma metade da simetria, eles poderão entender rapidamente a outra.
Costuma-se discutir simetria em termos espaciais: bilateral, rotacional e assim por diante.
A simetria em programas raramente é gráfica, ela é conceitual. No código, ela está onde a mesma ideia é expressada da mesma forma em todos os lugares em que aparece no código.
Eis um exemplo de código em que falta simetria:
void process(){
input();
count++;
output();
}
A segunda declaração é mais concreta que as duas mensagens. Eu reescreveria isso com base na simetria, resultando em:
void process(){
input();
incrementCount();
output();
}
Mas esse método ainda viola a simetria. As operações input() e output() são nomeadas de acordo com as intenções, e incrementCount(), de acordo com uma implementação.
Buscando simetrias, penso no motivo para se incrementar o contador, talvez resultando em:
void process(){
input();
tally();
output();
}
Muitas vezes, encontrar e expressar simetrias é um passo preliminar para se remover uma duplicação.
Se uma ideia está presente em diversos pontos do código, torná-la simétrica em todos é um bom primeiro passo visando unificá-las.
Fonte: Implementation Patterns (Addison-Wesley Signature Series (Beck)) (English Edition)
Deixe um comentário