Como eu refatoro esse código?

10 respostas
Fox_McCloud

Por favor, eu tenho pouca experiência a respeito de programação orientada a objetos. Como eu posso refatorar o código abaixo para que fique melhor, mais orientado a objetos? Aceito dicas gerais.
Grato.

import java.util.regex.*;

public class ValidaCampo {
	
	private int numeroTipo;
	private Pattern padrao;
	private Matcher encaixe;
	private boolean valido;
	
	private final int CEP=0;
	private final int CNPJ=1;
	private final int CPF=2;
	private final int DATA=3;
	private final int EMAIL=4;
	private final int HORA=5;
	private final int INTEIRO=6;
	private final int IP=7;
	private final int NUMERICOS=8;
	private final int PALAVRAS=9;
	private final int TELEFONE=10;
	private final int URL=11;

	public ValidaCampo(){
		setTipo(-1);
		escolhePadrao(getTipo());
		setEncaixe("");
		setValido(valida());
	}
	
	public ValidaCampo(String texto,int numeroTipo){
		setTipo(numeroTipo);
		escolhePadrao(getTipo());
		setEncaixe(texto);
		setValido(valida());
	}
	
	private void setValido(boolean valido){
		this.valido=valido;
	}
	
	private void setTipo(int numeroTipo){
		this.numeroTipo=numeroTipo;
	}
	
	private int getTipo(){
		return numeroTipo;
	}
	
	private void setEncaixe(String texto){
		encaixe=padrao.matcher(texto);
	}
	
	private void setPadrao(String padrao){
		this.padrao=Pattern.compile(padrao);
	}
	
	private void escolhePadrao(int numeroTipo){
		switch(numeroTipo){
			case CEP:
				setPadrao("^[0-9]{6}-?[0-9]{3}$");
				break;
			case CNPJ:
				
setPadrao("^([0-9]{2}[.][0-9]{3}[.][0-9]{3}/[0-9]{4}-[0-9]{2})|([0-9]{14})$");
				break;
			case CPF:
				
setPadrao("^([0-9]{3}[.][0-9]{3}[.][0-9]{3}-[0-9]{2})|([0-9]{11})$");
				break;
			case DATA:
				
setPadrao("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/((19|20)[0-9]{2})$");
				break;
			case EMAIL:
				
setPadrao("^([a-zA-Z]+([.-_][a-zA-Z0-9]+)?)@([a-zA-Z]+([.-_][a-zA-Z0-9]+)?)
[.]([a-zA-Z]{2,3})([.][a-zA-Z]{2,3})?$");
				break;
			case HORA:
				setPadrao("^([0-2][0-3]):([0-5][0-9])$");
				break;
			case INTEIRO:
				setPadrao("^([0-9]*)$");
				break;
			case IP:
				setPadrao("^([0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3})$");
				break;
			case NUMERICOS:
				setPadrao("^([0-9,.]*)$");
				break;
			case PALAVRAS:
				setPadrao("^([a-zA-Z ]*)$");
				break;
			case TELEFONE:
				
setPadrao("^([(][0-9]{2}[)])?([(]([0-9]{1})?([Xx]{2})?[0-9]{2}[)])?([0-9]{3,4})-?([0-9]{3,4})$");
				break;
			case URL:



				

setPadrao("^(http://)?(www[.])?[a-zA-Z0-9]+(([.-_]
[a-zA-Z0-9])+)?[.][a-zA-Z]{2,3}([.][a-zA-Z]{2,3})?(/[a-zA-Z0-9]+)?/?([?][a-zA-Z0-9]+(=[a-zA-Z0-9]+)?
((&[a-zA-Z0-9]+(=[a-zA-Z0-9]+)?)?)*)?$");
				break;

			default:

				// throw new Exception("Erro. Tipo inexistente.");
		}
	}
	
	private boolean valida(){
		boolean casou=false;
		if(encaixe.find())casou=true;
		return casou;
	}
	
	public boolean casou(){
		return valido;
	}
	
}

10 Respostas

Mauricio_Linhares

Talvez assim:

public static final Pattern CEP = Pattern.compile("^[0-9]{6}-?[0-9]{3}$");
public static final Pattern HORA = Pattern.compile("^([0-2][0-3]):([0-5][0-9])$");

E por aí vai… (de preferência fora dessa sua classe aí)

pcalcado

Por favor, ao postar código atenção às quebras de linha. Fica horríveld e ler scroll horizontal., dessa vez eu ajeitei :wink:

Shoes

Fox_McCloud

Como assim fora dessa minha classe?
Olha, eu estudei Java, mas tenho pouca experiência. Respostas mais precisas e completas podem me ajudar muito. Que tal ao invés de dizer que a minha classe é uma porcaria me mostrar onde e como eu posso melhorá-la ou reescrevê-la? Afinal acho que é pra isso que serve um fórum.
Grato

fmeyer

Fox McCloud:
Como assim fora dessa minha classe?
Olha, eu estudei Java, mas tenho pouca experiência. Respostas mais precisas e completas podem me ajudar muito. Que tal ao invés de dizer que a minha classe é uma porcaria me mostrar onde e como eu posso melhorá-la ou reescrevê-la? Afinal acho que é pra isso que serve um fórum.
Grato

Por favor, leia as regras do forum : http://www.guj.com.br/posts/list/21516.java

:mrgreen:

Mauricio_Linhares

Fox McCloud:
Como assim fora dessa minha classe?
Olha, eu estudei Java, mas tenho pouca experiência. Respostas mais precisas e completas podem me ajudar muito. Que tal ao invés de dizer que a minha classe é uma porcaria me mostrar onde e como eu posso melhorá-la ou reescrevê-la? Afinal acho que é pra isso que serve um fórum.
Grato

Agora pronto… :shock:

Companheiro, quem disse que o seu código é uma porcaria? E o que é uma resposta completa pra você?

Se você não entendeu o que eu escrevi, é outra história. Em vez de você colocar todas essas constantes dentro da classe de validação, crie uma classe só pra guardar as constantes, de preferência os Patterns, em vez de apenas os Strings.

E o fórum é feito por pessoas que doam o seu tempo livre pra ajudar os outros, por mais incrível que pareça, ninguém recebe um tostão pra estar respondendo aqui.

Fox_McCloud

:oops:

Ok, desculpe! Mil perdões!!

Se você ainda quiser me dar uma ajuda… :mrgreen: essa classe de constantes precisaria de um construtor? A classe de validação é essa, mesmo.

Existe algum material de refatoração disponível com o qual eu não precise gastar dinheiro?

Desculpe de novo! :wink:

israelwm

Naum precisa esar construcotr, apenas cire uma classe com as constantes, depois chame elas normalmente.

Te digo uma coisa, se vc ver que um método tem mais de 30/40/50 linhas e mais de 4 ou 5 argumentos, repense porq vc pode fazer mais orienteado a objetos, mas ai depende de vc.

Geralmente guardamos constantes em uma classe só e tal, mas não é regra.

Leia as normas e tal, sempre ajuda, mas pelo que vi vc tah seguindo grande parte delas…

Fox_McCloud

Legal! Muito obrigado!

Só pra confirmar: mesmo sem construtor eu posso usar assim?

private Constantes constantes=new Constantes();

Outra coisa: eu devo evitar nomes de variáveis em português?

Abraço

Ironlynx

Fox, se são constantes, use interfaces.
Se toda a sua classe está em português, use português…

cv1

Pra mais info sobre refactoring,

http://www.google.com/search?q=refactoring

(advinha so o que tem no primeiro link…)

Criado 30 de junho de 2005
Ultima resposta 30 de jun. de 2005
Respostas 10
Participantes 7