Refatore o código existente da biblioteca C# com segurança
Substituir um laço por LINQ não é automaticamente uma melhoria. A refatoração deve preservar comparação, ordenação, comportamento com null, referências preenchidas e efeitos colaterais.
Resumo do laboratório

Ilustração conceitual original (SVG)
| Em resumo | Sua rota |
|---|---|
| Nível e tempo | 300; 60 minutos (estimativa de facilitação) |
| Ação inicial | Caracterize um método antes de substituir seu laço. |
| Materiais do aluno | Baixe 05-csharp.zip |
| Workspace | Abra a raiz do kit extraído; execute a baseline de . relativa a essa raiz |
| Verificação inicial esperada | Os testes fornecidos passam. Os novos requisitos de funcionalidade ainda precisam de testes próprios. |
| Ajuda de configuração | Baixe, extraia, Git local e GitHub opcional |
[!NOTE] Código mais curto não é evidência de equivalência semântica.
Conceitos · Primeira tarefa · Lista de evidências · Redefinir
Objetivos de aprendizagem
- Derive o comportamento atual a partir dos métodos do repositório.
- Separe refatoração de correções de bugs e de novas semânticas de busca.
- Comprove a equivalência em casos de limite selecionados.
Antes de começar
Prepare 05-csharp usando o guia de configuração.
Use a
fixture de refatoração C# incluída.
Não altere versões de dependências durante uma refatoração.
Conceitos e casos de uso
| Comportamento | Pergunta sobre preservação |
|---|---|
SearchPatrons |
Contains continua diferenciando maiúsculas e minúsculas como nesta fixture? |
| Ordenação | O comportamento atual de comparação/cultura é preservado? |
| Preenchimento | Os empréstimos relacionados continuam vinculados? |
GetPatron |
O comportamento para ID ausente continua sendo null? |
| Atualização | Os mesmos campos são persistidos e recarregados? |
Cenário do exercício
O repositório usa iteração manual para encontrar e filtrar usuários/empréstimos. Simplifique um método mantendo a interface existente e a semântica dos resultados.
Tarefa 1 - Inspecione e caracterize
-
Leia
JsonPatronRepository,JsonLoanRepository,JsonDatae suas interfaces. -
Execute a pequena suíte da fixture:
dotnet test tests/UnitTests/UnitTests.csproj -m:1 -p:UseSharedCompilation=false -
Adicione casos de caracterização antes de editar: encontrado/ausente, lista vazia, mistura de maiúsculas e minúsculas, nomes de exibição duplicados com IDs distintos e referências preenchidas.
-
Use dados isolados; não modifique o JSON distribuído para obter os resultados esperados.
Tarefa 2 - Peça alternativas e depois use Plan
Compare the current loop in SearchPatrons with a LINQ alternative. Preserve
comparison and sort semantics, missing-input behavior, and populated loans.
Identify any material difference; do not edit or claim a speedup.
Escolha um método. Exija uma tabela de comportamento antes/depois e um comando de teste direcionado. Se o comportamento atual for indesejável, documente uma funcionalidade separada em vez de alterá-lo sob o nome de “refatoração”.
Tarefa 3 - Implemente um recorte equivalente
- Peça a Agent que simplifique somente o método escolhido.
- Inspecione execução adiada versus listas materializadas. Não retorne um iterador preguiçoso onde os chamadores esperam um instantâneo.
- Execute a caracterização direcionada e a suíte original.
- Altere temporariamente a comparação de caixa ou omita o preenchimento. Confirme que um teste de regressão falha e restaure a refatoração.
- Revise assinaturas públicas e chamadas de gravação/recarga em busca de alterações não intencionais.
Verifique seu trabalho
- Os testes existentes e os novos casos de caracterização passam.
- A semântica de caixa, ordenação e null permanece explícita.
- As entidades relacionadas continuam preenchidas.
- Os efeitos colaterais de atualização/persistência permanecem inalterados.
- Uma mutação semântica deliberada é detectada.
Solução de problemas
Se os testes passarem com ou sem preenchimento, melhore as asserções. Se a ordenação mudar em outra máquina, inspecione a cultura em vez de chamá-la de aleatória. Se um ID ausente passar a lançar exceção, isso é uma mudança de comportamento que exige critérios de aceitação próprios.
Prática independente
Aplique a mesma abordagem a uma consulta de empréstimo. Explique quando o laço mais simples é preferível a uma cadeia de operadores LINQ.
Restauração
Salve a tabela de comportamento, restaure somente os arquivos refatorados e de testes no projeto copiado e pare o console se ele tiver sido iniciado. Nunca faça uma redefinição forçada do currículo.