Orientação a objeto - melhor lugar para validar CPF

Estou fazendo um curso de java e veio uma duvida em minha cabeca! qual o melhor lugar para validar o cpf ?
Segundo meu professor " O certo e criar uma classe cliente e um packge chamando entidades e criar uma clase validacao dentro de um packge chamado regras de negocio e dentro da classe validacao criar um metodo para valirar cpf. olha minha duvida vem ai
parece que li em algum lugar que o melhor seria criar um metodo privado dentro da clase cliente e validar o cpf la mesmo sem que outra classe soubesse e se nao for valido retornar um erro assim toda vez que eu estanciar a clase cliente a validacao estara la isto fez sentindo para mim porque chamar um metodo validar toda vez nao e muito diferente da maneira procedural de programar. gostaria da opiniao de voces. desde ja muito obrigado

O cliente é sempre pessoa física? Ele sempre terá CPF? O cliente depende disso para existir? Se sim, então essa validação será parte do código de construção do objeto Cliente.

Caso contrário, seria até interessante criar uma classe p/ CPF, dependendo de quanto esse documento vá “voar” pelo sistema.

Olá Gesse,

tudo bem?

Orientação a Objeto esta intimamente relacionada a divisão de responsabilidades.

A pergunta que você deve fazer a si mesmo é: De quem (no sistema) é a responsabilidade de validar um CPF?

Na minha opinião a validação de CPF deve ser um modulo independente do modelo. Seguindo essa linha eu utilizaria uma classe CPFValidator para definir a logica de validação.

Com esse CPFValidator voce tem recursos para validar uma String que represente um CPF. Porem, acredito que no seu caso você queria validar um Cliente que contem um CPF. Sendo assim, precisamos de um recurso que defina esta restricao “Um cliente é válido se seu CPF é valido”. A forma mais elegante que conhece para expressar essa restrição é através de anotações. Veja o exemplo:

[code]public class Pessoa {

private String nome;
@CPF
private String cpf;

}[/code]

Abraços

Pensar na reutilização desse código tbm é interessante… a OO prega isso… Pense comigo, vc coloca a validação de CPF na Classe Cliente, roda seu sistema lindo e maravilhoso com 30 linhas de validação (suposição) de CPF dentro de sua classe…

Está tudo lindo e maravilhoso, quando o seu cliente diz assim… quero controlar os Usuários do sistema, e que os mesmos só sejam cadastrados se possuirem o CPF válido… aí eu lhe pergunto: O que vc fará ?? Vai extender Usuário de Cliente pra validar CPF ? Vai criar uma classe genérica Pessoa e colocara validação lá dentro, fazendo tanto Cliente quanto Usuário extender dela ?? Se vc for fazer um outro sistema e precisar validar CPF pra outro tipo de Pessoa (Fornecedor PF, Dependete financeiro, etc.)

Pense aí… Quando tiver a resposta, vc saberá onde colocar sua validação…

Att.

[quote=Gesse Gon?lves]
Segundo meu professor " O certo e criar uma classe cliente e um packge chamando entidades e criar uma clase validacao dentro de um packge chamado regras de negocio e dentro da classe validacao criar um metodo para valirar cpf" [/quote]

Seu professor não parece ter muita idéia sobre o que está ensinando. Dá tempo de mudar de curso ainda?

Quanto a sua resposta, basicamente, depende do seu domínio. É válido no seu sistema que um CPF exista sem ser válido? Isso serve para algo? É necessário? Faz parte do domínio do teu problema?

Se não, é bem provável que a classe que representa o CPF deva se validar automaticamente e nunca permitir a criação de CPFs inválidos.
Se sim esta regra pode estar em outra classe, que recebe o “CPF candidato” e o valida.

Eu uso a validação de CPF em uma classe separada, a qual retorna um código para CPF válido e outro para inválido.
Fiz um pacote de classes matemáticas, que inclui esta classe CPF, assim posso importar o pacote e reutilizar em todos meus sistemas.
Se alguém quiser o código da validação de CPF, ou toda a classe matemática eu posto aqui.