É essencial, para sobrevivência de um produto, possuirmos estratégias de evolução da qualidade, principalmente em softwares legado. Por isso recomendamos a adoção de Inversão de Controle.
O que é software legado?
Não há concenso, mas nos defendemos que:
Um software se torna legado quando a capacidade do time técnico de pagar dívidas técnicas é menor do que a necessidade de contrair novas. (Fernando Neiva Paiva)
Fonte: https://www.eximiaco.tech/pt/bliki/arquitetura-de-software/
Inversão de controle é a capacidade de um componente de software possuir uma dependência de outro componente sem ter a capacidade de instanciá-lo.
public class Genio
{
public string GetNascimento()
{
return DateTime.Now.ToString();
}
}
O exemplo acima, retorna a data e hora atual em texto. Porém, ele possui um acoplamento direto com o DateTime.Now, o que torna impossível de testar corretamente. É isto que iremos resolver a seguir:
public class Genio
{
private readonly Func _nascimento;
public Genio(Func nascimento)
{
_nascimento = nascimento ?? throw new ArgumentNullException(nameof(now));
}
public string GetNascimento()
{
return _nascimento().ToString();
}
}
Ao deixarmos de utilizar DateTime.Now em troca de uma função na construção do objeto, o dia do nascimento de Tesla passa a não ser mais responsabilidade do componente Genio. Com isso possibilita o seguinte:
[Fact]
public void GetNascimento_DeveSerIgual_DiaDoNascimentoDeNikolaTesla()
{
// Arrange
var date = new DateTime(1856, 06, 10);
var tesla = new Genio(() => date);
var expected = "10/06/1856 00:00:00";
// Act
var actual = tesla.GetNascimento();
// Assert
Assert.Equal(expected, actual);
}
Recomendamos o uso consistente de boas práticas que torna o seu código testável e coeso, gerando assim mais resultado para o Negócio.
Seus projetos passarão a utilizar Inversão de Controle? Inclusive seu Legado?