Melhor Maneira de Fazer Validação

20 respostas
71C4700

Enquanto desenvolvia, percebi que muitas validadções que tinham de ser feitas eram feitas nas classes ou metodos errados
Agora, resolvi,refatorar, para tentar validar estes em um unico local.
O problema é que queria tambem criar depois um validador especifico para cada objeto, caso seja necessario ou algum desenvolvedor da equipe necessite.

A melhor solução encontrada até agora foi com o uso de enumerações, mas fica amarrado a determinado objeto.

Sugestões sobre a melhor forma de resolver esta situação ??

Agradeço !!

20 Respostas

71C4700

Alguem ? :cry:

Giulliano

vc pode usar Reflections, AOP e Anotação. Qagora precisa ver qual desses vc domina…

71C4700

Como assim com a AOP ?
Estou usando Reflection e Anotações, mas AOP …
Poderia explicar melhor ?

Giulliano

Então cara…AOP seria a mais bizarra de todas. Então eu sugiro que vc continue nas anotações e no reflection. AOP seria um modo trabalhoso de fazer.

Entendendo-se que AOP trata aspectos de software a necessidade de validações pode ser vista como um aspecto ou não. O que precisa analizar é o quão trabalhoso será desenvolver isso e qual será faclilidade de dar manutenablidade no código pós desenvolvido.

71C4700

Obrigado, mas …
Bem a duvida é a seguinte, eu irei recuperar um objeto, ai tenho que saber se os valores que foram setados são valores validos.
Teria uma maneira melhor de ser resolvido.
Exemplo:
Tenho um objeto, mas quero saber se todos os valores vindos da interface podem ser valores atribuidos a este objeto, pra não acontecer o seguinte

Pessoa pessoa = new Pessoa();// Objeto criado
pessoa.setIdade("Fulano"); // Valorr recebido e pasado para setar o objeto

Este é oo problema!
Temos que validar os valores antes de atribui-los aos seus respectivos objetos!!!

sergiotaborda

71C4700:
Enquanto desenvolvia, percebi que muitas validadções que tinham de ser feitas eram feitas nas classes ou metodos errados
Agora, resolvi,refatorar, para tentar validar estes em um unico local.
O problema é que queria tambem criar depois um validador especifico para cada objeto, caso seja necessario ou algum desenvolvedor da equipe necessite.

A melhor solução encontrada até agora foi com o uso de enumerações, mas fica amarrado a determinado objeto.

Sugestões sobre a melhor forma de resolver esta situação ??

Esqueça enumerações.
Vc mesmo valor a solução : criar um objeto validador para cada objeto a ser validado.
Utilize-se do padrão composite para criar uma estrutura de validadores. Ima interface para o validador e um objeto onde colocar
o resultado da validação são boas ideias tb

public interface Validador<T>{

    public ResultadoValidação valida(T obj);
}
sergiotaborda

71C4700:
Obrigado, mas …
Bem a duvida é a seguinte, eu irei recuperar um objeto, ai tenho que saber se os valores que foram setados são valores validos.
Teria uma maneira melhor de ser resolvido.
Exemplo:
Tenho um objeto, mas quero saber se todos os valores vindos da interface podem ser valores atribuidos a este objeto, pra não acontecer o seguinte

Pessoa pessoa = new Pessoa();// Objeto criado
pessoa.setIdade("Fulano"); // Valorr recebido e pasado para setar o objeto

Este é oo problema!
Temos que validar os valores antes de atribui-los aos seus respectivos objetos!!!

Não!!
Temos que validar os objetos depois que atribuirmos os valores às suas propriedades.
E
O objeto tem que consistir o seu estado quando uma propriedades é alterada.

Nunca vai ser possivel setar um string num campo int pq o java não deixa.
Se o valor do int é aceitável é uma questão de validação.

Pessoa p = new Pessoa();
p.setNome(request.getParameter("nome");
p.setDataNascimento(parseDate(request.getParameter("nascimento"));

ValidadorPessoa validador = new ValidadorPessoa ();

Resultado res = validador.valida(p);
if (! res.isValido()){
   // não é válido , avisa o usuário.
}

// continua para o processo
71C4700

Certo.
Mais o grande problema que temos é que.
Não temos a referencia do objeto apenas sua classe.
Ai temos que vallidar
[b]

  1. Tipos
  2. Intevalos de valores
  3. Valores vindos da interface gráfica
    [/b]
    Este é o nosso real problema !!
71C4700

Alguem ? :cry:

71C4700

alguma solução sem ser com enumeração ???

Giulliano

então vc esta dizendo q os valores vem aleatoriamente e não se sabe se ele é um Integer, uma String um Doubel ou seja lá o que for…é isso ??? Mais ou menos como se eles viessem de um array de valores e vc quer validar antes de dar os “set” ???

é isso ??

71C4700

Mais ou menos isso
mas na interface visual os campos do objeto já estam mapeado
???

Giulliano

71C4700:
Mais ou menos isso
mas na interface visual os campos do objeto já estam mapeado
???

Na interface visual os campos estão mapeados pra onde ??? Você já diz na view pra onde vai um valor quando der um submit ?

Ednelson

Sugiro vc dar uma olhada no Hibernate Validator, enquanto nao sai a jsr de validacao. Mesmo pq a jsr e o hibernate validator tem como spec leader o mesmo cara.

71C4700

Giulliano:

Na interface visual os campos estão mapeados pra onde ??? Você já diz na view pra onde vai um valor quando der um submit ?

Os campos estão mapeados para qual atributo do bean esta visão irá realizar o CRUD
É uma aplicação Desktop, onde temos uma disbrituição de camada baseada no MVC,
A responsabilidade da visão se rezumiria apenas a indentificar qual bean ela esta mapeada !!!
A partir da view, iria se contruido o objeto ai sim ele seria validado, ou melhor seria validado primeiro antes da construção!
Este é o problema validar ele sem poder instanciar pois isso será feito por uma Factory.

Sugestões ?

71C4700

Esqueci no topico anterior…
Muita coisa esta sendo feita por outra classe como a instanciação do objeto que é mapeado na inteface swing.
Agradeço pelas ajudas

M

Alô pessoal!!

Peço desculpas, sou novo aqui no forum…
Gostaria de saber se alguem pode ajudar-me com isto:

estou a tentar fazer uma validação, isto é, pretendo que só passe os registos que tenham um número valido no campo Nº Cadastro (exemplo: 001). Caso contrario, que surja uma mensagem a dizer que deve ser inserido valores validos no campo.

Aqui vai o trecho do codigo

private class ManipulaBotaoCD implements ActionListener

{

public void actionPerformed(ActionEvent eventoObjecto)

{

String strComandoSQL, strTitulo, strInterpretes, strNumeroDiscos, strDataAquisicao, strObservacoes, strInclusos, strNCadastro;

int intRegistro, aux;
aux = Integer.parseInt(fldNCadastro.getText());

			if ((eventoObjecto.getSource() == btnGravar) && (aux != 000) && (fldNCadastro.getText()!= null))
			{
				try
				{
					Conexao = DriverManager.getConnection(RegistrosDB, "root", "junior");

					strTitulo = fldTitulo.getText();
					strInterpretes = fldInterpretes.getText();
                                            strNumeroDiscos = fldNumeroDiscos.getText();
					strDataAquisicao = fldDataAquisicao.getText();
					strObservacoes = fldObservacoes.getText();
					strInclusos = fldInclusos.getText();
                                            strNCadastro = fldNCadastro.getText();
					strComandoSQL = "INSERT INTO dadoscd (Titulo,Interpretes,NumeroDiscos,DataAquisicao,Observacoes,Inclusos, NCadastro) " +
									"VALUES (" +
									"\"" + strTitulo + "\"," +
									"\"" + strInterpretes + "\"," +
                                                                            "\"" + strNumeroDiscos + "\"," +
                                                                            "\"" + strDataAquisicao + "\"," +
									"\"" + strObservacoes + "\"," +
                                                                            "\"" + strInclusos + "\"," +
									"\"" + strNCadastro + "\")";

					Comando = Conexao.createStatement();
					intRegistro = Comando.executeUpdate(strComandoSQL);

					if (intRegistro != 0)
						JOptionPane.showMessageDialog(null, "CD Adicionado !", "Mensagem", JOptionPane.INFORMATION_MESSAGE);

					Comando.close();
					Conexao.close();

					fldTitulo.setText("");
					fldInterpretes.setText("");
                                            fldNumeroDiscos.setText("");
					fldDataAquisicao.setText("");
					fldObservacoes.setText("");
					fldInclusos.setText("");
                                            fldNCadastro.setText("");
					
				}
				catch (Exception Excecao)
				{
					JOptionPane.showMessageDialog(null, "SQLException: " + Excecao.getMessage(), "Erro: Adição de registro", JOptionPane.INFORMATION_MESSAGE);
				}
                                    setVisible(false);
			}
                            else
                            {
                                JOptionPane.showMessageDialog(null, "Nº de Cadastro vazio !", "Mensagem", JOptionPane.INFORMATION_MESSAGE);
                                setVisible(false);
                            }
		}
	}
            
}

Muito Obrigado a todos.
Abraço

faelcavalcanti

procure separar validacao com logica de negocios, se bem que as vezes uma logica necessita ou depende de uma validacao como pre-condicao.

acho interessante que a validacao fique em uma camada intermediaria a logica de negocio, ou seja, a partir da chamada por implementacao de servico, automaticamente teria alguma validacao padrao para questao de consistencia, concorrencia, e suas objecoes especificas.

a partir dai cada entidade de dominio teria sua implementacao generica + objecoes que a funcionalidade a determina possuir, a fim de manter a consistencia de seu estado e situacoes dentro de sua maquina de estados.

71C4700

O problema é que esta solução deve funcionar pra qualquer objeto!
Pois na interface grafica nao terá acesso propriamente dito ao objeto que ela manipula

faelcavalcanti

procure avaliar o caso em que a partir do próprio cliente será validado, mas lembre-se que é essencial que sua regra de negócios esteja precavida para o caso de uma validação no cliente falhar.

neste caso você já estará antecipando um conjunto de regras básicas para o cliente ajustar no formulário, conforme preenchidos/selecionado e não ter que ficar fazendo várias requisições como no jogo dos sete erros.

isto mesmo!

Criado 8 de setembro de 2008
Ultima resposta 12 de set. de 2008
Respostas 20
Participantes 6