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

Criando um cronômetro no Delphi

Esse é um post básico, destinado a quem está iniciando a programação em Delphi ou Lazarus. Vamos criar um cronômetro.

Um cronômetro deve marcar horas, minutos, segundos e milésimos de segundos. Deve ter um botão para iniciar, um para parar e outro para zerar.

Crie a form preta com um label vermelho e três botões, e deixe-a como a figura acima. Coloque também um TTimer e deixe a propriedade interval em 1 milissegundo e a propriedade enabled como false, para ele começar desligado.

O DFM/LFM ficará assim:

object frmvisor: Tfrmvisor
  Left = 405
  Top = 209
  BorderIcons = [biSystemMenu, biMinimize]
  BorderStyle = bsDialog
  Caption = 'Cron'#244'metro'
  ClientHeight = 102
  ClientWidth = 314
  Color = clBlack
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  SnapBuffer = 1
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object lbTempo: TLabel
    Left = 8
    Top = 8
    Width = 294
    Height = 55
    Caption = '00:00:00.000'
    Font.Charset = ANSI_CHARSET
    Font.Color = clRed
    Font.Height = -48
    Font.Name = 'Microsoft Sans Serif'
    Font.Style = [fsBold]
    ParentFont = False
    Transparent = False
    WordWrap = True
  end
  object btInicio: TButton
    Left = 16
    Top = 72
    Width = 75
    Height = 25
    Caption = '&Iniciar'
    TabOrder = 0
    OnClick = btInicioClick
  end
  object btPara: TButton
    Left = 96
    Top = 72
    Width = 75
    Height = 25
    Caption = '&Parar'
    TabOrder = 1
    OnClick = btParaClick
  end
  object btZera: TButton
    Left = 224
    Top = 72
    Width = 75
    Height = 25
    Caption = '&Zerar'
    TabOrder = 2
    OnClick = btZeraClick
  end
  object crono: TTimer
    Enabled = False
    Interval = 1
    OnTimer = cronoTimer
    Left = 16
    Top = 16
  end
end




O código dessa form, o arquivo.pas segue abaixo:

unit visor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, dateutils;

type
  Tfrmvisor = class(TForm)
    btInicio: TButton;
    btPara: TButton;
    btZera: TButton;
    crono: TTimer;
    lbTempo: TLabel;
    procedure cronoTimer(Sender: TObject);
    procedure btInicioClick(Sender: TObject);
    procedure btParaClick(Sender: TObject);
    procedure btZeraClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    fTempo: Ttime;
    fMomento: integer;
  end;

var
  frmvisor: Tfrmvisor;

implementation

{$R *.dfm}

procedure Tfrmvisor.cronoTimer(Sender: TObject);
begin
  ftempo := (GetTickCount - fmomento) * OneMillisecond;
  lbTempo.Caption := formatdatetime('hh:nn:ss.zzz', fTempo);
end;

procedure Tfrmvisor.btInicioClick(Sender: TObject);
begin
  fmomento := GetTickCount;
  crono.Enabled := true;
end;

procedure Tfrmvisor.btParaClick(Sender: TObject);
begin
  crono.Enabled := false;
end;

procedure Tfrmvisor.btZeraClick(Sender: TObject);
begin
  fTempo := 0;
  lbTempo.Caption := formatdatetime('hh:nn:ss.zzz', fTempo);
end;

procedure Tfrmvisor.FormCreate(Sender: TObject);
begin
  self.DouBleBuffered := True; //evitar o flick do relógio.
end;

end.


O principio é simples: Temos uma variavel chamada momento, do tipo inteiro, que armazena este exato momento através do método GetTickCount da API do windows, que traz a quantidade de milissegundos passada desde que se iniciou a máquina, e uma variável Tempo do tipo Time que a cada milissegundo do timer armazenará o GetTickCount de agora (a cada milsec) menos o que estava armazenado em Momento tudo isso multiplicado por OneMilliSecond, que é uma constante racional que armazena o valor de um milissegundo em relação a um dia. Isso porque no Delphi e Lazarus um dia é um inteiro e um milissegundo é uma fração de 1/milissegundos_de_um_dia.

O calculo é esse (GetTickCount - fmomento) * OneMillisecond;

Iniciar captura o momento e liga o timer. Parar simplesmente para o timer. Zerar atribui 0 ao Momento.

Esse foi um post básico do Delphi/Lázarus, mas não abordei como manusear as ferramentas para criar esses arquivos. Talvez em uma futura video - aula?

Você pode baixar o Lazarus aqui: http://sourceforge.net/projects/lazarus/files/ e o fonte deste projeto aqui.

Have Fun ;)

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