estamos desenvolvendo um sistema que possui uma classe denominada Setor, esta classe possui um atributo denominado setorpai que é uma instância da classe Setor.
Desta forma podemos representar qualquer hierarquia funcional, mas a questão está na implementação:
As opções são:
quando instanciarmos um objeto da classe Setor apenas ler o id do setor pai.
quando instanciarmos um objeto da classe Setor, instanciaremos todos os setores hierarquicamente superiores, mesmo que não fizermos uso desta informação.
A primeira opção é mais simples, porém acredito que “foge” um pouco da boa prática de OO.
A segunda forma, teremos que validar a hierarquia para que o usuário não cadastre uma relação recursiva, do tipo: A–>B–>A
Já olhei os “design patterns” e não localizei nenhum que se aplique explicitamente para estes casos, alguém tem alguma sugestão? Qual a técnica que vocês mais utilizam?
Não sei se vc pode fazer assim, mas imaginei o seguinte:
Vc pode criar um atributo na classe setor que é um ArrayList. Para cada novo setor, vc coloca neste ArrayList todos os setores hierarquicamente superiores. Para isso vc pode passar o ArrayList do pai para o filho, sendo que no construtor do filho vc copia o ArrayList do pai para o ArrayList do filho, adicionando como último item o próprio pai.
Assim:
Setor A (setor com maior grau de hierarquia ==> ArrayList vazio)
Setor B (filho do setor A ==> ArrayList (A))
Setor C (filho do setor B ==> ArrayList (A, B))
E assim por diante…
Fazendo a cópia vc mantém o ArrayList do setor pai inalterado e mantém a lógica da hierarquia.
a principio eu não preciso saber que são os "pais"do pai, mas a questão que coloco é a seguinte:
Teremos uma tela de consulta de funcionários, e cada funcionário pertence a um setor, então na ficha dele teremos que apresentar o nome do setor dele, logo teremos uma instância do Setor. Mas para apresentar uma informação tão pequena eu deveria instânciar todos os objetos SetorPai? (informação que não será usado neste cao).
Outro ponto, listar todos os funcionários de um setor. Neste caso, temos que trazer todos os funcionários do Setor A e de todos os setores hierarquicamente abaixo de A.
Vocês vão ver que neste segundo elemento seria melhor implementar a relação de hierarquia na ordem inversa, como em uma árvore, o nó raiz possui todos os galhos etc. Mas no nosso sistema, os funcionários normalmente “herdam” algumas permissões dos setores pais… esta relação será mais utilizada.
A minha dúvida principal é se devemos sempre instanciar toda a hierarquia, ou criamos o atributo setorpai com apenas o código do setor pai e instanciamos os setores superiores “on-demand”.
porque o setor a que o usuário pertence não é uma informação no banco?
Existe uma tabela setor no banco?
instanciar tudo (estou respondendo desprezando a resposta para as perguntas que fiz acima) vai depender de quantas vezes vc iria acessar estas informações, do número de setores etc… vc tem que analisar o que sai mais barato… Se forem poucos setores vc pode carregar tudo de uma vez, por outro lado se forem relativamente muitos mas vc for precisar toda hora ficar realocando os objetos da classe setor, tvz isso gaste tempo demais…
no caso em particular, nossa instituição possui aproximadamente 150 Setores o que não é muito… e no pior caso teriamos algo em torno de 6 níveis.
Existe uma tabela setor, uma tabela funcionário e uma tabela setorfuncionario. A relação entre setor e funcionário é NxN. Normalmente um funcionário faz parte de apenas um setor, mas existem casos que uma pessoa pode estar vinculado a vários setores.
Dieval, se você não vai usar os dados do setor pai no momento em que cria o setor filho, prefira carregar somente o id do pai, e quando necessário, instanciar o pai. Chamamos isso de lazy loading - carga preguiçosa. Isso poupa recursos.
[quote=luis.soares]Dieval, se você não vai usar os dados do setor pai no momento em que cria o setor filho, prefira carregar somente o id do pai, e quando necessário, instanciar o pai. Chamamos isso de lazy loading - carga preguiçosa. Isso poupa recursos.
Abraço.[/quote]
Lazy loading realmente é uma boa pedida! Mas implementa-lo namão sera muito trabalhoso de preferencia em usar um framework como hibernate
[quote=brunohansen][quote=luis.soares]Dieval, se você não vai usar os dados do setor pai no momento em que cria o setor filho, prefira carregar somente o id do pai, e quando necessário, instanciar o pai. Chamamos isso de lazy loading - carga preguiçosa. Isso poupa recursos.
Abraço.[/quote]
Lazy loading realmente é uma boa pedida! Mas implementa-lo namão sera muito trabalhoso de preferencia em usar um framework como hibernate[/quote]
Valeu, eu já achei alguns tópicos aqui no fórum sobre o conceito “Lazy loading” e não tenho o problema dos meus VO dependerem dos DAO, vou apenas fazer uso de uma interface e de um método de fabrica.