Mudanças entre as edições de "Tiny Types"
De Grupo Acert
Linha 14: | Linha 14: | ||
− | var | + | var |
− | + | Pessoa: TPessoa; | |
− | begin | + | begin |
− | + | // ... | |
− | + | Pessoa.Nome := 'Tecsystem'; | |
− | + | 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 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 CNPJ: TCNPJ read FCNPJ write FCNPJ; | |
− | end; | + | end; |
− | var | + | var |
− | + | Pessoa: TPessoaNova; | |
− | begin | + | begin |
− | + | Pessoa.Nome := 'Tecsystem'; | |
− | + | Pessoa.CNPJ := '99.999.999/0001-91'; | |
− | + | 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; | |
− | public | + | public |
− | + | class operator Implicit(const CNPJ: string): TCNPJ; | |
− | + | class operator Implicit(const CNPJ: TCNPJ): string; | |
− | + | 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. |