Opinião sobre o código para me orientar sobre as regras de OO

10 respostas
cgomesnet

Olá pessoal ^^

Gostaria da opinião de vocês sobre um exercício que resolvi, nele eu apliquei o pouco de conhecimento que tenho na linguagem Java e como já programei em Delphi trago vicios da programação estruturada. Logo gostaria da opinião de vocês sobre os pontos não OO do exercício em questão para que eu vá corrigindo e refazendo os exercícios de forma mais orientada a objetos.

Em particular eu gostaria da opinião de vocês a respeito do break que eu utilizei para encerrar o laço OK?
Sei que vocês que já programam poderiam fazer o mesmo programa utilizando uma quantidade mínima de códigos, mas o que quero é que vocês me apontem onde posso melhorar a questão OO e não a lógica.

Desde já obrigado aos que puderem me ajudar e vamos aos códigos:

EXERCICIO 5.5 da Apostila FJ11 da Caelum (Por favor baixem a apostila, temo link abaixo)
http://www.caelum.com.br/caelum/apostila/caelum-java-objetos-fj11.pdf

CLASSE C/ AS REGRAS
class Empresa {
	String nome;
	String cnpj;
	Funcionario[] funcionarios;
	
	void adiciona(Funcionario f) {
		funcionarios = new Funcionario[10];
		System.out.println ("O tamanho do array é: "+ funcionarios.length);		
		fim:
		for (int i = 0; i < funcionarios.length; i++) {
			if (this.funcionarios[i] == null) {
				this.funcionarios[i] = f;				
			    System.out.println("Registro efetuado com sucesso na posicao "+i+".");					
			    break fim;
			}
			if (this.funcionarios[i] != null) {
				System.out.println("Posição "+i+" ocupada.");
			}			
		} 
	}   
}
CLASSE DE TESTE
class TestaFuncionario {	
	public static void main(String[] args) {
		Funcionario f1 = new Funcionario();
		Data d = new Data();
		
		f1.data = d;
		
		f1.nome = "Claudio";
		f1.departamento = "Informática";
		f1.data.dia = 10;
		f1.data.mes = 9;
		f1.data.ano = 2007;
			
		/*Funcionario f2 = new Funcionario();
		f2.nome = "Claudio";
		f2.departamento = "Informática";*/
		
		f1.dataEntrada = f1.data.dia+"/"+f1.data.mes+"/"+f1.data.ano;
		f1.rg = "X.XXX.XXX-X";
		f1.estaNaEmpresa = true;
		f1.salario = 1000;
		f1.bonifica(100);		
		f1.demite();
		f1.mostra();
		
		Empresa emp = new Empresa();
		emp.adiciona(f1);
	}
}

10 Respostas

P

Poste o código da sua classe funcionário.

Compile e rode isso:

f1.data.dia = -1000;

Essa classe permite isso, não?

Portanto, os dados não estão encapsulados permitindo que o objeto assuma um “estado” inválido. Primeira opinião :slight_smile:

Até mais,

cgomesnet

phph:
Poste o código da sua classe funcionário.

Compile e rode isso:

f1.data.dia = -1000;

Essa classe permite isso, não?

Portanto, os dados não estão encapsulados permitindo que o objeto assuma um “estado” inválido. Primeira opinião :slight_smile:

Até mais,

A classe esta no outro PC, mas não, não fiz o encapsulamento pra mermitir que só entre dados entre 1 e 31, mas o que eu quero é que vocês olhem esse código, pois estou aprendendo ainda array.

s4nchez

Quando ao break, você pode usar um return caso o que você já tenha executado a operação que o método é responsável.

Mas em geral não adianta muito se preocupar com OO se seu código tem problemas de lógica. Por exemplo:

...	
	void adiciona(Funcionario f) {
		funcionarios = new Funcionario[10];
		...

Neste caso você está iniciando seu array toda vez que adiciona um funcionário, ou seja, só guardará o último que tentou adicionar.

cgomesnet

s4nchez:
Quando ao break, você pode usar um return caso o que você já tenha executado a operação que o método é responsável.

Mas em geral não adianta muito se preocupar com OO se seu código tem problemas de lógica. Por exemplo:

...	
	void adiciona(Funcionario f) {
		funcionarios = new Funcionario[10];
		...

Neste caso você está iniciando seu array toda vez que adiciona um funcionário, ou seja, só guardará o último que tentou adicionar.

Entendi, quero tentar consertar isso, mas como ficaria no caso para toda vez que iniciar ele supostamente “guardar” a posição?

Tirar o laço?
Não estanciar o objeto do array?

Fiquei com essas dúvidas agora.

renatocustodio

cgomesnet:
phph:
Poste o código da sua classe funcionário.

Compile e rode isso:

f1.data.dia = -1000;

Essa classe permite isso, não?

Portanto, os dados não estão encapsulados permitindo que o objeto assuma um “estado” inválido. Primeira opinião :slight_smile:

Até mais,

A classe esta no outro PC, mas não, não fiz o encapsulamento pra mermitir que só entre dados entre 1 e 31, mas o que eu quero é que vocês olhem esse código, pois estou aprendendo ainda array.

O que ele quis dizer foi sobre os métodos gets e sets… É uma má prática no java deixar variáveis públicas expostas… O certo para obter a data seria chamar um método público que retornava ela, como getData() por exemplo.

renatocustodio

cgomesnet:
s4nchez:
Quando ao break, você pode usar um return caso o que você já tenha executado a operação que o método é responsável.

Mas em geral não adianta muito se preocupar com OO se seu código tem problemas de lógica. Por exemplo:

...	
	void adiciona(Funcionario f) {
		funcionarios = new Funcionario[10];
		...

Neste caso você está iniciando seu array toda vez que adiciona um funcionário, ou seja, só guardará o último que tentou adicionar.

Entendi, quero tentar consertar isso, mas como ficaria no caso para toda vez que iniciar ele supostamente “guardar” a posição?

Tirar o laço?
Não estanciar o objeto do array?

Fiquei com essas dúvidas agora.


Vc poderia instanciar o array lá em cima, onde ele é declarado!

Andre_Brito

Instancia o array no construtor da classe. Ou melhor, crie um construtor e instancia o array lá.

berg.pb
class Empresa {  
    private String nome;  
    private String cnpj;  
    private Funcionario[] funcionarios;  
    
   //construtor
    public Empresa() {
      //será instanciado o array somente qdo o objeto for criado a 1ª vez. 
      this.funcionarios = new Funcionario[10];

    } 
   
   //aqui vc faria os métodos get e set para recuperar/alterar os atributos da classe.
   public String getNome(){...}
   public voit setNome(String n){...}
   public String getCnpj(){...}
   public voit setCnpj()(String n){...}

   //como o RenatoCustodio disse, é bom proteger tanto os atributos qto os métodos.
    public void adiciona(Funcionario f) {  
        funcionarios = new Funcionario[10];  
        System.out.println ("O tamanho do array é: "+ funcionarios.length);       
        fim:  
        for (int i = 0; i < funcionarios.length; i++) {  
            if (this.funcionarios[i] == null) {  
                this.funcionarios[i] = f;                 
                System.out.println("Registro efetuado com sucesso na posicao "+i+".");                    
                break fim;  
            }  
            //como este bloco executa somente qdo o anterio dá falso, é melhor usar 'else'.            
            else {  
                System.out.println("Posição "+i+" ocupada.");  
            }             
        }   
    }     
}

Abraços

J
public Empresa() {  
       //inicia o array no construtor da classe Empresa 
       this.funcionarios = new Funcionario[10];  
   
     }   

...

     public void adiciona(Funcionario f) {    
         System.out.println ("O tamanho do array é: "+ funcionarios.length);         
         for (int i = 0; i < funcionarios.length; i++) {    
             if (this.funcionarios[i] == null) {    
                 this.funcionarios[i] = f;                   
                 System.out.println("Registro efetuado com sucesso na posicao "+i+".");
                 System.out.println("Posição "+i+" ocupada.");
                 //use return no lugar do break.
                 return;    
             }    
         }     
     }
cgomesnet

Muito obrigado pessoal.

Estou ancioso para voltar pra casa hoje a noite e estudar as novas sugestões, creio que esse é o melhor método para aprender (faço, mesmo que errado) e depois efetuo a correção.

Foi assim que aprendi a ler e a escrever, rsrsrs Não tem porque não ser assim com o Java :stuck_out_tongue:

Criado 11 de agosto de 2008
Ultima resposta 12 de ago. de 2008
Respostas 10
Participantes 7