Problema na lógica

então galera, mto prazer ae… meu nome é emannuel e faço sistemas de informação, segundo semestre… sou iniciante em programção.
Meu problema é o seguinte, comecei a fazer um sistema simples exigido como trabalho final de algoritmos. Optei por fazer em cima de um sistema de biblioteca e até estou indo mais longe do que a professora exigiu. Porém comecei a perceber que estou “embaralhando” mto o sistema e ele está ficando feio. Gostaria de uns toque de como melhorar em alguma parte na minha orientação a objetos. Caso alguem se dispor, vou mostrar aqui só a calsse Aluguel pra se receber alguns toques… desde já valeu aí!

PS.: A professora proibiu usar arraylist, pois o trabalho é sobre array comum.

public class Aluguel {

	private Locacao[] listaAluguel;
	private Cadastro cadastro;	
	private int codigoAluguel = 1;
	
	
	public Aluguel(Cadastro cadastro) {
		super();		
		this.listaAluguel = new Locacao[1000];
		this.cadastro = cadastro;
	}
	
	//não estou utilizando
	private boolean validaLocacao(Cliente locatario){
		if (locatario.getMaxLivro() < 2) {
			return true;		
		}else{
			return false;
		}
	}
	
	//Método para alugar livro:
	public void alugar(Integer codigoCliente, Integer codigoLivro){
		Locacao al = new Locacao();
		boolean entrouCliente = false;
		boolean entrouLivro = false;
		boolean livroLocado = false;
		boolean limiteLivro = false;
		String locatario = "";
		int locCodigo = 0;
			//Procura pelo código do cliente à alugar o livro
			for (int i = 0; i < cadastro.getCliente().length; i++) {
				if(cadastro.getCliente()[i] != null){
						
					if (codigoCliente == cadastro.getCliente()[i].getCodigo()) {						
							al.setCliente(cadastro.getCliente()[i]);
							entrouCliente = true;
							break;		
						
					}
				}
			}
			
			//Procura pelo código do livro para alugar
			for (int i = 0; i < cadastro.getLivro().length; i++) {
				if(cadastro.getLivro()[i] != null){
					if (codigoLivro == cadastro.getLivro()[i].getCodigo()) {
						if (validaLivro(cadastro.getLivro()[i])) {					
							al.setLivro(cadastro.getLivro()[i]);
							entrouLivro = true;
							break;
						}else{
							locatario = listaAluguel[i].getCliente().getNome();
							locCodigo = listaAluguel[i].getCliente().getCodigo();
							livroLocado = true;
						}
					}
				}
			}
			
			//Verifica se encontrou o livro e o Cliente para chamar o 
			//método que registra o aluguel
			if (!livroLocado) {
				if (entrouLivro & entrouCliente) {					
						registraAluguel(al, codigoAluguel);
						codigoAluguel += 1;
						JOptionPane.showMessageDialog(null, "Aluguel efetuado com sucesso", "Biblioteca", 1);					
				}else{
					JOptionPane.showMessageDialog(null, "Cliente e/ou Livro Inexistente(s)", "Biblioteca", 0);
				}
			}else{
				JOptionPane.showMessageDialog(null, "Este livro já está locado por "+locatario +" de código: "+locCodigo, "Biblioteca", 1);
			}			
	}	
	
	//devolve livro...
	public void devolverLivro(Integer codigo){
		boolean entrou = false;
		for (int i = 0; i < listaAluguel.length; i++) {
			if(listaAluguel[i] != null){
				if(listaAluguel[i].getLivro().getCodigo() == codigo){
					listaAluguel[i] = null;					
					entrou = true;
					break;
				}			
			}
		}
		if (entrou) {
			JOptionPane.showMessageDialog(null, "Devolução efetuada com sucesso", "Biblioteca", 1);
		}else {
			JOptionPane.showMessageDialog(null, "Código do livro à devolver inexistente ou incorreto", "Biblioteca", 0);
		}
		
	}
	
	//Lista todas as locações
	public String listaLocacoes(){
		String concatenaDados = "";
		boolean entrou = false;
		for (int i = 0; i < listaAluguel.length; i++) {
			if (listaAluguel[i] != null) {				
				concatenaDados += 
				"Cliente: "+listaAluguel[i].getCliente().getNome()+"  "+
				"Livro: "+listaAluguel[i].getLivro().getTitulo()+"  "+
				"Código Locação: "+listaAluguel[i].getCodigo()+"\n";
				entrou = true;				
			}
		}
		if (entrou) {
			return concatenaDados;
		}else{
			return "Nenhuma locação registrada";
		}
		
	}
	
	//Método para registrar o aluguel no array:
	private void registraAluguel(Locacao locacao, int codigo){		
		for (int i = 0; i < listaAluguel.length; i++) {
			if (listaAluguel[i] == null) {
				listaAluguel[i] = locacao;		
				listaAluguel[i].getCliente().setMaxLivro(listaAluguel[i].getCliente().getMaxLivro() + 1);
				listaAluguel[i].setCodigo(codigo);
				break;
			}
		}		
	}	
	
	//Verifica se o livro já está alugado
	private boolean validaLivro(Livro livro){
		boolean entrou = false;
		for (int i = 0; i < listaAluguel.length; i++) {
			if (listaAluguel[i] != null) {			
				if (livro.getCodigo() == listaAluguel[i].getLivro().getCodigo()) {
					entrou = true;
				}
			}
		}
		if (entrou) {
			return false;
		}else{
			return true;
		}
	}	

	public int getCodigo() {
		return codigoAluguel;
	}

	public void setCodigo(int codigo) {
		this.codigoAluguel = codigo;
	}

	public Locacao[] getListaAluguel1() {
		return listaAluguel;
	}	
}

onde comecei a quebrar a cabeça nesse código é no método alugar. Pois queria que cada cliente pudesse alugar no maximo 2 livros, porém queria que desse um aviso diferente para cada restrição. Imagino que dê pra dividir melhor esse método, ou sei la… espero comentarios… valeu!

Oi
Mano apesar de vc não poder usar arraylist que pra isso aí é fundamental.
tá bom a logica mais ela só embaralhada então tenta usa menas condições if e else muito métodos quase repetitivos crie variaveis fixas organizadas é melhor para trabalhar divida sua logica em parte de funcionabilidades.

Mais man esse metodo de locação pra eu entender o q faz tá foda man
então tenta simplificar

vlw flw qualquer coisa mim add aí
milar_lindy@hotmail.com

Já que vc não pode usar ArrayList pq o trabalho é um exercício de arrays, vc pode então implementar a sua própria lista utilizando arrays.

Deste modo vc organiza o código como se tivesse usando o ArrayList (ou outra List qualquer) e também exercita operações com arrays, fazendo o que a profe pediu.

Algo como…

package meupacote;

public class MinhaArrayList<T> implements List<T> {
    private T[] dados;

    public MinhaArrayList(int tamanhoInicial) {
         dados = new T[tamanhoInicial]();
    }

    // implementar metodos da interface List...
}

claro, daeh não vale usar extends ArrayList, né :stuck_out_tongue:

[]'s

é galera, acho que isso eu vo pegando com a pratic amesmo… negocio é ir praticando e lendo, valeu ae pelos conselhos

e sobre usar essa praticade usar um boolean para verificar se entrou num if pra poder dar um “retorno” diferente, é razoavel?

também gostaria de saber por ex, nesse sistema com joptionpane, é melhor eu fazer um alguns método strings e imprimir o retorno na classe principal ou tratar dessa mensagem no proprio método?

sobre os muitos if’s, é pq como o as posicoes dos arrays ja estavam criadas, mesmo dando o length eu tive que verificar se a posição não estava vazia, isso fez eu usar um if a mais em quase todo o sistema (pois nao pude usar List). Tem algum jeito de fazer um metodo “generico” pra mim verificar isso de uma maneira masi elegante ou sei la…

valeu mesmo pela atenção galera, mto obrigado! :smiley:

Dei uma lida rápida no seu exemplo, por isso me perdoe se estiver dizendo bobagens!

Não sei se você esta usando o padrão de projeto MVC e DAO,
mas é uma boa prática deixar as inclusões do array dentro de uma classe DAO — “mesmo sendo só arrays / sem banco de dados!”:
Ex : lista de aluguel - ListaAluguelDAO onde dentro voce tem os metodos de inclusão, exclusão e recuperação de uma lista de livros. Onde você teria

	public class ListaAluguelDAO{
		...
		// n é um contador de preferência no controle
		public void add(int n , Livro livvro){
			lista[n] = livro;
		}
		...
	}

Olhei pouco o seu exemplo mas reparei que existem muitas validações e variaveis boolean,
analise as regras do seu exemplo e veja se a descrição abaixo pode ajudar:
***Proucure deixar as validações de regras de negócios em classes específicas tipo:
***criar uma classe LivroValidacoes ou LivroNegocio com todos os métodos boolean

Tambem é legal para quem busca boas práticas dar uma lida em apostilas e tutoriais de “refatoração” e “Padrão de Projetos”

Bom Estudo e Boa Sorte!!!

Faz assim as classes!

Livro
ListaLivros ou LivroDao

Aluguel
ListaAluguel ou AluguelDao

e assim vai indo…

dai nas listas(daos) tu coloca metodos de acesso as arrays!
pode tbm colocar uma classe de validações no meio disso!