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