Eu tenho um debate com um colega programador sobre se é uma prática boa ou ruim modificar um trecho de código apenas para torná-lo testável (por meio de testes de unidade, por exemplo).
Minha opinião é de que está tudo bem, dentro dos limites de manter boas práticas orientadas a objetos e de engenharia de software (não "tornar tudo público", etc).
A opinião do meu colega é que modificar o código (que funciona) apenas para fins de teste está errado.
Apenas um exemplo simples, pense neste pedaço de código usado por algum componente (escrito em C #):
public void DoSomethingOnAllTypes()
{
var types = Assembly.GetExecutingAssembly().GetTypes();
foreach (var currentType in types)
{
// do something with this type (e.g: read it's attributes, process, etc).
}
}
Sugeri que esse código possa ser modificado para chamar outro método que fará o trabalho real:
public void DoSomething(Assembly asm)
{
// not relying on Assembly.GetExecutingAssembly() anymore...
}
Esse método utiliza um objeto Assembly para trabalhar, possibilitando passar seu próprio Assembly para fazer os testes. Meu colega não achou que isso fosse uma boa prática.
O que é considerado uma prática boa e comum?
Type
como parâmetro, não comoAssembly
.