Skip to content
Jerson Seling edited this page Aug 10, 2020 · 4 revisions

Refatoração

  • Codificamos para outras pessoas, eventualmente para a máquina.
  • Quanto tempo o fonte é usado por máquinas? Quanto tempo é usado por humanos?
  • A manutenibilidade do código precede seu desempenho.
  • Em vez de validar parâmetros Null em cada método, deve-se garantir que eles não são nulos antes de se passar para o método. Isso é tornar o código mais robusto.
  • Validar parâmetros nulos é como colocar escoras no método. Será que justifica-se em um legado onde você não tem controle de onde vem o parâmetro ou não tem tempo de procurar? Ou numa biblioteca onde você não sabe como o programador vai usar? Isso compromete a filosofia de fail fast.
  • Fazer essa validação e executar o negócio compromete a responsabilidade única do método segundo o SOLID.
  • Um método com nome muito longo significaria que ele pode ser separado em outra classe? Um nome comprido geralmente envolve nomeações de escopos que seriam a(s) nova(s) classe(s)?

SOLID e Injeção de dependência

Não é bom, classe faz mais de uma coisa, fere o Principio da Responsabilidade Única (SRP) do SOLID

TMinhaClasse = class
private
 procedure FazIsto; //se for usada herança para sobreescrever é pior ainda
 procedure FazAquilo;
public
 procedure FazCoisa;
end;

procedure TMinhaClasse.FazCoisa;
begin
 FazIsto;
 FazAquilo;
end;

É melhor, mas cria dependência de outras implementações

TMinhaClasse = class
public
 procedure FazCoisa;
end;

uses
 uClasseFazIsto, uClasseFazAquilo;

procedure TMinhaClasse.FazCoisa;
begin
 TClasseFazIsto.FazIsto(params); //não necessáriamente um método estático
 TClasseFazAquilo.FazAquilo(params);
end;

É melhor ainda, não fere o SRP e nem cria dependências

uses
 uInterfaceFazIsto, uInterfaceFazAquilo;
 
TMinhaClasse = class
private
 FIFazIsto: IFazIsto;
 FIFazAquilo: IFazAquilo;
public
 procedure FazCoisa;
end;

//injeção de dependência através de composição de objetos
//elimina a dependência das implementações e 
//dependências (dependências de dependências) das outras classes;
//Torna a classe mais reutilizável e
//independente/agnóstica ("desconhecedora") de outras implementações.
constructor TMinhaClasse.Create(_AIFazIsto: IFazIsto; _AIFazAquilo: IFazAquilo);
begin
 FIFazIsto := _AIFazIsto;
 FIFazAquilo := _AIFazAquilo;
end;

procedure TMinhaClasse.FazCoisa(_AParams: TTipoParam);
begin
 FIFazIsto.FazIsto(_AParams); 
 FIFazAquilo.FazAquilo(_AParams);
end;

Ou

uses
 uInterfaceFazIsto, uInterfaceFazAquilo;
 
TMinhaClasse = class
public
 procedure FazCoisa(_AParams: TTipoParam; _AIFazIsto: IFazIsto; _AIFazAquilo: IFazAquilo);
end;

//injeção de dependência no método, pode acabar criando uma lista de parâmetros considerável
procedure TMinhaClasse.FazCoisa(_AParams: TTipoParam; _AIFazIsto: IFazIsto; _AIFazAquilo: IFazAquilo);
begin
 _AIFazIsto.FazIsto(_AParams); 
 _AIFazAquilo.FazAquilo(_AParams);
end;
Clone this wiki locally