Como modelar classes pessoa, pessoafisica e pessoajuridica

Boa noite pessoal! Eu pesquisei e achei alguns tópicos aqui no fórum, mas mesmo assim meu problema persiste.

Estou desenvolvendo um sistema em que tenho um seguinte cenário: eu tenho as entidades Prefeitura, Secretarias, Funcionários e Fornecedores. Prefeitura e Secretarias são estritamente pessoas jurídicas, Funcionários pessoas físicas e os Fornecedores podem ser pessoas físicas e/ou pessoas jurídicas. Nunca havia me deparado com esse cenário.

Alguém teria uma solução prática? Pensei na herança ou composição, mas li em alguns tópicos não ser muito interessante.

Não se prenda muito nessas questões acadêmicas. Funcionários são funcionários, Fornecedores são fornecedores, e etc.

Boa tarde! Agradeço pela contribuição.

A questão é que não é acadêmica, é uma situação real que o sistema que está sendo desenvolvido requer. Infelizmente preciso dessa modelagem.

Oi @Maykon_Mendel,

Esse é um tema que sempre tive interesse e nunca vi uma soluçao que achasse realmente boa, sendo usada na prática.
Eu tentei participar desse tópico aqui: Complexidade x Simplicidade | Teóricos x Práticos
Mas no fim das contas nenhuma conclusao foi alcançada.

Hoje em dia, a primeira coisa que iria analisar é se o comportamento dessas entidades sao diferentes: Que métodos a classe Prefeitura tem que a Secretaria nao tem?
Segundo, eu tentaria identificar que tipo de informaçao você precisa armazenar pra cada uma dessas entidades.

Se todas tem comportamentos em comum, mas com dados diferentes, eu criaria interfaces pra identificar os comportamentos e uma classe pra cada, para persistir dados.

Um aspecto muito comum, que geralmente é ignorado, é o tempo para essas relaçoes. Você pode ter o funcionário José no ano 1, que sai da sua empresa e vira um Fornecedor no ano 2 e finalmente abre sua própria empresa, virando o contato de uma empresa, no ano 3, que ainda é seu fornecedor. Como você representa isso?

Eu gosto da idéia de separar dados que nao mudam sobre uma pessoa física (cpf, nome) ou pessoa jurídica (cnpj, nome fantasia, razao social) dos dados que mudam conforme o relacionamento delas com sua empresa (funcionário, fornecedor, etc).

@javaflex eu gosto da sua abordagem pragmática para esses problemas.

Como exatamente você costuma modelar esses conceitos em termos de classes e tabelas?

Olá AbelBueno,

Basicamente é um ideia que tenho algum tempo: cadastro uma pessoa e depois vinculo ela com outra classe de acordo com os novos dados. Dessa forma uma determinada pessoa pode ser funcionário e fornecedor ao mesmo tempo, tendo um cadastro de pessoa mas com duas responsabilidades no sistema. Estaria correto?

Apenas você pode dizer se está correto ou nao, baseado nos requisitos do seu sistema.
Se atende o que você deseja fazer está correto.

Em geral sua idéia me parece sensata.
Eu sempre achei estranho modelagens onde você tem uma Pessoa como classe mae de PessoaFísica e PessoaJurídica. Ou ainda, ter uma classe Cliente que herda de Pessoa.

Pelo caminho que está indo parece que está evitando essas armadilhas.

Opa @AbelBueno, seus posts são sempre importantes também. Tem um caso similar com opinião minha neste post: Dúvida: Persistir classe que utiliza herança

Pesquisei mais a fundo, e o padrão Strategy também seria uma boa para resolver esse problema e iria me permitir expandir o sistema de forma mais fácil.