Post on 28-Jun-2015
description
Como trabalhar com código legado
Velho desenvolvimento. Novos paradigmas.
Será que sabemos realmente o que
estamos fazendo?
Vou contar um pouco do que funcionou para mim e que pode
funcionar para você também!
Ah é só botar breakpoint e tentar descobrir porque está falhando!
Refatorar é como soltar um cordão trançado
O objetivo ao refatorar um código super-acoplado é
sempre e a todo custo buscar a criação de teste unitários.
Se não fizer isso.
Se não fizer isso.
Crie Regionspublic int RotinaAcoplada(boolean teste){ if (! teste){ var dao = new UsuarioDAO(); ... ... ... return dao.listarUsuarios().Count; } return 0;}
Crie Regionspublic int RotinaAcoplada(boolean teste){ if (! teste){ var dao = new UsuarioDAO(); #region Quantidade de Usuarios ... #endregion return dao.listarUsuarios().Count; } return 0;}
Crie um metodo vazio com o nome da Region
public int QuantidadeUsuarios(){ var dao = new UsuarioDAO(); return dao.listarUsuarios().Count;
}
Copie o código da Region para o Método
public int QuantidadeUsuarios(){ var dao = new UsuarioDAO(); return dao.listarUsuarios().Count;
}
Neste momento o código não compila e isso agora é bom.
Porque?
Chame o novo metodo no lugarpublic int RotinaAcoplada(boolean teste){ if (! teste){ var dao = new UsuarioDAO(); #region Quantidade de Usuarios ... #endregion return dao.listarUsuarios().Count; } return 0;}
Chame o novo metodo no lugarpublic int RotinaAcoplada(bool teste){ if (!teste) { return QuantidadeUsuarios();
return 0;}
Agora sim está pronto.
Obrigado!
O método anterior continua acoplado e não dá
para testar, resolva isso.
Como o Tiago não tá vendo vou dar uma dica.
Passe as necessidades do código como parametro da função, o
codigo fica mais limpo inclusive.
Desacoplando o códigopublic int RotinaAcoplada(bool teste){
if (!teste) { return QuantidadeUsuarios();
return 0;}
RotinaAcoplada(false);
Desacoplando o códigopublic int RotinaAcoplada(bool teste, Func<int> query){ if (!teste) { return query();
return 0;}
RotinaAcoplada(false, QuantidadeUsuarios);
Testando o códigovoid TesteChamandoTrueRetornaZero (){ Assert.True(RotinaAcoplada(true, null), 0);}
void TesteChamandoFalseChamaFuncao (){ Assert.True(RotinaAcoplada(false, ()=>27), 27);}
O código pode não funcionar, se acontecer não tente descobrir o que houve, dá revert e começa
novamente. É mais seguro.
Código legado é aquele que não tem testes, neste caso é como uma rocha, que deve ser quebrada em
pedaços até ser possível testar, caso ainda não consiga fazer
testes, continue quebrando até conseguir.
“Desenvolver software é a arte de fazer maquinas calcularem,
escrevendo poesias!”
Obrigado!