Mudanças entre as edições de "Tiny Types"

De Grupo Acert
Ir para: navegação, pesquisa
Linha 14: Linha 14:
  
  
var
+
  var
  Pessoa: TPessoa;
+
    Pessoa: TPessoa;
begin
+
  begin
  // ...
+
    // ...
  Pessoa.Nome := 'Tecsystem';
+
    Pessoa.Nome := 'Tecsystem';
  Pessoa.CNPJ := '99.999.999/0001-91';
+
    Pessoa.CNPJ := '99.999.999/0001-91';
end;
+
  end;
  
 
O problema aparece quando queremos adicionar mais utilidade ao codigo, como por exemplo validação, formatação, entre várias outras possibilidades. Nesse caso poderiamos incluir essas utilidades na classe TPessoa, o que tornaria difícil do reuso do código.
 
O problema aparece quando queremos adicionar mais utilidade ao codigo, como por exemplo validação, formatação, entre várias outras possibilidades. Nesse caso poderiamos incluir essas utilidades na classe TPessoa, o que tornaria difícil do reuso do código.
Linha 27: Linha 27:
  
  
TClasseUtils = class
+
  TClasseUtils = class
public
+
  public
  class function ValidaCNPJ(const CNPJ: string): string;
+
    class function ValidaCNPJ(const CNPJ: string): string;
  class function GetCNPJFormatado(const CNPJ: string): string;
+
    class function GetCNPJFormatado(const CNPJ: string): string;
end;
+
  end;
  
  
Linha 37: Linha 37:
  
  
if TClasseUtils.ValidaCNPJ(Pessoa.CNPJ) then
+
  if TClasseUtils.ValidaCNPJ(Pessoa.CNPJ) then
  // ...
+
    // ...
  
 
Usando o Tiny Types
 
Usando o Tiny Types
Linha 45: Linha 45:
  
  
TPessoaNova = class
+
  TPessoaNova = class
public
+
  public
  property Nome: string read FNome write FNome;
+
    property Nome: string read FNome write FNome;
  property CNPJ: TCNPJ read FCNPJ write FCNPJ;
+
    property CNPJ: TCNPJ read FCNPJ write FCNPJ;
end;
+
  end;
 
   
 
   
var
+
  var
  Pessoa: TPessoaNova;
+
    Pessoa: TPessoaNova;
begin
+
  begin
  Pessoa.Nome := 'Tecsystem';
+
    Pessoa.Nome := 'Tecsystem';
  Pessoa.CNPJ := '99.999.999/0001-91';
+
    Pessoa.CNPJ := '99.999.999/0001-91';
  if Pessoa.CNPJ.EhValido() then
+
    if Pessoa.CNPJ.EhValido() then
    // ...
+
      // ...
end;
+
  end;
  
 
Isso pode ser possível através do uso de Tiny Types. O padrão indica o uso de uma classe para resolver o problema, mas o Delphi oferece um tipo de dados mais interessante nesse caso que é o record type. A interface do record seria basicamente isso:
 
Isso pode ser possível através do uso de Tiny Types. O padrão indica o uso de uma classe para resolver o problema, mas o Delphi oferece um tipo de dados mais interessante nesse caso que é o record type. A interface do record seria basicamente isso:
  
  
TCNPJ = record
+
  TCNPJ = record
private
+
  private
  FValor: string;
+
    FValor: string;
public
+
  public
  class operator Implicit(const CNPJ: string): TCNPJ;
+
    class operator Implicit(const CNPJ: string): TCNPJ;
  class operator Implicit(const CNPJ: TCNPJ): string;
+
    class operator Implicit(const CNPJ: TCNPJ): string;
  function EhValido(): Boolean;
+
    function EhValido(): Boolean;
  // ...
+
    // ...
end;
+
  end;
  
 
A implementação é normal, com exceção do operator overloading class operator implicit que resolve um erro em tempo de compilação ao tentar atribuir um valor a uma property do tipo record.
 
A implementação é normal, com exceção do operator overloading class operator implicit que resolve um erro em tempo de compilação ao tentar atribuir um valor a uma property do tipo record.

Edição das 09h33min de 7 de janeiro de 2015