Skip to content

DRY (Don't Repeat Yourself)

"Não se repita". O princípio DRY estabelece que cada pedaço de conhecimento ou lógica deve ter uma representação única, inequívoca e autoritária dentro do sistema.


1. O que significa na prática?

Se você tem a mesma lógica de negócio, a mesma validação ou o mesmo cálculo matemático escrito em três lugares diferentes, você tem um problema. Quando essa regra mudar, você terá que lembrar de atualizar os três lugares, aumentando o risco de bugs e inconsistências.

❌ Exemplo: Duplicação de Lógica (Ruim)

tsx
// Screen A
const total = items.reduce((acc, curr) => acc + curr.price * 0.9, 0);

// Screen B
const discountPrice = price * 0.9;

Se a regra de desconto mudar de 10% para 15%, você terá que procurar em todo o projeto por 0.9.

✅ Exemplo: Representação Única (Bom)

typescript
// src/application/utils/pricing.ts
export const applyGlobalDiscount = (price: number) => price * 0.9;

//src/application/utils/pricing.test.ts
// Testamos a lógica em um único lugar!

2. DRY no React: Custom Hooks

O uso de Custom Hooks é a forma mais poderosa de aplicar DRY na camada de Tela e Feature.

✅ Exemplo: Reutilizando Lógica de UI

typescript
// src/features/common/hooks/useToggle.ts
export function useToggle(initialValue = false) {
  const [value, setValue] = useState(initialValue);
  const toggle = () => setValue(prev => !prev);
  return [value, toggle] as const;
}

// Uso em múltiplos componentes
const [isModalOpen, toggleModal] = useToggle();
const [isDropdownOpen, toggleDropdown] = useToggle();

3. O Cuidado: Abstração Prematura e WET

"Duplication is far cheaper than the wrong abstraction." (Sandi Metz)

Às vezes, levamos o DRY longe demais e unificamos coisas que não deveriam estar juntas. Isso cria o código "espaguete", onde uma mudança para a Tela A quebra a Tela B porque elas compartilham a mesma função "genérica" que na verdade faz coisas levemente diferentes.

Quando NÃO aplicar DRY?

  1. Coincidência: Os códigos são iguais hoje, mas pertencem a funcionalidades que evoluem de forma independente.
  2. Complexidade: A abstração necessária para unificar os dois códigos torna a leitura muito mais difícil do que ter as duas partes separadas.
  3. WET (Write Everything Twice): Uma alternativa ao DRY que sugere que você só deve abstrair algo após repetir pela terceira vez (Rule of Three).

Como aplicar no projeto

  1. Constantes: Nunca use "magic strings" ou números soltos. Use constantes centralizadas.
  2. Styles: Use o Design System e Tokens em vez de repetir valores de HEX ou Spacing.
  3. Business Rules: Regras de cálculo ou validação de documentos (CPF, etc) devem estar na pasta rules da camada de Feature.