UML - duvidas em modelagem padrão (Pessoa - Pessoa Fisica - Pessoa Juridica)

Ae galera…

Sou novo na linguagem java e em UML, comecei a fazer uns projetos com finalidade de aprender e surgiram algumas duvidas!

Li em vários tópicos sobre o problema de modelagem Objeto Relacional, nós aprendemos a pensar no raciocinio do banco de dados e pelo menos eu fico meio atordoado a pensar em objetos!

Bem estou pensando em fazer a modelagem padrão de um cadastro de Pessoas (Fisicas e Judiricas) e estou tendo algumas dúvidas!

Estava pensando nas Classes padroes uma classe Pessoa abstrata e depois uma classe Pessoa_Fisica e Pessoa_Juridica que extendem essa classe Pessoa… mas nao sei bem, nao vejo muita coisa em comum entre Objetos Pessoa Fisica e Objetos Pessoa Juridica para precisarem de uma superclasse entre eles.

Estava pensando em uma super classe Pessoa Fisica com os atributos padroes(id, nome, dtnasc, uma Classe Estado Civil, uma classe Raca, Set de Classes Endereco, set de Classes Telefones, set de Classes Documentos) e o mesmo para Pessoa Juridica mudando somente os atributos simples respectivos a pessoas juridicas.

Vendo dessa forma poderia criar uma classe Pessoa apenas com os atributos id e Set de Enderecos e Set de Telefones e depois fazer as classes pessoas fisicas e juridicas derivarem da mesma, mas mesmo assim nao acho uma boa solucao.

Forçar uma interface simples Pessoa obrigaria a ter os mesmo metodos em ambas as classes PFs e PJs e nao acho isso viavel…

Ou seja estou na duvida… Rss

Li o post do GUJ http://www.guj.com.br/posts/list/43507.java e nao achei esclarecedor!

Queria saber o modelo mais usado, a convencao mais utilizada, ou o padrão da UML mais adotada em software houses que desenvolvem em POO!

Alguem pode me ajudar?

Desde já agradeço!

opa…

vamos lá…já que vc na sua modelagem vai utilizar apenas objetos de PJ e PF o ideal é reunir as características em comuns das classes PJ e PF…ou seja, os métodos e atributos em comum e criar uma classe Pessoa do tipo abstract que contem esses elementos…e daí cria as duas classes PJ e PF com os seus elementos específicos…

para facilitar fiz um esboço aki em UML

segue a imagem, clica pra aumentar o tamanho
[URL=http://img253.imageshack.us/my.php?image=generalizacaocj0.jpg][/URL]
http://img253.imageshack.us/img253/7307/generalizacaocj0.th.jpg

Abraços

Rafael Oliveira

Olá diogenesvit,

Sim criar uma classe Pessoa apenas com os atributos id e Set de Enderecos e Set de Telefones e depois fazer as classes pessoas fisicas e juridicas derivarem da mesma, é uma solução legal sim. Modelagem é bem subjetivo depende muito de como você ver o problema, você por exemplo poderia ter um atributo nome que vem significar rzsocial para a pessoa juridica e pq tb não um numero que é o cpf ou cnpj… e por ai vai… não concordo em criar uma inteface para pojos… a ideia é o seguinte sempre veja o que entidade tem de igual em que servem para o mesmo contexto e coloque na super classe… vc ganha muito fazendo a herança principalmente ao tratar essas informações vc por exemplo pode mais tarde ter uma classe utilitária que te valide pessoa independentemente se é cpf ou cnpj.

Flw,

Rodrigo

Não se se é correto fazer isso, se não for por favor me desculpem… mas aproveitando a discussão, eu tenho uma situação, onde tenho uma classe Morador, e eu preciso saber se é um morador comum ou sindico.

Devo também criar uma superclasse Morador, e as classes MoradorComum e Sindico que herdem de Morador ?

Minha principal dúvida, é que, pelo menos até aqui, tudo entre eles é igual… só preciso saber quem é o Sindico.

Estava inclinado a criar somente um atributo que indicasse isso… mas não se a modelagem ficaria correta.

Alguém tem alguma idéia ?

Obrigado.

Abraços.

Segue abaixo uma solução possível para este tipo de impasse:

Não é aconselhavel utilizar especialização quando a classe possui um papel temporário - como no caso da classe Morador, que hora pode ser um síndico, ora pode ser morador comum. A melhor modelagem neste caso é a associação - o morador tem um papel, e este papel pode mudar ao longo do ciclo de vida dele.

A regra é simples: a especialização (herança) é sempre válida para todo o ciclo de vida do objeto. Então no exemplo dado do morador, haverá um momento em que ele não será mais síndico, logo a modelagem com herança não é a mais indicada.

Att.

Utilizar herança só se justifica quando a classe estende o comportamento de outra e quando você pretende usar polimorfismo. No caso do exemplo clássico PessoaFísica/PessoaJurídica normalmente o que variam são apenas os dados.

Caso não haja variação de comportamento, apenas de estado (os métodos são basicamente os mesmos por dentro, só os dados mudam) crie apenas uma classe e guarde os dados em classes separadas.

class Pessoa{
 DadosDaPessoa dados = null
}

class DadosDaPessoa{

 //dados em comum

}

class DadosDaPessoaFisica extends DadosDaPessoa{
 //...
}


class DadosDaPessoaJuridica extends DadosDaPessoa{
 //...
}