É 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?