Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Por que criar ProdutoValidation?

Uma dúvida conceitual. Não tenho nenhuma segurança nas premissas abaixo. Somente gostaria de aprender mais com os participantes do fórum.

A idéia básica por trás de OOP é que dados e comportamento (sobre esses dados) são inseparáveis e são acoplados pela conceito de um objeto de uma classe. O objeto tem dados e métodos que funcionam com esse (e outros dados).

No nosso projeto base, foi criada um classe ProdutoValidation, mas validação dos atributos, talvez nos setters via Exception, não seria um papel da classe produto? Sei que pode ser um questão de abordagem, mas gostaria de saber a opinião sob a ótica OOP e como melhor modelar uma solução.

2 respostas

Olá Rodrigo,

Realmente é uma questão de abordagem.

Pensando no conceito básico de qualquer objeto, poderíamos sim tirar proveito de tudo que a classe (object model) nos oferece para interagir com o estado do objeto, sendo assim os próprios setters (e até mesmo os construtores) poderiam nos ajudar a restringir a alteração deste estado.

A questão é que talvez todo esse código que tem por objetivo validar dados pode ficar espalhado por diversos setters, aumentando a responsabilidade de cada um deles. A cada alteração de regras de validação talvez teríamos, entre linhas de código para outros fins, encontrar o ponto adequado para realizar a manutenção. Se quisermos testar unitariamente nossa lógica de validação, precisaríamos também aferir todos os comportamentos dos setters do nosso objeto de domínio, esperando ou não por exceptions de validação.

Extrair essas regras de validação para os chamados Validators, facilita essas questões. Temos todo código que representa validação de um modelo, isolado em uma única classe, contendo essa como sua única responsabilidade. A manutenção, evolucão e testabilidade também podem ser favorecidas.

A grosso modo, é como se tivéssemos uma "camada" de validação auxiliando nossa regra. A partir da aplicação da validação nosso objeto de domínio e seus comportamentos podem permanecer bem enxutos e mesmo assim ter a segurança de trabalhar com dados válidos.

Outro ponto que podemos perceber é que utilizando frameworks como por exemplo o Spring MVC, já podemos tirar proveito de toda essa estrutura que já vem pronta, incluindo validação de entrada, apresentação de erros de validação, etc, sem muito esforço.

Enfim, um pouco da minha opinião sobre o caso. Espero ter contribuído.

Abraço

solução!

Olá Rodrigo, tudo bem?

Vou colocar abaixo uma opinião pessoal sobre o assunto. A classe Produto deve possuir atributos e métodos pertinentes a um objeto do tipo Produto, como por exemplo preço, nome, peso, tamanho, etc. A validação em si irá validar esses parâmetros, mas não podemos dizer que seus atributos e métodos são inerentes a um objeto do tipo Produto. Consegue perceber a diferença?

Essa importância de coesão pode não ser tão crítica em projetos menores, mas a partir do momento que é necessário realizar projetos em maior escala, começa-se a perceber a importância de realizar essa análise e verificar se uma classe faz mais coisas do que deveria ou se ela possui atributos e métodos que são pertinentes a ela.

Consegui ajudar de alguma forma?

Abs