Árvore de natal antipadrão

Antipadrões, ou simplesmente exemplos de código ineficaz, podem ser contribuidores muito insidiosos, mesmo no código-fonte de desenvolvedores experientes. Às vezes, isso é uma consequência do estabelecimento de uma tarefa ou de prazos muito apertados; às vezes, a desatenção falha.





Neste artigo, vou falar sobre o antipadrão de design de árvore de Natal. A essência desse antipadrão reside no fato de que, em alguns casos, a abordagem imperativa afeta o texto de origem de forma muito mais difícil de entender e manter. Uma complicação provoca a próxima e assim por diante, até percebermos que é mais fácil reescrever tudo do zero.





Acho esse anti-padrão interessante porque você pode obtê-lo não com uma única mudança, mas com toda uma cadeia de melhorias relacionadas ao desenvolvimento do código. E sim, você entendeu bem, nos convencemos e ao cliente que o código está cada vez melhor, mas no final ganhamos uma árvore de natal. Para entender melhor isso, considere uma cascata de tarefas, das simples às complexas, e tente rastrear o curso dos julgamentos que levam a um código ineficaz.





O nascimento de um problema

Vamos imaginar que existe um componente simples que exibe um certo número - "Contador"





const Counter = ({ value }) => {
	return <div>{ value }</div>;
};
      
      



“Contador” não deve ser interpretado literalmente. É simplesmente um modelo simplificado para contrastar a essência do problema.





Recebemos a tarefa de torná-lo mais funcional, digamos, após o número, colocar unidades de medida - digits



. O componente agora se parece com isto:





const Counter = ({ value, digits }) => {
	return <div>{ `${value} ${digits}` }</div>
};
      
      



, , : 10 ()



. , :





const Counter = ({ value, digits, type }) => {
	const temp = type ? `(${digits})` : digits;
	return <div>{ `${value} ${temp}` }</div>
};
      
      



, . , «Counter» , . . , — a



, b



c



, y



- f(a, b, c)



, .





, « ». , , . , . , , a * b



. , a + b.







«Counter» , (digits



type



) , . . a * b



, . , , :





y = a * b + c

, digits



, value



, , a



, . , , . . type



.





y = b + 1

... . , , , , .





, , digits



, , , «Counter» . , ...





?

, «Counter» . , , , . digits



type



, b' = f(b)



. :





const getCoveredDigits = (digits) => `(${digits})`;

<Counter
  value={value}
  digits={getCoveredDigits(digits)}
/>
      
      



, :





y = a + b ', b' = f (b)

, f(b)



, . , «Counter».





Claro, ao implementar "Counter", cometemos deliberadamente vários erros que muitas vezes passam despercebidos na produção real. Embora não exista um modelo de componente ideal, mas com uma decomposição mais lucrativa, é possível reduzir a quantidade de texto fonte e, como resultado, aumentar a confiabilidade e escalabilidade geral de seus aplicativos.








All Articles