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...

Truques usando API do windows

Usando a API do windows podemos executar um programa externo, colocar a janela dele dentro da janela do nosso programa e capturar  texto de uma janela ou widget qualquer desse programa.

Qualquer programa feito e usando a api do windows pode ser usado dessa forma. Nossa cobaia oficial será a calculadora do windows, mas onde você ver calculadora pode ler "qualquer programa nativo win32, como msn, bloco de notas etc".

O exemplo foi feito em lazarus mas funciona perfeitamente em qualquer versão do Delphi. Tenha a unit Windows no seu uses.




procedure TForm1.btCapturarClaculadoraClick(Sender: TObject);
var
   //vamos dar apenas 5 tentativas pois pode ser que a "calculadora" não existe
   tentativas: integer;
   HandleCalc, HandleCaixaTexto: HWND;  //handles da calculatora
   TamanhoVisor: integer;
   TextoVisor: string;
begin
     //executamos a "calculadora" ou qualquer que seja o programa externo
     ShellExecute(Handle, nil,  'c:\windows\system32\calc.exe', nil, nil, SW_SHOWNORMAL);

     //enquanto não encontrarmos a janela do programa externo DENTRO da janela do nosso programa ou não for atingido o núimero de tentativas nós tentaremos colocar a janela do programa "calculadora" dentro da nossa janela
     while  (FindWindowEx(Handle, 0, 'SciCalc', 'Calculadora') = 0) or (tentativas < 5) do
     begin
          //FindWindowEx procura uma janela dentro de outra e FindWindow apenas procura uma janela
          HandleCalc:= FindWindow('SciCalc', 'Calculadora');
          Windows.SetParent(HandleCalc, Handle);
          Inc(tentativas);
          //um sleep para dar uma pausa de 1 ms
          Sleep(1);
     end;

     if HandleCalc > 0 then
     begin
          //obtem o primeiro filho da janela da calculadora
          HandleCaixaTexto := GetWindow(HandleCalc, GW_CHILD);
          //obtem o tamanho do texto na caixa
          TamanhoVisor:=SendMessage(HandleCaixaTexto, WM_GETTEXTLENGTH, 0, 0) + SizeOf(Char)*1;
          //seta o tamanho desse texto
          SetLength(TextoVisor, TamanhoVisor);
          //obtem o texto gravando-o em  TextoVisor. Integer(TextoVisor) é o mesmo que o endereço do array onde estão os chars da string
          SendMessage(HandleCaixaTexto, WM_GETTEXT, TamanhoVisor, Integer(TextoVisor));
          //mostraremos o texto da calculadora, como está recém iniciada será 0
          ShowMessage(Trim(TextoVisor));
     end;
end; 

Lembre-se que fechar seu programa não fechará a "calculadora" que está aberta. Para isso você deve fechar a calculadora antes ou fechá-la no gerenciador de tarefas.

Em um outro post veremos como podemos gerenciar e fechar tarefas usando a API do windows.

Have fun :)

Comentários

Postagens mais visitadas deste blog

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

Busca de CEP com o Lazarus - Parte 1 - UrlEncode

Uso de memória no SQL Server