Bom dia! Sou iniciante e quero programar o seguinte cenário.
Possuo as seguintes regras para um relacionamento entre as classes Empresa e Funcionario:
1 - Empresa só pode existir se tiver funcionário. Ou seja, em nível de código, quando uma empresa for instanciada, pelo menos 1 funcionário também deverá ser instanciado.
Obs.: Aqui enxerguei um problema: Dentro da classe empresa eu preciso ter um atributo funcionário do tipo Funcionario para atender a minha regra de que a Empresa controla o ciclo de vida de Funcionario. Só que dessa forma, só poderei criar 1 funcionario para cada empresa. A forma de resolver isso seria com um array mas devido às limitações de arrays quero trabalhar com coleções como List, por exemplo. Só que se eu usar uma List, não terei mais o atributo funcionario do tipo Funcionario na classe empresa. A partir daí, Empresa pode passar a existir sem funcionário e minha regra é quebrada. Como eu resolvo isso no código? Seria possível, escrever pra mim, por gentileza?
2 - Na minha regra, também não faz sentido existir funcionário sem empresa. Afinal de contas, funcionário trabalha em uma empresa e sem empresa não existe funcionário.
Conclusão: Possuo relacionamentos bilaterais fortes. Um controla o ciclo de vida do outro. Na UML, relações fortes entre classes é determinado como composição. Mas segundo as literaturas que estou estudando, uma inclusive é oficial para o exame da Oracle, não existe esse tipo de relacionamento forte bilateral. Esse caso seria de multiplicidade vários-para-vários.
Como resolvo essa questão a nível de código e como ficam meu diagrama com essas duas classes?
acho muito forte esta restrição. não raro existem empresas sem funcionarios ( inativas digamos )
Na minha regra, também não faz sentido existir funcionário sem empresa.
vamos la, o funcionario “pertence” a uma empresa. é na verdade um vinculo. quando vc demite um funcionario isso vira o que?
ao meu ver vc esta forçando uma relação entre Empresa e Funcionario que é irreal em alguns contextos (perceba que no seu contexto isso pode fazer sentido, porem eu acho dificil). o que vc pode criar são estados para estes objetos.
por exemplo, um Funcionario pode pertencer a duas empresas? tem gente que faz jornada dupla ou meio periodo. mas talvez para uma determinada tarefa isso não possa acontecer.
outra coisa é talvez vc queira diferenciar empresas que não tenham funcionarios para alguma coisa.
se uma empresa deve ter um funcionar e um funcionario deve ter uma empresa, vc precisa criar simultaenamente o primeiro funcionario E empresa.
o que eu vejo é vc ter uma maquina de estados: valido e invalido. uma empresa é invalida se nao tiver funcionarios e vice versa. quando vc cria objetos eles estão nesse estado. quando vc faz o link então eles passam a ser validos.
a criação desses objetos talvez tenha que ser feita por uma Factory.