6 maneiras de fazer a mesma coisa, o que é considerado boas práticas?

As vezes tem tantas maneiras diferentes de fazer o mesmo código que nós ficamos na dúvida quanto a qual maneira usar. O que seria considerado "boa prática" pela comunidade e o que sua equipe entenderia melhor. Suponhamos que você esteja trabalhando dentro de um método de um Domain Service chamado UmDomainServiceChique(objetoDoDominio) que será chamado por uma API. Você tem uma regra de negócio chique para ser verificada que por enquanto chamarei de VerificaMinhaRegraChiqueComplexa(). Você chama UmDomainServiceChique(objetoDoDominio) e caso VerificaMinhaRegraChiqueComplexa() retorne true você vai querer que UmDomainServiceChique faça o que tem que fazer e a api retornar Ok 200, caso contrário você quer que a API responda um erro qualquer, tipo BadRequest, e retornar uma mensagem dizendo que VerificaMinhaRegraChiqueComplexa deu ruim. Eu vejo 6 maneiras de fazer isso, gostaria de saber a opinião de outrs devs sobre qual seria a maneira menos gambiarr

Forward Declarations

Imagine que você está escrevendo uma biblioteca de funções estáticas em um arquivo .pas e precisa declarar o cabeçalho de uma função para que ela possa ser usada abaixo globalmente, mas você não quer colocar o cabeçalho na seção interface para que a função não seja publicada para todas as units, você quer manter ela em "segredo" na seção de implementation.

Você pode dizer: "simples, basta declarar a função inteira acima e pronto." Mas e se essa função precisa usar outra que também será declarada dessa maneira e vice-versa?

A solução é foward declaration. Tudo bem, não se usa muito hoje em dia, ainda mais em POO, mas segue abaixo um exemplo de como você pode declarar uma função adiando a sua real implementação "mais para baixo" mesmo na seção implementation:

unit uSomaForward;

interface

function SomaPublica(x, y: Integer): Integer;

implementation


function SomaPrivada(x,y: Integer): Integer; forward;

function SomaPublica(x, y: Integer): Integer;
begin
  Result := SomaPrivada(x, y);
end;


function SomaPrivada(x,y: Integer): Integer;
begin
  Result := x+y;
end;


end.
 

Esse você testa com:

ShowMessage(IntToStr(SomaPublica(5,9))); 

Vamos fazer uma brincadeira mais complexa: todo mundo sabe fazer uma função fatorial recursiva certo? E se dividíssemos a função em duas recursivas circulares que hora chama uma e hora chama outra? Lógico que não teremos isso na vida real, mas você pode ter dois métodos um fazendo chamada ao outro de maneira circular por n motivos, desde tratamento de arvores de menus até mesmo descuido e desatenção. Isso não vem ao caso, queremos apenas demonstrar como as foward declarations podem ajudar a resolver quebra-cabeças de funções auto referenciaveis que ainda não foram declaradas. Sem elas não seria possível uma função chamar a outra sem os cabeçalhos, experimente.

A função fatorial dependente de duas recursivas ficaria assim:

unit uInterdependentes;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

function FatorialChamanoFuncoesRecursivasInterDependentes(numero: integer):integer;



implementation

   function InterDependente(contador: integer): integer forward;
   function DependenteInter(contador: integer): integer forward;

   function FatorialChamanoFuncoesRecursivasInterDependentes(numero: integer):integer;
   begin
        Result :=  InterDependente(numero);
   end;

   function InterDependente(contador: integer): integer;
   begin
        if contador <= 1 then
        begin
             Result := 1;
        end
        else
        begin
            Result := contador * DependenteInter(contador-1);
        end;
   end;

   function DependenteInter(contador: integer): integer;
   begin
        if contador <= 1 then
        begin
             Result := 1;
        end
        else
        begin
            Result := contador * InterDependente(contador-1);
        end;
   end;

end.  
E você pode testar assim:
     ShowMessage(IntToStr(FatorialChamanoFuncoesRecursivasInterDependentes(5)));  //retornará 120

Até a próxima ;)

Comentários

Postagens mais visitadas deste blog

Uso de memória no SQL Server

Busca de CEP com o Lazarus - Parte 1 - UrlEncode

Botão Add This para adicionar seu post em qualquer rede