| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 17:55:05
|
Cássio Tessaro
Thread.start()
![[Avatar]](/images/avatar/9228db1427178a9ac1bd4709da0ca695.jpg)
Membro desde: 11/12/2007 21:11:02
Mensagens: 36
Offline
|
Saudações pessoal.
Estou desenvolvendo um projeto e tenho uma dúvida :
Tenho uma classe que se chama Contatos. Essa classe é abstrata.
Quero utiizar ela como referencia para outras classes, como se fosse um modelo pois tenho vários tipos de contatos : Contatos de Clientes, Contatos de fornecedores e etc. Cada um implementando pequenas modificações. Essa Classe abstrata que serve de modelo esta em um pacote diferente das demais. Como os atributos dela estao declarados como private consigo apenas ter acesso a estes membros atraves dos metodos getters e setters. Essa seria a melhor maneira de implementar esse modelo ? ou teria que declarar seus atributos como protected ?
Ou implementaria de alguma outra maneira ?
Poderiam me dar uma ajudinha ?
Desde ja agradeço a colaboração de todos.
Um grande abraço!
|
Att Cássio Tessaro de Olivira |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 18:10:26
|
o_0
Debugger
Membro desde: 01/09/2009 11:49:22
Mensagens: 71
Offline
|
Amigo, tambem estou começando agora, porem estou utilizando o padrao EJB onde eu crio uma Interface (Contato), só com o metedos GET e SET e depois a classe implementadora (ContatoBean) onde eu informo os membros como private e implementos os metodos com this no SET e return no GET. Depois é só usar HERANÇA.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 18:15:39
|
Cássio Tessaro
Thread.start()
![[Avatar]](/images/avatar/9228db1427178a9ac1bd4709da0ca695.jpg)
Membro desde: 11/12/2007 21:11:02
Mensagens: 36
Offline
|
Valeu o_0
Uhummmm mas qual a diferença em criar uma classe que seja uma interface e fazer isso direto por uma classe abstrata ??
O grande X da questao é que os atributos estao como private e não conseguirei acessa los mesmo que por herança não importa o tipo de classe que eu fizer isso.
Não é mesmo ?
Sendo assim a pergunta é : Tem algum problema em nao conseguir visualizar os atributos da minha super classe e apenas manipula los atraves dos metodos setters e getters ??
Se tiver problema, nao resolveria apenas colocando os atributos da superclasse como protected (permitindo assim o acesso em heranças ) ?
Cara teria como tu postar um exemplo ai ?
Valeu.
This message was edited 1 time. Last update was at 03/10/2009 18:49:28
|
Att Cássio Tessaro de Olivira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 20:24:13
|
gabrielmskate
Debugger
![[Avatar]](/images/avatar/34474dcb1ae25c15ec2439bc39eec736.jpg)
Membro desde: 10/10/2008 09:12:34
Mensagens: 63
Localização: Santos - SP
Offline
|
Sendo assim a pergunta é : Tem algum problema em nao conseguir visualizar os atributos da minha super classe e apenas manipula los atraves dos metodos setters e getters ??
Eu posso te dizer que é uma má pratica deixar um atributo visível a outra classe.
Mesmo que não tenha necessidade agora de usar get e set, é bom você se proteger para mudanças futuras.
Uma classe sabe como cuidar dos seus próprios atributos, uma classe só deve se comunicar com outra através de sua interface (método get e set).
Depois da uma lida sobre encapsulamento.
E esse artigo também é muito bom -- > http://blog.caelum.com.br/2006/09/14/nao-aprender-oo-getters-e-setters/
|
Gabriel Rubens -
http://grupohaw.com.br/
Oracle Certified Java Programmer
Você vai tropeçar várias vezes, vai se perguntar "Por que estou fazendo isto?", vai ter recaídas que o farão se sentir um fracassado, mas olhar para trás depois e ver o quanto você subiu da montanha, só te fará querer o TOPO. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 21:01:22
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Que tipo de métodos? Não seria possível declarar uma outra classe e fazer composição? Quando possível, é sempre melhor usar composição do que herança.
This message was edited 1 time. Last update was at 03/10/2009 21:01:32
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 21:07:11
|
gabrielmskate
Debugger
![[Avatar]](/images/avatar/34474dcb1ae25c15ec2439bc39eec736.jpg)
Membro desde: 10/10/2008 09:12:34
Mensagens: 63
Localização: Santos - SP
Offline
|
Reforçando o que o ViniGodoy falou, tem um artigo da caelum que fala sobre isso -> http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/
[]s
|
Gabriel Rubens -
http://grupohaw.com.br/
Oracle Certified Java Programmer
Você vai tropeçar várias vezes, vai se perguntar "Por que estou fazendo isto?", vai ter recaídas que o farão se sentir um fracassado, mas olhar para trás depois e ver o quanto você subiu da montanha, só te fará querer o TOPO. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 21:33:59
|
Cássio Tessaro
Thread.start()
![[Avatar]](/images/avatar/9228db1427178a9ac1bd4709da0ca695.jpg)
Membro desde: 11/12/2007 21:11:02
Mensagens: 36
Offline
|
ViniGodoy wrote:Que tipo de métodos? Não seria possível declarar uma outra classe e fazer composição?
Quando possível, é sempre melhor usar composição do que herança.
Sim essa classe Contatos..... faz parte de uma composição mas nao é essa a questao....
a questao é para escrever menos codigo e o que eu fiz ? juntei todos os atributos que compoem as classes Contatos de todas as classes e coloquei em uma classe abastrata :
Então essa classe abstrata fica como um modelo para todas as outras classes que precisam de um contato. Exemplo:
Dai vem a duvida que eu ja consegui responder testando os pacotes e modulos que eu havia criado.
Se eu conseguiria acessar os atributos da super classe com os metodos getters em setters dela atraves da classe filho.
E sim isso é possivel.
O que fica ainda de duvida é : Isso é correto ? esse é o padrao ?
Isso me economiza muito codigo.
O artigo citado pelo nosso amigo é muito bom mas nao consegui identificar se ainda assim isso é a maneira mais correta de fazer.
Isso ajuda também na escalabilidade do meu sistema em sí. Ate mesmo para atualizar. Se eu quiser alter a validação de email por exemplo, altero do na classe pai.
Agradeço a todos pela participação.
Quanto mais ajuda melhor.
|
Att Cássio Tessaro de Olivira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 21:44:58
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Repare que você tem atributos que andam juntos... Como o telefone e o código de área... Aliás, esses atributos tem até métodos em comum, como a validação se são válidos ou não.
Comece refatorando por aí. Isso vai reduzir muito código.
Crie uma classe telefone, com telefone, código de área e pattern de validação. Você pode definir diferentes patterns num enum, para que o usuário escolha depois.
Isso já deve reduzir muito código.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 22:15:00
|
Cássio Tessaro
Thread.start()
![[Avatar]](/images/avatar/9228db1427178a9ac1bd4709da0ca695.jpg)
Membro desde: 11/12/2007 21:11:02
Mensagens: 36
Offline
|
ViniGodoy wrote:Repare que você tem atributos que andam juntos... Como o telefone e o código de área... Aliás, esses atributos tem até métodos em comum, como a validação se são válidos ou não. Comece refatorando por aí. Isso vai reduzir muito código. Crie uma classe telefone, com telefone, código de área e pattern de validação. Você pode definir diferentes patterns num enum, para que o usuário escolha depois. Isso já deve reduzir muito código.
Cara essa ja é a minha classe rduzida..... O scodigos de area podem ser diferentes para celular e fixo....... eu tenho amigos que vieram do interior que possuem um codigo de area para cel e outro para fixo..... buenas.... nao deixei junto pois sei la .... me parece mais organizado assim.... talvez ocupe um pouco mais de memoria e processamento mas acho que vale apena em termos de custo beneficio...... E tmb posso fazer uma sobre escrita de metodos ja que são publico na validação onde precisar, mas assim ja esta me economizando linhas a grande questao é: esta correto assim ??? valeuzzzz
This message was edited 1 time. Last update was at 03/10/2009 22:16:57
|
Att Cássio Tessaro de Olivira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 22:20:39
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Ok, vamos mostrar como eu faria. Para começar, eu separaria as classes Telefone e Email. Afinal, são dados com regras próprias. O telefone divide-se por tipos, portanto, também criaria um enum para representar os tipos de telefone. Depois, alteraria a classe de contatos para refletir essas mudanças: Arquivo Email.java Arquivo Telefone.java Arquivo TipoTelefone.java Arquivo Contato.java Note que com blocos menores, ficaria muitíssimo fácil incluir um novo tipo de telefone. Bastaria incluir um tipo a mais no enum. Também seria fácil alterar o contato para ter mais telefones. Ou para que o usuário especifique 2 telefones, de qualquer tipo (para, por exemplo, na falta de um celular, o Contato ter dois fixos, o de casa e o da empresa). Não fiquei muito convencido de que os métodos de validação de telefone tenham que testar o length(). Talvez fosse melhor deixar esse trabalho para a expressão regular. Note que também reduzi código ao eliminar seus ifs com atributos booleanos (como no caso do matches()). Você testava "se matches() é true, retorna true, senão, se matches() é false, retorna false". Ora, é mais fácil retornar matches de uma vez! Outra coisa... Também pode-se reduzir código e identação se, sempre que seu if disparar uma exceção ou tiver um "return", você eliminar o else. Classes menores também se tornam mais coesas e reaproveitaveis. Se no futuro você criar uma classe para empresas, provavelmente poderá reusar os tipos Telefone e Email. Aliás, você pode até mesmo separar esses tipos num outro .jar, e usar em diversos projetos, além do da loja virtual. A dica é, não tenha medo de criar classes. É muito melhor ter um conjunto de classes pequenas e coesas, do que ter uma hierarquia de uma classe só enorme.
This message was edited 5 times. Last update was at 03/10/2009 22:38:30
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2009 23:42:09
|
NightDark
Thread.start()
![[Avatar]](/images/avatar/5951680e80cd2ec610b398e8553f9961.png)
Membro desde: 05/09/2009 00:39:18
Mensagens: 30
Localização: Recife - PE
Offline
|
ViniGodoy deu uma verdadeira aula^^ gostei
Cássio Tessaro, te aconselho a ler o livro Java Efetivo do autor Joshua Bloch, tem várias páginas referente a sua dúvida, Estou lendo e gostando bastante
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2009 20:01:53
|
Cássio Tessaro
Thread.start()
![[Avatar]](/images/avatar/9228db1427178a9ac1bd4709da0ca695.jpg)
Membro desde: 11/12/2007 21:11:02
Mensagens: 36
Offline
|
ViniGodoy wrote:Ok, vamos mostrar como eu faria. Para começar, eu separaria as classes Telefone e Email. Afinal, são dados com regras próprias. O telefone divide-se por tipos, portanto, também criaria um enum para representar os tipos de telefone.
Depois, alteraria a classe de contatos para refletir essas mudanças:
Arquivo Email.java
Arquivo Telefone.java
Arquivo TipoTelefone.java
Arquivo Contato.java
Note que com blocos menores, ficaria muitíssimo fácil incluir um novo tipo de telefone. Bastaria incluir um tipo a mais no enum.
Também seria fácil alterar o contato para ter mais telefones. Ou para que o usuário especifique 2 telefones, de qualquer tipo (para, por exemplo, na falta de um celular, o Contato ter dois fixos, o de casa e o da empresa).
Não fiquei muito convencido de que os métodos de validação de telefone tenham que testar o length(). Talvez fosse melhor deixar esse trabalho para a expressão regular. Note que também reduzi código ao eliminar seus ifs com atributos booleanos (como no caso do matches()). Você testava "se matches() é true, retorna true, senão, se matches() é false, retorna false". Ora, é mais fácil retornar matches de uma vez!
Outra coisa... Também pode-se reduzir código e identação se, sempre que seu if disparar uma exceção ou tiver um "return", você eliminar o else.
Classes menores também se tornam mais coesas e reaproveitaveis. Se no futuro você criar uma classe para empresas, provavelmente poderá reusar os tipos Telefone e Email. Aliás, você pode até mesmo separar esses tipos num outro .jar, e usar em diversos projetos, além do da loja virtual.
A dica é, não tenha medo de criar classes. É muito melhor ter um conjunto de classes pequenas e coesas, do que ter uma hierarquia de uma classe só enorme.
Opaaaaaa desculpa pela demora em responder.... Obrigado pela aula literamente.... huahuauhauhauhauh
vou da uma estudada sobre isso.
Valeu pessoal....
Ate a proxima!
|
Att Cássio Tessaro de Olivira |
|
|
 |
|
|