Como você apontou, o filho em si raramente precisa acessar o pai, contanto que ele faça todo o trabalho e acompanhe seus filhos. No entanto, o clássico getParent
é mais útil quando você usa a estrutura de fora.
Cenário
Uma operação simples que pode causar problemas é a seguinte: dados dois widgets concretos que estão em algum lugar da sua árvore geral de widgets e um caso de uso que exige que você troque esses dois, como funciona a troca?
Opção 1: diga às crianças
Diga ao seu widget filho para swap(withOtherChild)
. Mas a troca envolve atualizar a estrutura de dados dos filhos dos pais de alguma forma. Como seu filho não conhece seus pais, como conseguir isso?
Opção 2: informe aos pais
Diga aos pais de uma criança para removê-lo e adicione o outro. Oh espere, mesmo problema. Você só tem objetos filhos e não há getParent
neles.
Opção 3: trabalho pesado
Como opção final, você pode percorrer toda a árvore de widgets para encontrar um pai com hasChild(x)
e outro com hasChild(y)
e depois voltar para a opção 2.
Solução
Você deve manter o pai, se desejar construir grandes árvores de widgets e executar operações que exijam mover a posição de um widget na árvore. Se suas árvores de widgets forem muito pequenas ou tiverem uma profundidade muito pequena, mas hasChild
acessadores rápidos , a opção 3 poderá ser aceitável para você e você poderá omitir a referência pai.
Referências em estruturas de dados em geral
O que você planeja fazer aqui é criar uma estrutura de dados para uma árvore. Vamos considerar uma simplificação e, por uma questão de argumento, suponha que todo widget possa ter apenas um filho. O resultado, é claro, é uma lista e sua pergunta agora se torna "eu deveria ter uma lista com um ou dois links?".
E, assim como as listas, não há resposta definitiva, mas apenas prós e contras. Os profissionais óbvios para o link único (ou seja, nenhuma referência aos pais) são a) mais fáceis de implementar eb) menos memória. Mas os contras incluem: a) algumas operações tornam-se lentas porque precisam atravessar a estrutura eb) não ter acesso fácil a essas operações pode significar que a estrutura de dados é difícil de usar ec) usa mais memória.
Por outro lado, a variante de dupla ligação, ou seja, com referência aos pais, praticamente inverte esses prós e contras.
Porém, em termos de uma biblioteca / estrutura da GUI, os limites de memória geralmente não são um problema que proíbe os indicadores-pai. Se você excluir isso e perceber que é uma biblioteca / estrutura, e, portanto, é preferível que seja difícil de implementar, mas fácil de usar, então você basicamente exclui os profissionais acima de uma abordagem de vínculo único.
Não conheço as peculiaridades do seu projeto, por isso não pretendo dizer para você manter a referência dos pais, pois alguns dos meus argumentos acima podem não se aplicar ao seu caso. Em geral, no entanto, considero que as referências pai em uma estrutura de dados de widget valem a pena pelas razões acima.
Eu diria que, quando as crianças conhecem seus pais, um widget e todos os seus ancestrais formam uma cadeia de responsabilidades . Um exemplo típico é um evento de mouse recebido por um widget: o widget pode consumir o evento (e reagir adequadamente) ou transmitir o evento ao pai, que pode consumir ou transmitir ao pai, etc.
No caso de Qt, cada widget recebe seu pai pelo construtor, e isso indica que o widget pertence ao pai. Em particular, a exclusão do pai aciona a exclusão do widget.
fonte