| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 10:39:55
|
hugleo
Thread.start()
Membro desde: 16/02/2007 20:21:19
Mensagens: 29
Offline
|
Tenho os seguintes papeis: Cliente, Fornecedor, Vendedor
Essas classes tem em comum, o endereço, como rua, telefone, e-mail, etc (uns 20 atributos).
Esses dados poderiam estar em uma classe Pessoa?
Mas aqui eu tenho o caso de por exemplo um Vendedor também poder assumir o papel de Cliente.
Qual a melhor forma de modelar isso? Eu criaria a classe Pessoa referentes a dados pessoais?
Quais a relação de classes que eu faria a herença ou agregação?
Usaria polimorfismo? Também não seria o caso, pois Cliente, Fornecedor e Vendedor possuem alguns atributos e métodos específicos.
Além disso, Cliente e Fornecedor possui outro atributos em comum mas que não fa parte de Vendedor. Nesse caso (como é somente um atributo), acredito que seria melhor que ele fique em Cliente e Fornecedor.
Essa abordagem é necessária por que minha aplicação possui um método que é responsável importar dados em comum, ou seja: O usuário da aplicação cadastra um Cliente, mas se ele quiser pode recuperar os dados em comum (como endereço, tel, etc), para não ter que digitar tudo novamente para efetuar o cadastro de Vendedor ou Fornecedor.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 13:48:16
|
André Fonseca
JWizard
![[Avatar]](/images/avatar/286b0b3ea509af1aeff6bb47299d96d7.png)
Membro desde: 23/02/2007 15:52:55
Mensagens: 2034
Offline
|
hugleo wrote:Tenho os seguintes papeis: Cliente, Fornecedor, Vendedor
Essas classes tem em comum, o endereço, como rua, telefone, e-mail, etc (uns 20 atributos).
Esses dados poderiam estar em uma classe Pessoa?
Mas aqui eu tenho o caso de por exemplo um Vendedor também poder assumir o papel de Cliente.
Qual a melhor forma de modelar isso? Eu criaria a classe Pessoa referentes a dados pessoais?
Quais a relação de classes que eu faria a herença ou agregação?
Usaria polimorfismo? Também não seria o caso, pois Cliente, Fornecedor e Vendedor possuem alguns atributos e métodos específicos.
Além disso, Cliente e Fornecedor possui outro atributos em comum mas que não fa parte de Vendedor. Nesse caso (como é somente um atributo), acredito que seria melhor que ele fique em Cliente e Fornecedor.
Essa abordagem é necessária por que minha aplicação possui um método que é responsável importar dados em comum, ou seja: O usuário da aplicação cadastra um Cliente, mas se ele quiser pode recuperar os dados em comum (como endereço, tel, etc), para não ter que digitar tudo novamente para efetuar o cadastro de Vendedor ou Fornecedor.
Oi,
Bom, eu faria da seguinte forma, não sei se é a ideal para o seu caso e nem a mais correta, mas vamos lá:
Cliente, Fornecedor e Vendedor são papeis, portanto eu criaria interfaces representando os métodos de cada um, lembre que você pode ter também constantes nas interfaces caso precise identificar atributos
Pessoa possui os atributos comuns aquela lista de que falou
Ai para usar voce poderia ter algo do tipo
A idéia de uma interface é ser um contrato que define um comportamento o que é o caso de Cliente, Fornecedor e Vendedor
A herança cuida dos casos de especialização, no caso SuperPessoa é um pouco mais do que uma Pessoa
Caso você precise ou ache necessário pode definir um interface básica que todos devem implementar..
Abs
|
Você é novo no GUJ?
Como fazer perguntas?
www.twitter.com/_afonseca |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 17:38:20
|
hugleo
Thread.start()
Membro desde: 16/02/2007 20:21:19
Mensagens: 29
Offline
|
Então, nesse caso eu necessitaria de implementar todos os métodos em SuperPessoa.
Se por virtude eu precisar modificar a classes Cliente, eu teria que modificar a SuperPessoa também. Aí seria pareciso se eu nem tivesse Cliente, Fornecedor, Vendedor... Criaria tudo em SuperPessoa.
Talvez seja mesmo o único jeito, pois já que um Cliente pode ser também Vendedor, Fornecedor... E SuperPessoa cuidaria disso... De alguma forma seria obrigatório existir uma classe única que integrasse Cliente, Fornecedor, Vendedor...
Acredito que é mesmo o melhor jeito.
This message was edited 1 time. Last update was at 06/09/2008 17:47:58
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 17:50:26
|
windsofhell
GUJ Master
Membro desde: 15/06/2007 08:31:17
Mensagens: 1681
Localização: Stockholm - Sweden
Offline
|
Eu usaria o padrao decorator nesse caso.
|
Nao respondo MP!!!
Site: http://downhillracer.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 18:18:05
|
hugleo
Thread.start()
Membro desde: 16/02/2007 20:21:19
Mensagens: 29
Offline
|
André Fonseca, nesse caso eu não teria que cadastratar obrigatoriamente que cadastar uma Cliente, Fornecedor e Vendedor para que seja possível montar a SuperPessoa? Então se eu cadastrar um Cliente ele seria também um Vendedor, o que nem sempre é verdade.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 18:51:01
|
windsofhell
GUJ Master
Membro desde: 15/06/2007 08:31:17
Mensagens: 1681
Localização: Stockholm - Sweden
Offline
|
Desculpa, Quis disse strategy e nao decorator.
Se vc fizer isso, Se um dia aparecer uma nova entidade no seu sistema vc ta "pego" pra alterar todas as interfaces, a classe pessoa e a SuperPessoa. Fora que fica um codigo totalmente feio e acoplado.
Ai vai um exemplo usando strategy.
This message was edited 1 time. Last update was at 06/09/2008 19:02:49
|
Nao respondo MP!!!
Site: http://downhillracer.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 19:08:03
|
hugleo
Thread.start()
Membro desde: 16/02/2007 20:21:19
Mensagens: 29
Offline
|
Obrigado, parece bem interessante.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 19:59:21
|
André Fonseca
JWizard
![[Avatar]](/images/avatar/286b0b3ea509af1aeff6bb47299d96d7.png)
Membro desde: 23/02/2007 15:52:55
Mensagens: 2034
Offline
|
hugleo wrote:André Fonseca, nesse caso eu não teria que cadastratar obrigatoriamente que cadastar uma Cliente, Fornecedor e Vendedor para que seja possível montar a SuperPessoa? Então se eu cadastrar um Cliente ele seria também um Vendedor, o que nem sempre é verdade.
Oi,
Respondendo a sua dúvida: você não irá cadastrar/persistir um Cliente, você irá cadastar uma SuperPessoa que pode ser ou não um Cliente, ai depende da sua necessidade.
Como o windsofhell falou usando o strategy facilita quando for necessária uma alteração na entidade Pessoa
Abs
|
Você é novo no GUJ?
Como fazer perguntas?
www.twitter.com/_afonseca |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 20:22:59
|
hugleo
Thread.start()
Membro desde: 16/02/2007 20:21:19
Mensagens: 29
Offline
|
Tá, você criou interface Pessoa, então como fica o caso de: "Uma interface não pode possuir atributos de instância"
?
Já que existem atributos comuns entre Cliente, Fornecedor, Vendedor.
Talvez fosse ideal criar uma classe agregada, onde teria um tipo de dados.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 20:36:22
|
windsofhell
GUJ Master
Membro desde: 15/06/2007 08:31:17
Mensagens: 1681
Localização: Stockholm - Sweden
Offline
|
hugleo wrote:
Tá, você criou interface Pessoa, então como fica o caso de: "Uma interface não pode possuir atributos de instância"
?
Já que existem atributos comuns entre Cliente, Fornecedor, Vendedor.
Talvez fosse ideal criar uma classe agregada, onde teria um tipo de dados.
Ai eh que ta, a interface Pessoa eh somente pra quando vc criar um novo personagem vc tem que implementar essa classe. Por exemplo, se vc quer adicionar um gerente, ai ficaria class Gerente implements Pessoa.
Os atributos vc pode colocar na classe PessoaContext, por exemplo, Se vc tem um atributo q todo mundo tem tipo "nome" ai ficaria :
ai vc faz :
Isso facilita porque qualquer novo atributo eh so adicionar na class contexto e vai surtir efeito em todos os seus personagens.
//Daniel
This message was edited 2 times. Last update was at 06/09/2008 20:38:19
|
Nao respondo MP!!!
Site: http://downhillracer.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2008 20:46:07
|
hugleo
Thread.start()
Membro desde: 16/02/2007 20:21:19
Mensagens: 29
Offline
|
Entendido.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/09/2008 00:41:53
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 719
Offline
|
Qualquer modelagem que tenha uma entidade "Pessoa", pra mim é duvidosa.
A modelagem tem que expressar seu domínio e uma entidade pessoa é maior generalização de uma entidade referente ao negócio que se pode ter... (aka apelação).
Se o seu fornecedor, por exemplo, é uma empresa e não um "ser-humano" (mesmo essa empresa tendo nome, email, telefone, etc) seu domínio começa a ficar estranho... e classe como "SuperPessoa" (a não ser que seja um super herói) ou outras como "PessoaContext" só mostram como sua modelagem esta se distanciando de um modelo mais like domain.
Se são dados cadastrais gerais que você quer utilizar para esses caras, use uma classe que os agrupe da melhor forma pra você. Ela pode se chamar DadosCadastrais, CadastroBasico ou qualquer coisa mais criativa e compor as classes Cliente, Vendedor ou Fornecedor. Se mudar um atributo de cadastro, mudou para todos os outros.
A idéia da interface para este caso, tbm não me parece interessante, não vejo pq manter um contrato de comportamentos para tipos diferentes como Fornecedor e Cliente. Cada classe tem seu comportamento e não pertencem a mesma hierarquia ou tipo. O fato é que um Vendedor "tbm" pode ser um Cliente. Eu prefereria compor o vendedor de um cliente, se caso ele tbm é um cliente. Um metodo como isCliente() pode ajudar a definir os comportamentos em seu vendedor. Uma outra apelativa, mais técnica do que teórica, é que vc vai encontrar sobre tudo algumas dificuldades em mapeamento com o banco (ORM) quando decide optar pelo polimorfismo baseado em interfaces.
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/09/2008 04:10:08
|
windsofhell
GUJ Master
Membro desde: 15/06/2007 08:31:17
Mensagens: 1681
Localização: Stockholm - Sweden
Offline
|
Alessandro Lazarotti wrote:Qualquer modelagem que tenha uma entidade "Pessoa", pra mim é duvidosa.
A modelagem tem que expressar seu domínio e uma entidade pessoa é maior generalização de uma entidade referente ao negócio que se pode ter... (aka apelação).
Se o seu fornecedor, por exemplo, é uma empresa e não um "ser-humano" (mesmo essa empresa tendo nome, email, telefone, etc) seu domínio começa a ficar estranho... e classe como "SuperPessoa" (a não ser que seja um super herói) ou outras como "PessoaContext" só mostram como sua modelagem esta se distanciando de um modelo mais like domain.
Se são dados cadastrais gerais que você quer utilizar para esses caras, use uma classe que os agrupe da melhor forma pra você. Ela pode se chamar DadosCadastrais, CadastroBasico ou qualquer coisa mais criativa e compor as classes Cliente, Vendedor ou Fornecedor. Se mudar um atributo de cadastro, mudou para todos os outros.
A idéia da interface para este caso, tbm não me parece interessante, não vejo pq manter um contrato de comportamentos para tipos diferentes como Fornecedor e Cliente. Cada classe tem seu comportamento e não pertencem a mesma hierarquia ou tipo. O fato é que um Vendedor "tbm" pode ser um Cliente. Eu prefereria compor o vendedor de um cliente, se caso ele tbm é um cliente. Um metodo como isCliente() pode ajudar a definir os comportamentos em seu vendedor. Uma outra apelativa, mais técnica do que teórica, é que vc vai encontrar sobre tudo algumas dificuldades em mapeamento com o banco (ORM) quando decide optar pelo polimorfismo baseado em interfaces.
Usei Pessoa porque o hugleo colocou Pessoa no inicio do topico, Mas na verdade nao precisa ser necessariamente pessoa pode ser outro nome, ainda pra complementar poderia ter um metodo que retorna se eh pessoa juridica ou fisica. Nao funcionaria?
//Daniel
|
Nao respondo MP!!!
Site: http://downhillracer.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/09/2008 07:30:34
|
tnaires
GUJ Master
![[Avatar]](/images/avatar/5f6371c9126149517d9ba475def53139.png)
Membro desde: 22/12/2003 08:05:58
Mensagens: 1678
Localização: Porto Alegre/RS - Natal/RN
Offline
|
Tudo bem, um vendedor pode assumir o papel de cliente. Mas ele pode ser os dois ao mesmo tempo?
Acredito que não, ele assumirá apenas um papel por transação.
Nesse caso, você pode implementar Strategy ( como sugerido acima ) da seguinte forma:
Aí toda pessoa terá um papel ( bastante natural ):
Veja se essa solução pode ser adaptada pro seu caso.
[EDIT]
Não vejo problema nenhum em ter uma classe Pessoa no domínio. Caso você precise um dia distinguir pessoa física de pessoa jurídica, basta usar Strategy de novo e adicionar mais um atributo na classe pessoa para comportar seu tipo.
[/EDIT]
Abraços.
This message was edited 1 time. Last update was at 07/09/2008 07:40:24
|
Tarso Nunes Aires
Blog - http://cabritin.wordpress.com/
Delicious - http://delicious.com/tnaires
Twitter - @tnaires
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/09/2008 10:05:28
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 719
Offline
|
tnaires wrote: Não vejo problema nenhum em ter uma classe Pessoa no domínio. Caso você precise um dia distinguir pessoa física de pessoa jurídica, basta usar Strategy de novo e adicionar mais um atributo na classe pessoa para comportar seu tipo.
Um é distinto do outro, não tem pq distinguir... eles são assim por natureza. É como distinguir pedra de fruta em um ancestral em comum, apenas para utilizar de atributos como "descrição, nomeCientifico, blabla".
Os dois não devem pertencer uma mesma hierarquia "Pessoa" (a jurídica e física), uma vez que Pessoa Jurídica não é necessariamente uma pessoa.
http://www.sebraesp.com.br/principal/abrindo%20seu%20neg%F3cio/orienta%E7%F5es/cria%E7%E3o%20de%20empresas/pessoasf%EDsicajur%EDdica.aspx
.( pessoa jurídica é a entidade abstrata com existência e responsabilidade jurídicas como, por exemplo, uma associação, empresa, companhia, legalmente autorizadas)
ja tinhamos discutido isso antes neste tópico.
tnaires wrote:Tudo bem, um vendedor pode assumir o papel de cliente. Mas ele pode ser os dois ao mesmo tempo?
Acredito que não, ele assumirá apenas um papel por transação.
Bom, não conheço mais detalhes da aplicação do hugleo, mas imagino que possa ser possível sim um vendedor ser um cliente em uma mesma transação. A empresa "Some CO" repassa produtos a vendedores autorizados, que dado a isso recebem descontos bem diferenciados além de detalhes tbm diferentes na nota. A entidade em questão esta em seu papel de cliente direto da fábrica mas tbm é vendedor, uma vez que esse é um dos critérios do negócio.
Não estou afirmando que qualquer modelagem descrita aqui é invalida, mas generalizar "Pessoas" por papéis ao meu ver é uma generalização difícil de se manter no sistema. Imagine a fluência do negócio no código, quando "ler" que pessoa.getNome() retornar "Petroquímica Danger LTDA".
Claro que funcionar, de fato funciona. Mas não é algo natural.
-----------------
PS: O link que postei do Sebraesp na minha máquina só abriu no IE, estranho....
This message was edited 2 times. Last update was at 07/09/2008 10:09:45
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
|
|