Algum padrão para tratar muitos campos?

5 respostas
E

Oi.

Desculpem se a pergunta é boba.

Mas eu tenho que fazer um cadastro de CDs (minha ‘cdteca’).

De cara meus CDs possuem (numa perspectiva de tabelas de um BD):

  • produtor
  • artista
  • mixado por
  • masterizado por
  • estúdio gravação
  • gravadora

E praticamente todos tem apenas o campo ‘nome’ de diferente (gravadora até possui endereço e tal, mas…).

Separei como classes porque, por exemplo, uma gravadora pode ter gravador muitos CDs de vários artistas.

Tem mais o seguinte:

Os CDs possuem vários ‘campos’ que não faz sentido estar em tabelas/classes separadas:

  • título
  • ano publicação
  • coletânea?
  • tributo?

Bom, até aí nada demais, mas quase todas essas propriedades podem ser opcionais.

Então eu não gostaria de fazer uma montanha de ifs para testar se é para salvar ou ignorar o valor digitado (caso esteja vazio).

Considerando que meu CD tem até mais campos e classes do que as que listei, qual seria a melhor maneira de tratar cada um do valores digitados pelo usuário sem usar um monte de ifs?

Ou isso que estou perguntando não faz o menor sentido?

[]s
Esquizo Laranja

5 Respostas

Andre_Fonseca

oi,

uma alternativa é o design pattern Builder, dê uma pesquisada nele

abs

E

Valeu!! Vou dar uma olhada!!

[]s
Esquizo

Andre_Fonseca

oi,

deixa eu postar um exemplo pra vc tirado do livro effective java (muito bom por sinal)

public class NutritionFacts {
	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;

	public static class Builder {
		// estes atributos sao obrigatorios e eles devem 
		// ser preenchidos
		private final int servingSize;
		private final int servings;
		// estes atributos sao opcionais e sao 
		// inicializados com um valor default
		private int calories = 0;
		private int fat = 0;
		private int carbohydrate = 0;
		private int sodium = 0;

                // estes é o único construtor da classe e ele é inicializado
                // com os atributos servingSize, servings que non 
                // caso são os unicos que sao obrigatorios
		public Builder(int servingSize, int servings) {
			this.servingSize = servingSize;
			this.servings = servings;
		}

		public Builder calories(int val) {
			calories = val;
			return this;
		}

		public Builder fat(int val) {
			fat = val;
			return this;
		}

		public Builder carbohydrate(int val) {
			carbohydrate = val;
			return this;
		}

		public Builder sodium(int val) {
			sodium = val;
			return this;
		}

		public NutritionFacts build() {
			return new NutritionFacts(this);
		}
	}

	private NutritionFacts(Builder builder) {
		servingSize = builder.servingSize;
		servings = builder.servings;
		calories = builder.calories;
		fat = builder.fat;
		sodium = builder.sodium;
		carbohydrate = builder.carbohydrate;
	}

	public static void main(String[] args) {

               // aqui eu inicializo o objeto (com os valores default) e depois
               // eu chamo os metodos que constroem (build) apenas aqueles
              // valores que vc precisa e por fim constroem o objeto - chamada
              // do método build()
              // esse tipo de construcao - metodos encadeados - é conhecido
              // tb como interface fluente
		NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
									.calories(100)
									.sodium(35)
									.carbohydrate(27)
									.build();
	}
}
E

Vou ver.

A única consideração é que o seu exemplo trata os opcionais com valores zero, ou seja, embora opcionais, eles possuem um valor, de certa forma existem.

Mas acho que disso não tenho como fugir.

Para os campos do tipo ‘ano’, ‘título’, etc, isso até serviria, mas e para os ‘campos’ objeto?

Exemplo (meio pseudocódigo):

cd.setGravadora( gravadora );

Supondo que gravadora seja algo como:

Gravadora gravadora = banco.getGravadoraByName( valor do usuario );

E supondo que Gravadora é uma propriedade opcional de CD (se o usuário não digitar nada, então não faz nada relativo à gravadora).

E supondo que tenho mais 10 propriedades como essa… ou seja, um punhado de coisas para verificar se foram ou não enviadas pelo usuário.

Vou ler direito sobre o Builder, de repente serve. Só estou adiantando minha dúvida.

[]s
Esquizo Laranja

Andre_Fonseca

oi,

variáveis de instância são inicializadas com os valores default, não há necessidade de inicialização explicita

por exemplo

int - inicializado com 0
float - inicializado com 0.0f
double - inializado com 0.0d

objetos são inicializados com null

abs

Criado 20 de abril de 2010
Ultima resposta 20 de abr. de 2010
Respostas 5
Participantes 2