Ligação filho a pai - má ideia?

15

Eu tenho uma situação em que meus pais sabem sobre o filho (duh), mas eu quero que o filho possa fazer referência ao pai. A razão para isso é que eu quero que a criança tenha a capacidade de se designar como mais importante ou menos importante quando lhe apetecer. Quando a criança faz isso, ela a move para a parte superior ou inferior dos filhos dos pais.

No passado, usei uma propriedade WeakReference na criança para me referir ao pai, mas acho que isso acrescenta uma sobrecarga irritante, mas talvez seja a melhor maneira de fazê-lo.

Isso é apenas uma má ideia? Como você implementaria essa capacidade de maneira diferente?

Atualização 1: Adicionando mais contexto. Como é um sistema de renderização, o contêiner pai é uma lista de janelas agrupadas. O item filho (janela) que diz "Eu sou mais importante!" quer basicamente ser renderizado no topo das demais janelas.

O pai é apenas um contêiner lógico para agrupar esses filhos. Posso ver onde é uma boa ideia adicionar um evento para sinalizar a solicitação de estar no topo. Mas a implementação (o que a criança quer fazer com os pais) à parte, por que você não gostaria de ter um vínculo entre filhos e pais? Listas duplamente vinculadas fazem isso para que as pessoas possam passar de e para algo.

Thraka
fonte
3
Você não precisa de um WeakReference. O coletor de lixo .net pode lidar com ciclos. Se o filho não estiver mais em uso (o pai não está apontando para ele), ele será coletado apesar de conter uma referência ao pai.
dbkk
O que acontece se duas crianças pensam que querem ser as crianças mais importantes?
btilly
@btilly O filho mais importante, na verdade, apenas o reordena no topo da pilha na lista de filhos dos pais. Então, quem quer que dure, se torna mais importante. No meu cenário, você nunca teria conflitos dos mais importantes.
Thraka

Respostas:

18

Isso é apenas uma má ideia?

Muitas vezes.

  • Ele quebra o encapsulamento do pai.
  • Aumenta o acoplamento em ambos.
  • Ele serve como um ponto de fuga para a criança para chegar ao resto do sistema, aumentando o acoplamento com qualquer coisa vagamente perto dele (porque as pessoas vão abusar essa referência)
  • Isso limita seu design se você quiser filhos sem pais.

Como isso melhora? A criança não deve saber ou se importar que esteja em uma coleção. Em vez de se considerar importante, deve sinalizar que aconteceu algum evento para que quem se importa (os pais) possa aumentar sua prioridade (ou quaisquer que sejam as regras para o contexto em que a criança vive). Não estou empolgado com isso e talvez prefira uma melhor separação de preocupações entre o modelo da criança e o comportamento importante, mas não posso elaborar sem mais contexto.

[editar:]

Sim, os sistemas de renderização são um caso em que a propriedade dos pais ... bem, não quero dizer que faz sentido, mas é um caso em que isso foi feito e não é o fim do mundo. Para dar um foco de controle, eu ainda preferiria o design em que o manipulador de entrada (ou qualquer outra coisa) anda na árvore e sabe qual coleção reordenar, em vez de encontrar a criança, chamando algo nela que sabe ir para o pai.

Telastyn
fonte
1
Esta é uma boa resposta e você provavelmente deve considerar todos os pontos levantados por ela e ver se eles se aplicam ao seu problema. Dito isto, embora eu não ache que é o fim do mundo, se você começar com a referência como uma implementação simples e refatorá-la quando / se as coisas ficarem fora de controle.
Rperetti
A resposta está certa. Mas se a vinculação entre pais e filhos é uma má ideia, a programação orientada a objetos não está mais relacionada aos objetos da vida real. Não existe uma maneira de tornar isso uma coisa boa?
Dilsh R
Obrigado por esta resposta até agora. Eu adicionei mais contexto na minha pergunta original.
Thraka
1
@ManojR - a programação orientada a objetos nunca foi relacionada a objetos da vida real.
Telastyn
Sua edição me faz pensar no VisualTreeHelper no WPF \ Silverlight. Isso permitiu que você consultasse sobre o relacionamento do controle atual com o restante dos controles dos sistemas da interface do usuário. Acho que eu poderia implementar algo assim, porque também tenho um controle raiz que hospedará todo o resto. Obrigado!!
Thraka
0

Como a execução chegou ao ponto em que o filho decide que quer ser mais importante? Chegou lá através dos pais? Se sim, você pode enviar referência ao pai para esse método.

por exemplo. se todos os nós tiverem algum tipo de método update () que faça algo como

void update() {
    doSomething()
    for(Node n:childs){
        //do something
        n.update();
    }
}

você pode mudar para

void update(Node parent) {
    doSomething(parent)
    for(Node n:childs){
        //do something
        n.update(this);
    }
}
user470365
fonte
Sim, esta é uma ótima maneira de fazê-lo. No entanto, na minha situação, é possível que o código lógico do cliente não seja iniciado pelo loop do pai.
Thraka
0

Não acho que seja uma má ideia. Você pode resolver isso adicionando um valor de ordem de classificação a cada filho. Estou visualizando algo como "z-index" usado para exibir objetos em cima ou atrás um do outro em páginas da web.

Não tenho certeza de como você codificaria algo assim, mas o conceito parece viável.

Michael Riley - também conhecido por Gunny
fonte
Com esta solução, o problema ainda existe. Isso substitui apenas o conceito de ordem na matriz pelo z-index. Eu ainda teria que ter um sistema de comunicação de filho para pai. Obrigado embora :)
Thraka