Consolide código duplicado preservando as regras de negócio
Dois métodos semelhantes não são necessariamente uma única regra. Os processadores de pedidos e devoluções compartilham mecanismos de validação, mas usam prefixos, limites de frete e sentidos de movimentação de estoque diferentes. Remover essas diferenças seria uma mudança de comportamento.
Resumo do laboratório

Ilustração conceitual original (SVG)
| Em resumo | Sua rota |
|---|---|
| Nível e tempo | 200; 55 minutos (estimativa de facilitação) |
| Ação inicial | Capture os limites de igualdade antes de extrair um helper. |
| Materiais do aluno | Baixe 07-duplication.zip |
| Workspace | Abra a raiz do kit extraído; execute a baseline de . relativa a essa raiz |
| Verificação inicial esperada | O projeto selecionado compila. A compilação sozinha não prova o comportamento. |
| Ajuda de configuração | Baixe, extraia, Git local e GitHub opcional |
[!NOTE] Código semelhante não significa a mesma política de envio ou inventário.
Conceitos · Primeira tarefa · Lista de evidências · Redefinir
Objetivos de aprendizagem
- Identifique duplicação exata versus semântica usando código real.
- Capture as saídas e os efeitos colaterais atuais antes da extração.
- Escolha uma pequena abstração compartilhada sem generalizar demais a política.
- Detecte uma refatoração que altera acidentalmente um limite.
Antes de começar
Prepare 07-duplication com a configuração comum.
A fonte é a
fixture ECommerceOrderAndReturn incluída.
Use o SDK .NET de destino dela e um único processo de compilação.
Conceitos e casos de uso
| Candidato | Possível mecanismo compartilhado | Manter explícito |
|---|---|---|
Validate |
Verificações de vazio/comprimento | Prefixos ORD versus RET |
CalculateShipping |
Aplicação de uma política | Limites/valores de pedidos e devoluções |
| Notificações | Formatação e saída | Finalidade da mensagem e destinatários |
| Estoque | Limites e registro em log | Reservar diminui; restaurar aumenta |
Os processadores capturam e registram exceções. Portanto, um código de saída zero na demonstração não comprova que uma exceção esperada foi lançada. Este é um exercício de caracterização, não uma comprovação de segurança em produção.
Cenário do exercício
Você precisa reduzir a duplicação de manutenção sem alterar totais, estoque, mensagens de validação ou ordem dos eventos. Uma alteração de negócio separada precisaria de critérios de aceitação e revisão próprios.
Tarefa 1 - Capture uma linha de base real
-
Leia
OrderProcessor.cs,ReturnProcessor.cs,Configuration/AppConfig.cse os serviços que eles chamam. -
Compile o projeto copiado:
dotnet build ECommerceOrderAndReturn.csproj -m:1 -p:UseSharedCompilation=false dotnet run --no-build --project ECommerceOrderAndReturn.csproj -
Registre os totais atuais de frete de pedidos/devoluções, o estoque antes/depois e os IDs rejeitados. Trate
EXPECTED_OUTPUT.mdcomo uma ilustração histórica, não como a saída de hoje. -
Identifique timestamps ou identificadores gerados antes de comparar logs. Não remova valores de negócio apenas para fazer um diff parecer igual.
Tarefa 2 - Analise a duplicação com Ask
Compare OrderProcessor.Validate and ReturnProcessor.Validate. Cite the shared
mechanics and the policy differences. Do the same for shipping and inventory.
Do not edit. Flag swallowed exceptions separately from the refactoring scope.
Confira a resposta com estas regras concretas de frete:
| Regra | Pedidos | Devoluções |
|---|---|---|
| Base | 5.00 | 3.00 |
| Adicional por peso | Acima de 10: +2.00 | Acima de 5: +1.50 |
| Desconto por valor | Acima de 50: -1.00 | Acima de 30: -0.50 |
| Manuseio especial | Frágil: +3.00 | Dimensões excedentes: +4.00 |
Não substitua “acima de” por “pelo menos”. Teste valores imediatamente abaixo, iguais e acima dos limites antes de mover código.
Tarefa 3 - Planeje uma extração
- Em Plan, escolha validação ou frete para a primeira alteração.
- Exija uma tabela com regras preservadas, parâmetros propostos, chamadores existentes, casos de regressão e reversão.
- Explique por que uma função auxiliar compartilhada é mais simples que uma nova hierarquia de classes.
- Mantenha os métodos públicos originais de processamento e a ordem dos efeitos colaterais.
- Defina um ponto de parada após uma extração que preserve o comportamento.
Tarefa 4 - Implemente e questione o resultado
- Peça a Agent que implemente somente essa extração.
- Inspecione todos os chamadores; funções auxiliares não usadas não constituem consolidação.
- Adicione asserções sobre valores determinísticos ou um harness de caracterização de escopo restrito. Não renomeie uma transcrição do console como “testes unitários”.
- Execute novamente a mesma compilação/demonstração e as asserções adicionadas.
- Inverta temporariamente um limite na cópia descartável. Confirme que a asserção relevante falha e restaure-o.
- Considere uma segunda extração somente depois que a primeira estiver verificada.
Verifique seu trabalho
- Os pontos de entrada públicos e as regras observáveis permanecem inalterados.
- Os limites de igualdade de peso/valor são testados.
- Reservar e restaurar continuam tendo efeitos opostos no estoque.
- As novas asserções rejeitam um limite intencionalmente incorreto.
- O diff contém reutilização real, não uma abstração sem uso.
Solução de problemas
| Sintoma | Causa provável |
|---|---|
| Cada execução tem um log diferente | Horários/IDs dinâmicos; compare explicitamente os campos estáveis |
| Os preços de pedidos e devoluções convergem | Políticas distintas foram mescladas acidentalmente |
| Todos os cenários da demonstração saem com zero | As exceções são registradas internamente; adicione asserções que distingam comportamentos |
| A refatoração se espalha por muitas camadas | Retorne a uma extração e declare as exclusões |
Prática independente
Refatore uma função auxiliar de notificação preservando os métodos públicos e as mensagens. Explique por que alterar o comportamento de novas tentativas seria uma funcionalidade separada.
Restauração
Pare a demonstração, salve a linha de base e as evidências da comparação e restaure somente os arquivos nomeados do exercício na cópia descartável. Não sobrescreva a fixture de origem.