Como trabalhar com código legado

Preview:

DESCRIPTION

Apresentação realizada para a equipe do Reserve, sobre como trabalhar com código legado

Citation preview

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!