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

Busca de CEP com o Lazarus - Parte 4 - Testando e Usando o TLazCep

Antes de começar a fazer as alterações e melhorias prometidas na parte 3, vamos mostrar como deve ser o uso da biblioteca TLazCep. Adicione um botão e dois memos a form que estivemos usando até agora.

Lembrando: essa form já tem 3 edits (edCep, edChave e edUrl) e agora ficará com 4 memos (mRequest, mResponse, mXML e mEndereco)

Os memos mRequest e mResponse são de nossos exemplos anteriores e não serão usados por enquanto. Só quando falarmos de proxy.

Deixe o formulário como a imagem abaixo,


O LFM do formulário ficará assim:

object Form1: TForm1
  Left = 252
  Height = 314
  Top = 281
  Width = 718
  Caption = 'Form1'
  ClientHeight = 314
  ClientWidth = 718
  LCLVersion = '0.9.28.2'
  object Label1: TLabel
    Left = 8
    Height = 14
    Top = 0
    Width = 20
    Caption = 'CEP'
    ParentColor = False
  end
  object Label2: TLabel
    Left = 96
    Height = 14
    Top = 0
    Width = 32
    Caption = 'Chave'
    ParentColor = False
  end
  object Label3: TLabel
    Left = 280
    Height = 14
    Top = 0
    Width = 20
    Caption = 'URL'
    ParentColor = False
  end
  object mResquest: TMemo
    Left = 8
    Height = 226
    Top = 80
    Width = 176
    Lines.Strings = (
      '"Conversas" HTTP:'
      '============'
    )
    TabOrder = 0
  end
  object mResponse: TMemo
    Left = 192
    Height = 226
    Top = 80
    Width = 168
    Lines.Strings = (
      'Respostas:'
      '============='
    )
    TabOrder = 1
  end
  object edCep: TEdit
    Left = 8
    Height = 21
    Top = 16
    Width = 80
    TabOrder = 2
    Text = '01136-001'
  end
  object btTestarTlazCep: TButton
    Left = 368
    Height = 25
    Top = 48
    Width = 120
    Caption = 'Testar Classe TLazCep'
    OnClick = btTestarTlazCepClick
    TabOrder = 3
  end
  object btTeste: TButton
    Left = 112
    Height = 25
    Top = 48
    Width = 136
    Caption = 'Testar HttpSend Direto'
    OnClick = btTesteClick
    TabOrder = 4
  end
  object btTestaUrlEncode: TButton
    Left = 8
    Height = 25
    Top = 48
    Width = 96
    Caption = 'Testa UrlEncode'
    OnClick = btTestaUrlEncodeClick
    TabOrder = 5
  end
  object edUrl: TEdit
    Left = 280
    Height = 21
    Top = 16
    Width = 272
    TabOrder = 6
  end
  object edChave: TEdit
    Left = 96
    Height = 21
    Top = 16
    Width = 179
    TabOrder = 7
    Text = '1Z3s3/2ZjDt.dcyiLuBy/6mitlDNgt/'
  end
  object mXml: TMemo
    Left = 368
    Height = 226
    Top = 80
    Width = 168
    Lines.Strings = (
      'XML:'
      '============'
    )
    TabOrder = 8
  end
  object mEndereco: TMemo
    Left = 544
    Height = 226
    Top = 80
    Width = 168
    Lines.Strings = (
      'Endereço:'
      '============'
    )
    TabOrder = 9
  end
end

e no evento onClick do botão "Testar Classe LazCep" coloque o código:

procedure TForm1.btTestarTlazCepClick(Sender: TObject);
begin
     with TLazCep.Create do
     try
          Cep:=edCep.Text;
          Consultar; //ou ConsultarString;
          mXml.Lines.Append(GetXML);
          mEndereco.Lines.Append(Logradouro);
          mEndereco.Lines.Append(Bairro);
          mEndereco.Lines.Append(Cidade);
          mEndereco.Lines.Append(Estado);
          mEndereco.Lines.Append(IBGECidade);
          mEndereco.Lines.Append(IBGEEstado);
          mEndereco.Lines.Append(IBGEVerificador);
     finally
            Free;
     end;   
end;  

Colocando para rodar você perceberá um problema: Não aparecem os acentos corretamente.

do Bosque
Barra Funda
S?o Paulo
SP
355030
35
3550308

Coisa parecida pode ter acontecido com a própria exibição do XML.




Isso é porque o que chega do XML são WideStrings de 16 bits (lembra das DomStrings?) e os edits não suportam esse tipo de formato. Ocorrem perdas de dados ao se converter as widestrings para strings comuns. A grande vantagem é que a LCL (conjunto de componentes visuais do lazarus, como a VCL do Delphi: edits, memos etc) suporta strings em formato utf-8. Então podemos usar a função AnsiToUtf8. Isso corrigirá o problema dos acentos.


Endereço:
============
do Bosque
Barra Funda
São Paulo
SP
355030
35
3550308

Já falando sobre proxy, teremos que criar uma função que use o GET, mas passando para a classe HTTPSend o proxy.


Vimos como trazer o conteudo de uma página web com as funções HttpGetBinary e HttpGetText, porém elas não funcionam com proxy, mas vamos dar uma olhada de perto na HttpGetBinary:

function HttpGetBinary(const URL: string; const Response: TStream): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    Result := HTTP.HTTPMethod('GET', URL);
    if Result then
    begin
      Response.Seek(0, soFromBeginning);
      Response.CopyFrom(HTTP.Document, 0);
    end;
  finally
    HTTP.Free;
  end;
end; 

E vamos adicionar as linhas, logo acima, entrando no try:
HTTP.ProxyHost := [[Seu servidor de proxy]];
    HTTP.ProxyPort := [[porta]];
    HTTP.ProxyUser := [[login]];
    HTTP.ProxyPass := [[senha]]; 

Você pode mudar o nome da função, para ProxyHttpGetBinary, ou pode, mais corretamente, manter o mesmo nome e extender sua assinatura, aumentando o número de parâmetros. (overload). Isso é polimorfismo. Você não precisa fazer isso na propria unit HTTPSend, mas pode fazer em uma unit sua dedicada a isso (http) ou na propria unit do TLazCep, que foi o que fizemos.


As novas funções ficarão assim:


function HttpGetBinary(const URL: string; const Response: TStream;
         ProxyHost, ProxyPort, ProxyUser, ProxyPass: string): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    HTTP.ProxyHost := ProxyHost;
    HTTP.ProxyPort := ProxyPort;
    HTTP.ProxyUser := ProxyUser;
    HTTP.ProxyPass := ProxyPass;
    Result := HTTP.HTTPMethod('GET', URL);
    if Result then
    begin
      Response.Seek(0, soFromBeginning);
      Response.CopyFrom(HTTP.Document, 0);
    end;
  finally
    HTTP.Free;
  end;
end;

function HttpGetText(const URL: string; const Response: TStrings;
         ProxyHost, ProxyPort, ProxyUser, ProxyPass: string): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    HTTP.ProxyHost := ProxyHost;
    HTTP.ProxyPort := ProxyPort;
    HTTP.ProxyUser := ProxyUser;
    HTTP.ProxyPass := ProxyPass;
    Result := HTTP.HTTPMethod('GET', URL);
    if Result then
      Response.LoadFromStream(HTTP.Document);
  finally
    HTTP.Free;
  end;
end;  


Legal, agora para onde (ou por onde) repassaremos essas informações de proxy? Teremos que alterar a classe TLazCep, colocando essas quatro propriedades (ProxyHost, ProxyPort, ProxyUser e ProxyPass).

Veremos isso na próxima parte desse tutorial, mostrando como podemos embutir o proxy e a conversão para UTF-8 dentro da propria classe TLazCep, como podemos melhorar certas funções, como a urlEncode e mais.


Podemos ainda expandir bastante este artigo. Alguma sugestão?


Have Fun ;)





Ir Para:


Parte 1 | Parte 2 | Parte 3 | Parte 4 | Parte 5

Comentários

Postagens mais visitadas deste blog

Busca de CEP com o Lazarus - Parte 1 - UrlEncode

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

Uso de memória no SQL Server