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:
classEmpresa{Stringnome;Stringcnpj;Funcionario[]funcionarios;voidadiciona(Funcionariof){funcionarios=newFuncionario[10];System.out.println("O tamanho do array é: "+funcionarios.length);fim:for(inti=0;i<funcionarios.length;i++){if(this.funcionarios[i]==null){this.funcionarios[i]=f;System.out.println("Registro efetuado com sucesso na posicao "+i+".");breakfim;}if(this.funcionarios[i]!=null){System.out.println("Posição "+i+" ocupada.");}}}}
Portanto, os dados não estão encapsulados permitindo que o objeto assuma um “estado” inválido. Primeira opinião
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
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:
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
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:
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
classEmpresa{privateStringnome;privateStringcnpj;privateFuncionario[]funcionarios;//construtorpublicEmpresa(){//será instanciado o array somente qdo o objeto for criado a 1ª vez. this.funcionarios=newFuncionario[10];}//aqui vc faria os métodos get e set para recuperar/alterar os atributos da classe.publicStringgetNome(){...}publicvoitsetNome(Stringn){...}publicStringgetCnpj(){...}publicvoitsetCnpj()(Stringn){...}//como o RenatoCustodio disse, é bom proteger tanto os atributos qto os métodos.publicvoidadiciona(Funcionariof){funcionarios=newFuncionario[10];System.out.println("O tamanho do array é: "+funcionarios.length);fim:for(inti=0;i<funcionarios.length;i++){if(this.funcionarios[i]==null){this.funcionarios[i]=f;System.out.println("Registro efetuado com sucesso na posicao "+i+".");breakfim;}//como este bloco executa somente qdo o anterio dá falso, é melhor usar 'else'. else{System.out.println("Posição "+i+" ocupada.");}}}}
Abraços
J
jricardo_so
publicEmpresa(){//inicia o array no construtor da classe Empresa this.funcionarios=newFuncionario[10];}...publicvoidadiciona(Funcionariof){System.out.println("O tamanho do array é: "+funcionarios.length);for(inti=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