Validação dos atributos na criação de um objeto

5 respostas
C

Caros colegas

Gostaria de algumas dicas do que seria melhor no momento de validar os atributos na criação de um objeto de uma classe qualquer.
Essa validação deveria ficar na interface???
Essa validação deveria ficar na classe de negócio???

Para tentar ilustrar melhor, criei uma classe cliente que tem dois atributos e seus respectivos métodos e validações. Também criei uma outra classe somente para fazer um teste, imaginem que esta seja a classe de interface. Pelo que já li sobre o assunto, me pareceu uma boa saída. Gostaria de opiniões se realmente posso continuar por esse caminho na construção das minhas aplicações.

Classe Cliente com as validações
public class Cliente {
	private int codigo;
	private String nome;
	
	public Cliente (){
	}
	
	public Cliente (int codigo, String nome) {
		setCodigo(codigo);
		setNome(nome);
	}
	
	public void setCodigo(int codigo) throws IllegalArgumentException {
		if (codigo <=0)
			throw new IllegalArgumentException("Codigo Invalido", new Throwable("Cliente.codigo"));
		else
			this.codigo = codigo;
	}
	
	public void setNome(String nome) throws IllegalArgumentException {
		if (nome == null || nome.trim().length()==0)
			throw new IllegalArgumentException("Nome invalido", new Throwable("Cliente.nome"));
		else
			this.nome = nome;
	}
	
	public int getCodigo() {
		return this.codigo;
	}
	
	public String getNome() {
		return this.nome;
	}
}
Classe que simula a interface gráfica
import javax.swing.*;

public class Cadastro {
	public static void main (String args[]) {
		int codigo = Integer.parseInt(JOptionPane.showInputDialog("Informe o Codigo"));		
		String nome = JOptionPane.showInputDialog("Informe o Nome");
		
		try {
			Cliente c = new Cliente(codigo, nome);
			
			// faz o que tem que fazer com o objeto e coisa e tal
		}
		catch(Exception ex) {
			JOptionPane.showMessageDialog(null, ex.getMessage());
			
			if (ex.getCause().getMessage().equals("Cliente.codigo"))
				JOptionPane.showMessageDialog(null, "O erro ocorreu no codigo do cliente");
				
			if (ex.getCause().getMessage().equals("Cliente.nome"))
				JOptionPane.showMessageDialog(null, "O erro ocorreu no nome do cliente");
		}
		
		System.exit(0);
	}
}

5 Respostas

programaker

Caramba! Outro dia eu estava “filosofando” sobre a mesma coisa!

Bom, não sou nenhum expert no assunto, mas eu imagino que o ideal seja colocar as validações no objeto, pois considero que elas são parte das regras de negócio do sistema e sendo assim, não é responsabilidade da interface com o usuário cuidar disso.

Além do mais, se você precisar manipular este mesmo objeto em interfaces com usuário diferentes (uma swing e outra web por exemplo), ou em pontos diferentes do sistema, você teria que replicar as validações em cada um destes pontos/interfaces ao invés de reutilizar as que já estão implementadas no tal objeto (e redundância de código não é uma coisa bonita).

No mais, espero ter ajudado em alguma coisa!

peczenyj

acho melhor vc validar na camada de negocio, tratando o erro na interface.

ai por uma questão de USABILIDADE vc pode colocar algumas validações na interface.

C

Valeu moçada… Obrigado pelas informações…

dsiviotti

O problema desse código é que você está tratando a excessão ao criar um Cliente por que você já sabe que pode dar erro no constructor. Algum desavisado não iria fazer isso e o programa ia dar pau feio!
Já que você pretende lançar uma excessão se o código ou nome forem inválidos, deixe isso claro para no constructor da classe.

public class Cliente {
 	private int codigo;
 	private String nome;
 	
 	public Cliente (){
 	}
 	
 	public Cliente (int codigo, String nome) throws IllegalArgumentException {
 		if (codigo <=0)
 			throw new IllegalArgumentException("Codigo Invalido", new Throwable("Cliente.codigo"));
 		if (nome == null || nome.trim().length()==0)
 			throw new IllegalArgumentException("Nome invalido", new Throwable("Cliente.nome"));
 		setCodigo(codigo);
 		setNome(nome);
 	}
 	
 	public void setCodigo(int codigo) throws IllegalArgumentException {
 		this.codigo = codigo;
 	}
 	
 	public void setNome(String nome) throws IllegalArgumentException {
 		this.nome = nome;
 	}
 	
 	public int getCodigo() {
 		return this.codigo;
 	}
 	
 	public String getNome() {
 		return this.nome;
 	}
 }
C

Putz… É verdade… Obrigado

Criado 3 de junho de 2006
Ultima resposta 6 de jun. de 2006
Respostas 5
Participantes 4