자녀 대 부모 연결-나쁜 생각?


15

부모가 자녀에 대해 알고있는 상황이 있지만 자녀가 부모를 참조 할 수 있기를 바랍니다. 그 이유는 아이가 기분이 좋을 때 가장 중요하거나 가장 중요하지 않은 것으로 지정할 수 있기를 원하기 때문입니다. 아이가 이렇게하면 부모 아이의 위나 아래로 움직입니다.

과거에는 자식의 WeakReference 속성을 사용하여 부모를 다시 언급했지만 성가신 오버 헤드가 추가되지만 가장 좋은 방법 일 수 있습니다.

이것은 단지 나쁜 생각입니까? 이 능력을 어떻게 다르게 구현 하시겠습니까?

업데이트 1 : 컨텍스트 추가 이것은 렌더링 시스템이므로 부모 컨테이너는 함께 그룹화 된 창 목록입니다. "가장 중요합니다!"라는 하위 항목 (창) 기본적으로 나머지 창의 맨 위에 렌더링되기를 원합니다.

부모는 이러한 자식을 함께 그룹화하는 논리적 컨테이너 일뿐입니다. 요청을 맨 위에 표시하기 위해 이벤트를 추가하는 것이 좋은 아이디어임을 알 수 있습니다. 그러나 구현 (자녀가 부모와 함께하고 싶은 일)을 제외하고 왜 자녀-> 부모 연결을 원하지 않습니까? 이중으로 연결된 목록을 사용하면 사람들이 무언가를 오갈 수 있습니다.


3
필요하지 않습니다 WeakReference. .net 가비지 수집기는주기를 처리 할 수 ​​있습니다. 자녀가 더 이상 사용하지 않으면 (부모가 가리 키지 않음) 부모에 대한 참조가 포함되어 있음에도 불구하고 수집됩니다.
dbkk

두 자녀가 모두 가장 중요한 자녀가되고 싶다고 생각하면 어떻게됩니까?
btilly

@btilly 가장 중요한 자식은 실제로 부모의 자식 목록에서 스택 맨 위로 순서를 바꿉니다. 그래서 누가 마지막으로 그것을 하는가가 가장 중요해집니다. 내 시나리오에서는 가장 중요한 충돌이 없을 것입니다.
Thraka

답변:


18

이것은 단지 나쁜 생각입니까?

자주.

  • 부모의 캡슐화를 중단합니다.
  • 둘 다에서 커플 링을 증가시킵니다.
  • 그것은 어린이가 시스템의 나머지 부분에 도달 할 수있는 돌파구 역할을하며, 사람들 그 참조 남용 하기 때문에 모호한 근처의 물건과의 결합을 증가시킵니다.
  • 부모가없는 아이들을 원한다면 디자인이 제한됩니다.

어떻게 더 잘합니까? 아이는 그것이 소장품에 있는지 알거나 돌보지 않아야합니다. 중요한 것으로 간주하는 대신, 아는 사람 (부모)이 우선 순위를 높일 수 있도록 (또는 자녀가 살고있는 상황에 대한 규칙이 무엇이든) 알고있는 일부 사건이 발생했음을 알리는 것이 좋습니다. 나는 그것에 감격하지 않으며 아마도 어린이의 모델과 중요성 행동 사이의 우려를 더 잘 분리하는 것을 선호하지만 더 많은 맥락이 없으면 정교해질 수 없습니다.

[편집하다:]

예, 렌더링 시스템은 부모의 소유권 중 하나입니다 ... 글쎄, 말하고 싶지는 않지만, 그것이 이루어졌고 세상의 끝이 아닌 경우입니다. 컨트롤 포커스를 제공하기 위해 여전히 입력 처리기 (또는 무엇이든)가 트리를 걷고 자식을 찾는 것이 아니라 재정렬해야 할 컬렉션을 알고 부모에게 갈 것을 알고있는 무언가를 호출하는 디자인을 선호합니다.


1
이것은 좋은 대답이며 아마도 당신이 제기 한 모든 점을 고려하여 문제에 적용되는지 확인해야합니다. 비록 당신이 간단한 구현으로 참조로 시작하고 물건이 손에 닿지 않을 때 리팩토링하면 세상의 끝이라고 생각하지는 않습니다.
rperetti

정답입니다. 그러나 자식과 부모의 연결이 나쁜 생각이라면 객체 지향 프로그래밍은 더 이상 실제 객체와 관련이 없습니다. 이것을 좋은 것으로 만들 방법이 없습니까?
Manoj R

지금까지이 답변에 감사드립니다. 원래 질문에 더 많은 컨텍스트를 추가했습니다.
Thraka

1
@ManojR-객체 지향 프로그래밍은 실제 객체와 관련이 없었습니다.
Telastyn

편집하면 WPF \ Silverlight의 VisualTreeHelper에 대해 생각하게됩니다. 이를 통해 현재 컨트롤과 나머지 UI 시스템 컨트롤 간의 관계에 대해 쿼리 할 수 ​​있습니다. 다른 모든 것을 호스팅 할 루트 컨트롤이 있기 때문에 이와 같은 것을 구현할 수 있다고 생각합니다. 감사!!
Thraka

0

자녀가 가장 중요하다고 결정한 시점까지 처형은 어떻게 이루어 졌습니까? 부모님을 통해 도착 했습니까? 그렇다면 부모에 대한 참조를 해당 메소드에 보낼 수 있습니다.

예. 모든 노드에 어떤 종류의 update () 메소드가 있다면

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

당신은 그것을 변경할 수 있습니다

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

예, 이것이 좋은 방법입니다. 그러나 내 상황에서는 클라이언트 논리 코드가 부모의 루프에 의해 시작되지 않을 수 있습니다.
Thraka

0

나는 그것이 나쁜 생각이라고 생각하지 않습니다. 각 자식에 정렬 순서 값을 추가하여이 문제를 해결할 수 있습니다. 웹 페이지에서 객체를 서로 위에 또는 뒤에 표시하는 데 사용되는 "z-index"와 같은 것을 상상하고 있습니다.

어떻게 이런 식으로 코드를 작성할지 잘 모르겠지만 개념은 실현 가능합니다.


이 솔루션으로 문제는 여전히 존재합니다. 이것은 단지 배열 순서 개념을 z- 인덱스로 대체합니다. 나는 여전히 자녀와 부모 사이의 의사 소통 시스템을 가져야 할 것이다. 그래도 감사합니다 :)
Thraka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.