Validação de Campos

10 respostas
D

Olá pessoal, estou há horas fazendo um trabalho para conclusão da disciplina de Programação Orientada a Objetos. Trata-se de um sistema bibliotecário com GUI, e já estou sem criatividade para criar códigos “elegantes”, principalmente para validação de campos. Então comecei a criar algumas gambiarras como a que segue abaixo (ela faz parte do controller):

public void insert(String name_publisher, String street_contact, String number_contact, String zip_code_contact, String complement_contact, String city_contact, String state_contact, String phone_contact, String email_contact) { if (validateString(name_publisher)) { if (validateString(street_contact)) { if (validateString(number_contact)) { if (validateString(city_contact)) { if (validateString(state_contact)) { this.publisher_dao.insert(new Publisher( name_publisher, new Contact( street_contact, number_contact, zip_code_contact, complement_contact, city_contact, state_contact, phone_contact, email_contact))); } else { System.out.println("Estado inválido."); //Estas mensagens são apenas para testes, pretendo usar JOptionPane para exibir esta informação. } } else { System.out.println("Cidade inválida."); } } else { System.out.println("Número Predial inválido."); } } else { System.out.println("Rua inválida."); } } else { System.out.println("Nome inválido."); } }

Sei que esta solução está muito longe do ideal (e põe longe nisso :smiley: ), então gostaria da contribuição de vocês com sugestões para melhorias neste caso e em casos parecidos. Desde já muito obrigado.

10 Respostas

R

MEU DEUS!!!

daqui a alguns minutos cuidado pra nao cair no chao babando de tanto if que voce tem, ehehehehehe…

Vou pensar em algo aqui e ja te falo!!

flw =D

R

Uma pergunta, esse tanto de variaveis, estao em que classe ?

Cola a classe aqui please

nel

Algo importante douglasfborba. O teu insert me parece a nível DAO.
O ideal é que ele receba como parâmetro um objeto e não vários parâmetros, conforme você fez.
A camada de serviço, que vai usufruir do DAO, é que deve ter a preocupação em verificar quais campos são obrigatórios e lançar uma exceção, caso algum não esteja preenchido.

Infelizmente, tratativas de tela normalmente são maçantes e nos obrigam a verificações desse tipo.
O que tu pode fazer é criar um Map ou List com os campos obrigatórios e fazer a validação da lista.
Podes talvez partir para algum pattern, mas o que me vem a cabeça agora é o Strategy e não sei se é aplicável a sua necessidade, é de se pensar.

D

rof20004:
Uma pergunta, esse tanto de variaveis, estao em que classe ?

Cola a classe aqui please

rof20004 esta é uma tentativa de implementar o MVC, não sei se estou fazendo isso de forma correta, mas acredito que estou no caminho. Para isso, criei uma classe chamada PublisherController da qual o método acima faz parte e que apresenta os métodos: insert(), update(), delete(), searchId() e listAll(). Estes métodos irão receber os valores vindos dos campos do formulário. A ideia é fazer todo o tratamento dos valores nestes métodos antes de passá-los como parâmetro para o método PublisherDao().insert(). Meu objetivo é deixar a classe do formulário o mais simples possivel.

R

Entao, acho que ficaria mais simples voce passar um objeto no parametro, e dentro do metodo voce faz as validacoes, porque alem de a assinatura ficar grande, voce pode se confundir com os restantes das variaveis.

Um exemplo que quero lhe dizer é assim:

No metodo do controller onde chamo o dao.insert, eu tenho um metodo chamado validaCampos, que consiste em verificar se os no minimo os campos obrigatorios estao preenchidos, e preenchidos corretamente.

Editei porque esqueci o uso do dao

public void save() {
  
  // Aqui chamado o metodo de validacao depois de ter pego o objeto da JSP.
  if (validaCampos(objeto)) {
      dao.insert(objeto);
  }

}

O metodo validaCampos

private validaCampos(Objeto objeto) {

    if (objeto.getNome().trim().length() <= 0_ {
          System.out.println("Nome inválido.");
          return false
    } else if (objeto.getEndereco().trim().length() <= 0) {
          System.out.println("Endereço inválido.");
          return false;
    }

    return true;

}

Lembrando, isso é so um exemplo de validacao que acho que fica mais legivel e claro.

D

nel:
Algo importante douglasfborba. O teu insert me parece a nível DAO.
O ideal é que ele receba como parâmetro um objeto e não vários parâmetros, conforme você fez.
A camada de serviço, que vai usufruir do DAO, é que deve ter a preocupação em verificar quais campos são obrigatórios e lançar uma exceção, caso algum não esteja preenchido.

Infelizmente, tratativas de tela normalmente são maçantes e nos obrigam a verificações desse tipo.
O que tu pode fazer é criar um Map ou List com os campos obrigatórios e fazer a validação da lista.
Podes talvez partir para algum pattern, mas o que me vem a cabeça agora é o Strategy e não sei se é aplicável a sua necessidade, é de se pensar.

nel esta é a primeira vez que trabalho com Design Patterns, então não sei muito ao seu respeito e desculpe-me se eu não entendimuito bem sua colocação, mas pretendo futuramente dar uma estudada mais a fundo sobre o assunto. Já em relação ao método, a ideia é que ele faça parte da camada de Controller, então imagino que é ele quem deve fazer as verificações. Para ficar mais claro, seguem abaixo as classes relacionadas, exceto a do formulário que ainda não está pronta:

package br.unicentro.lynx.model.pojo;

public class Publisher {
	private Integer id_publisher;
	private String name_publisher;
	private Contact contact_publisher;

	public Publisher() {

	}

	public Publisher(Integer id_publisher, String name_publisher) {
		this.id_publisher = id_publisher;
		this.name_publisher = name_publisher;
	}

	public Publisher(String name_publisher, Contact contact_publisher) {
		this.name_publisher = name_publisher;
		this.contact_publisher = contact_publisher;
	}

	public Publisher(Integer id_publisher, String name_publisher,
			Contact contact_publisher) {
		this.id_publisher = id_publisher;
		this.name_publisher = name_publisher;
		this.contact_publisher = contact_publisher;
	}

	public Integer getIdPublisher() {
		return id_publisher;
	}

	public void setIdPublisher(Integer id_publisher) {
		this.id_publisher = id_publisher;
	}

	public String getNamePublisher() {
		return name_publisher;
	}

	public void setNamePublisher(String name_publisher) {
		this.name_publisher = name_publisher;
	}

	public Contact getContactPublisher() {
		return contact_publisher;
	}

	public void setContactPublisher(Contact contact_publisher) {
		this.contact_publisher = contact_publisher;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("PublisherController [id_publisher=")
				.append(id_publisher).append(", name_publisher=")
				.append(name_publisher).append(", id_contact_publisher=")
				.append(contact_publisher).append("]");
		return builder.toString();
	}
}
package br.unicentro.lynx.model.pojo;

public class Contact {
	private Integer id_contact;
	private String street_contact;
	private String number_contact;
	private String zip_code_contact;
	private String complement_contact;
	private String city_contact;              
	private String state_contact;            
	private String phone_contact;
	private String email_contact;

	public Contact() {

	}

	public Contact(String street_contact, String number_contact,
			String zip_code_contact, String complement_contact,
			String city_contact, String state_contact, String phone_contact,
			String email_contact) {
		this.street_contact = street_contact;
		this.number_contact = number_contact;
		this.zip_code_contact = zip_code_contact;
		this.complement_contact = complement_contact;
		this.city_contact = city_contact;
		this.state_contact = state_contact;
		this.phone_contact = phone_contact;
		this.email_contact = email_contact;
	}

	public Contact(Integer id_contact, String street_contact,
			String number_contact, String zip_code_contact,
			String complement_contact, String city_contact,
			String state_contact, String phone_contact, String email_contact) {
		this.id_contact = id_contact;
		this.street_contact = street_contact;
		this.number_contact = number_contact;
		this.zip_code_contact = zip_code_contact;
		this.complement_contact = complement_contact;
		this.city_contact = city_contact;
		this.state_contact = state_contact;
		this.phone_contact = phone_contact;
		this.email_contact = email_contact;
	}

	public Integer getIdContact() {
		return id_contact;
	}

	public void setIdContact(Integer id_contact) {
		this.id_contact = id_contact;
	}

	public String getStreetContact() {
		return street_contact;
	}

	public void setStreetContact(String street_contact) {
		this.street_contact = street_contact;
	}

	public String getNumberContact() {
		return number_contact;
	}

	public void setNumberContact(String number_contact) {
		this.number_contact = number_contact;
	}

	public String getZipCodeContact() {
		return zip_code_contact;
	}

	public void setZipCodeContact(String zip_code_contact) {
		this.zip_code_contact = zip_code_contact;
	}

	public String getComplementContact() {
		return complement_contact;
	}

	public void setComplementContact(String complement_contact) {
		this.complement_contact = complement_contact;
	}

	public String getCityContact() {
		return city_contact;
	}

	public void setCityContact(String city_contact) {
		this.city_contact = city_contact;
	}

	public String getStateContact() {
		return state_contact;
	}

	public void setStateContact(String state_contact) {
		this.state_contact = state_contact;
	}

	public String getPhoneContact() {
		return phone_contact;
	}

	public void setPhoneContact(String phone_contact) {
		this.phone_contact = phone_contact;
	}

	public String getEmailContact() {
		return email_contact;
	}

	public void setEmailContact(String email_contact) {
		this.email_contact = email_contact;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("ContactController [id_contact=").append(id_contact)
				.append(", street_contact=").append(street_contact)
				.append(", number_contact=").append(number_contact)
				.append(", zip_code_contact=").append(zip_code_contact)
				.append(", complement_contact=").append(complement_contact)
				.append(", city_contact=").append(city_contact)
				.append(", state_contact=").append(state_contact)
				.append(", phone_contact=").append(phone_contact)
				.append(", email_contact=").append(email_contact).append("]");
		return builder.toString();
	}
}
package br.unicentro.lynx.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.unicentro.lynx.model.factory.ConnectionFactory;
import br.unicentro.lynx.model.pojo.Publisher;

public class PublisherDao {
	private String sql;
	private Connection connection;
	private PreparedStatement statement;
	private ResultSet result;

	public void insert(Publisher publisher) {
		open();
		new ContactDao().insert(publisher.getContactPublisher());
		this.sql = "INSERT INTO Publishers (name_publisher, id_contact_publisher) VALUES (?, ?)";
		try {
			this.statement = connection.prepareStatement(sql);
			this.statement.setString(1, publisher.getNamePublisher());
			this.statement.setInt(2, new ContactDao().searchLastRegister()
					.getIdContact());
			this.statement.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}

	public void update(Publisher publisher) {
		open();
		new ContactDao().update(publisher.getContactPublisher());
		this.sql = "UPDATE Publishers SET name_publisher = ? WHERE id_publisher = ?";
		try {
			this.statement = connection.prepareStatement(sql);
			this.statement.setString(1, publisher.getNamePublisher());
			this.statement.setInt(2, publisher.getIdPublisher());
			this.statement.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}

	public void delete(Integer id_publisher) {
		open();
		this.sql = "DELETE FROM Publishers WHERE id_publisher = ?";
		try {
			this.statement = connection.prepareStatement(sql);
			this.statement.setInt(1, id_publisher);
			this.statement.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}

	public Publisher searchId(Integer id_publisher) {
		open();
		this.sql = "SELECT * FROM Publishers WHERE id_publisher = ?";
		try {
			this.statement = connection.prepareStatement(sql);
			this.statement.setInt(1, id_publisher);
			this.result = this.statement.executeQuery();
			if (this.result.next()) {
				return new Publisher(result.getInt("id_publisher"),
						result.getString("name_publisher"),
						new ContactDao().searchId(result
								.getInt("id_contact_publisher")));
			} else {
				return null;
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}

	public ArrayList<Publisher> listAll() {
		open();
		this.sql = "SELECT * FROM Publishers";
		ArrayList<Publisher> publishers = new ArrayList<Publisher>();
		try {
			this.statement = connection.prepareStatement(sql);
			this.result = this.statement.executeQuery();
			while (this.result.next()) {
				publishers.add(new Publisher(result.getInt("id_publisher"),
						result.getString("name_publisher"),
						new ContactDao().searchId(result
								.getInt("id_contact_publisher"))));
			}
			return publishers;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			try {
				this.result.close();
				close();
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
	}

	private void open() {
		this.connection = ConnectionFactory.getConnection(
				ConnectionFactory.URL, ConnectionFactory.USER,
				ConnectionFactory.PASSWORD);
	}

	private void close() {
		try {
			this.statement.close();
			this.connection.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
package br.unicentro.lynx.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.unicentro.lynx.model.factory.ConnectionFactory;
import br.unicentro.lynx.model.pojo.Contact;

public class ContactDao {
	private String sql;
	private Connection connection;
	private PreparedStatement statement;
	private ResultSet result;

	public void insert(Contact contact) {
		open();
		this.sql = "INSERT INTO Contacts (street_contact, number_contact, zip_code_contact, complement_contact, city_contact, state_contact, phone_contact, email_contact) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
		try {
			this.statement = connection.prepareStatement(sql);
			this.statement.setString(1, contact.getStreetContact());
			this.statement.setString(2, contact.getNumberContact());
			this.statement.setString(3, contact.getZipCodeContact());
			this.statement.setString(4, contact.getComplementContact());
			this.statement.setString(5, contact.getCityContact());
			this.statement.setString(6, contact.getStateContact());
			this.statement.setString(7, contact.getPhoneContact());
			this.statement.setString(8, contact.getEmailContact());
			this.statement.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}

	public void update(Contact contact) {
		open();
		this.sql = "UPDATE Contacts SET street_contact = ?, number_contact = ?, zip_code_contact = ?, complement_contact = ?, city_contact = ?, state_contact = ?, phone_contact = ?, email_contact = ? WHERE id_contact = ?";
		try {
			this.statement = connection.prepareStatement(sql);
			this.statement.setString(1, contact.getStreetContact());
			this.statement.setString(2, contact.getNumberContact());
			this.statement.setString(3, contact.getZipCodeContact());
			this.statement.setString(4, contact.getComplementContact());
			this.statement.setString(5, contact.getCityContact());
			this.statement.setString(6, contact.getStateContact());
			this.statement.setString(7, contact.getPhoneContact());
			this.statement.setString(8, contact.getEmailContact());
			this.statement.setInt(9, contact.getIdContact());
			this.statement.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}

	public void delete(Integer id_contact) {
		open();
		this.sql = "DELETE FROM Contacts WHERE id_contact = ?";
		try {
			this.statement = connection.prepareStatement(sql);
			this.statement.setInt(1, id_contact);
			this.statement.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}

	public Contact searchId(Integer id_contact) {
		open();
		this.sql = "SELECT * FROM Contacts WHERE id_contact = ?";
		try {
			this.statement = connection.prepareStatement(sql);
			this.statement.setInt(1, id_contact);
			this.result = this.statement.executeQuery();
			if (this.result.next()) {
				return new Contact(result.getInt("id_contact"),
						result.getString("street_contact"),
						result.getString("number_contact"),
						result.getString("zip_code_contact"),
						result.getString("complement_contact"),
						result.getString("city_contact"),
						result.getString("state_contact"),
						result.getString("phone_contact"),
						result.getString("email_contact"));
			} else {
				return null;
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}
	
	public Contact searchLastRegister() {
		open();
		this.sql = "SELECT * FROM Contacts WHERE id_contact = (SELECT MAX(id_contact) FROM Contacts)";
		try {
			this.statement = connection.prepareStatement(sql);
			this.result = this.statement.executeQuery();
			if (this.result.next()) {
				return new Contact(result.getInt("id_contact"),
						result.getString("street_contact"),
						result.getString("number_contact"),
						result.getString("zip_code_contact"),
						result.getString("complement_contact"),
						result.getString("city_contact"),
						result.getString("state_contact"),
						result.getString("phone_contact"),
						result.getString("email_contact"));
			} else {
				return null;
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			close();
		}
	}

	public ArrayList<Contact> listAll() {
		open();
		this.sql = "SELECT * FROM Contacts";
		ArrayList<Contact> contacts = new ArrayList<Contact>();
		try {
			this.statement = connection.prepareStatement(sql);
			this.result = this.statement.executeQuery();
			while (this.result.next()) {
				contacts.add(new Contact(result.getInt("id_contact"), result
						.getString("street_contact"), result
						.getString("number_contact"), result
						.getString("zip_code_contact"), result
						.getString("complement_contact"), result
						.getString("city_contact"), result
						.getString("state_contact"), result
						.getString("phone_contact"), result
						.getString("email_contact")));
			}
			return contacts;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			try {
				this.result.close();
				close();
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
	}

	private void open() {
		this.connection = ConnectionFactory.getConnection(
				ConnectionFactory.URL, ConnectionFactory.USER,
				ConnectionFactory.PASSWORD);
	}

	private void close() {
		try {
			this.statement.close();
			this.connection.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
T

Cara, se caso você tiver essa necessidade de que todos os campos sejam preenchidos, realmente eu acho que seria melhor fazer da forma que o rof20004 postou, agora se são apenas 2 ou três campos necessários você pode fazer direto no código e pode criar um boolean para não executar o botão no caso.

public static boolean alerta = false;

if(campoX.getSize() == 0){
//Pede para preencher campo x
alerta = true;
}
else if(campoY.getSize() == 0){
//Pede para preencher campo x
alerta = true;
}
if(alerta == false){
//Executa o botão
}

Bom é apenas mais uma forma entre tantas de fazer…
Espero ter ajudado.

D

rof20004:
Entao, acho que ficaria mais simples voce passar um objeto no parametro, e dentro do metodo voce faz as validacoes, porque alem de a assinatura ficar grande, voce pode se confundir com os restantes das variaveis.

Um exemplo que quero lhe dizer é assim:

No metodo do controller onde chamo o dao.insert, eu tenho um metodo chamado validaCampos, que consiste em verificar se os no minimo os campos obrigatorios estao preenchidos, e preenchidos corretamente.

Editei porque esqueci o uso do dao

public void save() {
  
  // Aqui chamado o metodo de validacao depois de ter pego o objeto da JSP.
  if (validaCampos(objeto)) {
      dao.insert(objeto);
  }

}

O metodo validaCampos

private validaCampos(Objeto objeto) {

    if (objeto.getNome().trim().length() <= 0_ {
          System.out.println("Nome inválido.");
          return false
    } else if (objeto.getEndereco().trim().length() <= 0) {
          System.out.println("Endereço inválido.");
          return false;
    }

    return true;

}

Lembrando, isso é so um exemplo de validacao que acho que fica mais legivel e claro.

Achei muito boa sua solução, mas eu não estaria quebrando o MVC manipulando classes da camanda de Modelo na camada de Visualização?

R

Isso eu nao uso na camada de visualizacao.

V

você criar um metodo que retorna um true/false chamado validar e que receberia como parâmetro seu objeto que seria assim:

public boolean validar(Objeto objeto) {
  String msg = "";

  if (objeto.getNome().trim().equals(""))
    msg += "- Nome não preenchido.\n";

  if (objeto.getSexo().trim().equals(""))
    msg += "- Sexo não preenchido.\n";

  if (!msg.trim().equals(""))
    System.out.println(msg);

  return msg.trim.equals("");
}

Aí no caso somente o nome não estiver preenchido vai sair:

- Nome não preenchido.

Apenas o sexo não preenchido:

- Sexo não preenchido.

Quando ambos não estiverem preenchidos

- Nome não preenchido.
- Sexo não preenchido.
Criado 4 de dezembro de 2012
Ultima resposta 5 de dez. de 2012
Respostas 10
Participantes 5