Dicas/sugestões sobre essa validação de models

3 respostas
mcbarsotti

Eae galera!

Estou desenvolvendo um módulo de validação em uma aplicaçao e gostaria da opinião de vcs a respeito da mesma:

Todas as classes que tem a responsabilidade de efetuar uma validação em qualquer objeto, deve implementar essa interface:

/**
 * Interface usada para fazer efetuar as validacoes em objetos gerais.
 * @author Danilo Barsotti
 */
public interface ValidationBase{

	public boolean isValid();
	
	public List<String> getMessages();
	
}

Exemplo de uma classe que implementa a interface acima:

public class UserValidationTest implements ValidationBase{

	private UserModelMock userModel;
	
	public UserValidationTest(UserModelMock userModel){
		this.userModel = userModel;
	}
	
	@Override
	public List<String> getMessages() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean isValid() {
		if(!"".equals(userModel.getNome())){
			return true;
		}else{
			return false;
		}
	}

}

Os models que necessitam de validações devem estender essa classe:

/**
 * Todos os models que necessitarem de validacao deverao estender
 * dessa classe.
 * 
 * @author Danilo Barsotti
 *
 */
public abstract class ModelValidatedBase extends ModelBase{

	private ValidationBase validation = getValidationBase();
	
	public abstract ValidationBase getValidationBase();
	
	public boolean isValid(){
		return validation.isValid();
	}
	
	public List<String> getMessages(){
		return validation.getMessages();
	}
	
}

Um exemplo de model que estende a classe acima:

public class UserModelMock extends ModelValidatedBase{

	private String nome;
	
	
	@Override
	public ValidationBase getValidationBase() {
		return new UserValidationTest(this);
	}


	public String getNome() {
		return nome;
	}


	public void setNome(String nome) {
		this.nome = nome;
	}
}

E o uso de tudo isso ficaria assim ( para se efetuar a validação do model ):
( o teste ficou ridiculo pois ainda estou desenvolvendo. 8) )

public class ValidationTest extends TestCase{

	public void testValidation() throws Exception{
		UserModelMock user = new UserModelMock();
		user.setNome("Danilo");
		assertEquals(true, user.isValid());
	}
	
	public static void main(String args[]) throws Exception{
		ValidationTest val = new ValidationTest();
		val.testValidation();
	}
}

A idéia é facilitar a programação das validações dos models, deixando a responsabilidade para o proprio model de efetuar sua validação ( até a validação não sair do dominio da mesma ).

Oque vcs acham disso?
ficaria melhor se eu injetar na ModelValidatedBase o ValidationBase usando Spring?
Alguma dica/critica/sugestão??

Obrigado a todos!!!

3 Respostas

Y

Eu uso uma forma bem parecida de validacao, na maioria dos casos pra ser utilizada na hora de persistir o objeto. Antes de passar para a camada de persistencia é feita a validação.

A unica advertencia que eu faria no seu caso é de nao herdar de uma classe padrao. Talvez seja melhor o proprio objeto implementar a interface.

mcbarsotti

Opaa!! legal vc ter respondido!!

vc poderia explicar o motivo de nao herdar? um caso de uso.

valeu hein!!

Y

Sempre que vc herda de uma classe vc faz um forte acoplamento com essa classe da qual herdou. Em algum ponto, e nesse caso é bastante previsivel, alguma das duas implementacoes pode precisar de uma mudanca radical. Nesse momento vc terá problemas em toda a hierarquia.

Apenas implementando uma interface vc obtem os mesmos beneficios sem se prender a implementacao de uma classe pai. Principalmente nesse exemplo onde nem aproveitamento de código haverá. (Mesmo se houvesse, seria melhor uma composicao e nao a heranca).

A principio, nunca use heranca. Voce encontrará casos em que precisara dela, mas fuja sempre que possivel.

Criado 12 de janeiro de 2009
Ultima resposta 14 de jan. de 2009
Respostas 3
Participantes 2