Melhor forma de modelar/programar cliente, fornecedor e pessoa  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
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.
André Fonseca
JWizard
[Avatar]

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
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

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
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.
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
hugleo
Thread.start()

Membro desde: 16/02/2007 20:21:19
Mensagens: 29
Offline

Obrigado, parece bem interessante.

André Fonseca
JWizard
[Avatar]

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
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.

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
hugleo
Thread.start()

Membro desde: 16/02/2007 20:21:19
Mensagens: 29
Offline

Entendido.

Alessandro Lazarotti
Virtual Machine Man
[Avatar]

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/

[Email] [MSN]
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
tnaires
GUJ Master
[Avatar]

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

Alessandro Lazarotti
Virtual Machine Man
[Avatar]

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/

[Email] [MSN]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team