Пов’язування дитини з батьком - погана ідея?


15

У мене ситуація, коли мій батько знає про це дитині (да), але я хочу, щоб дитина могла посилатися на батьків. Причиною цього є те, що я хочу, щоб дитина мала здатність визначати себе як найважливіше чи найменш важливе, коли йому це здається. Коли дитина це робить, вона переміщує її вгорі або внизу батьків батьків.

Раніше я використовував властивість WeakReference для дитини, щоб повернутися до батька, але я вважаю, що це додає дратівливих накладних витрат, але, можливо, це просто найкращий спосіб зробити це.

Це просто погана ідея? Як би ти реалізував цю здатність по-іншому?

Оновлення 1: Додавання більше контексту. Це система візуалізації, тому батьківський контейнер - це список вікон, згрупованих разом. Дочірній предмет (вікно), на якому написано "Я найважливіший!" хоче, в основному, бути зробленим на вершині решти вікон.

Батько - лише логічний контейнер для групування цих дітей разом. Я можу побачити, де додавання події, яка сигналізує про запит бути вгорі, є гарною ідеєю. Але реалізація (що дитина хоче зробити з батьком) убік, чому б ви не хотіли мати зв’язок між дитиною та батьком? Двічі пов'язані списки роблять це, щоб люди могли переходити до чогось і з нього.


3
Вам не потрібно WeakReference. .Net сміттєзбірник може обробляти цикли. Якщо дитина більше не користується (батько не вказує на неї), її збирають, незважаючи на те, що вона містить посилання на батьків.
dbkk

Що станеться, якщо двоє дітей думають, що вони хочуть бути найважливішими дітьми?
btilly

@btilly Найважливіша дитина насправді просто перевпорядковує її у верхній частині стека в батьківському списку дітей. Отже, хто робить це останнім, стає найважливішим. За моїм сценарієм, у вас ніколи не було б найважливішого конфлікту.
Трака

Відповіді:


18

Це просто погана ідея?

Часто.

  • Це порушує інкапсуляцію батьків.
  • Це збільшує зв'язок в обох.
  • Це служить точкою прориву для дитини, щоб потрапити на решту системи, посилюючи зв'язок із чим-небудь розпливчастим поряд із нею (адже люди будуть зловживати цим посиланням)
  • Це обмежує ваш дизайн, якщо ви коли-небудь хочете дітей без батьків.

Як зробити це краще? Дитина не повинна знати або дбати про те, що вона знаходиться в колекції. Замість того, щоб вважати себе важливою, вона повинна сигналізувати про те, що якась подія, про яку вона знає, сталася, тому хто небайдужий (батько) може збільшити свою пріоритетність (або будь-які правила для контексту, в якому живе дитина). Я не в захваті від цього, і, можливо, я вважаю за краще краще розділити проблеми між моделлю дитини та важливою поведінкою, але не можу розробитись без більшого контексту.

[редагувати:]

Так, системи візуалізації - це один випадок, коли батьківські права власності ... ну, я не хочу сказати, що це має сенс, але це один випадок, коли це було зроблено, і це не кінець світу. Для надання контрольної уваги я б все-таки віддав перевагу дизайну, де обробник вводу (або будь-який інший) ходить по дереву і знає, яку колекцію потрібно переупорядкувати, а не шукати дитину, називаючи щось на ній, що знає, щоб перейти до її батька.


1
Це хороша відповідь, і ви, мабуть, повинні врахувати всі питання, порушені нею, і подивитися, чи стосуються вони вашої проблеми. Сказавши, що, хоча, я не думаю, що це кінець світу, якщо ви почнете з посилання як простої реалізації та перефактуруєте її, коли / якщо речі вийдуть з-під руки.
rperetti

Відповідь правильна. Але якщо зв'язування дитини з батьками є поганою ідеєю, то об'єктно-орієнтоване програмування більше не пов'язане з реальними життєвими об'єктами. Чи не існує способу зробити це гарною справою?
Маной Р

Дякую за цю відповідь поки що. Я додав більше контексту в своє початкове запитання.
Трака

1
@ManojR - об'єктно-орієнтоване програмування ніколи не було пов'язане з реальними життєвими об'єктами.
Теластин

Ваша редакція змушує задуматися про VisualTreeHelper у WPF \ Silverlight. Це дозволило вам запитати про відношення поточного контролю до решти елементів управління користувальницьким інтерфейсом. Я думаю, я міг би реалізувати щось подібне, тому що у мене також є кореневий контроль, який буде розміщувати все інше. Спасибі!!
Трака

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);
    }
}

Так, це чудовий спосіб зробити це. Однак у моїй ситуації можливо, що логічний код клієнта не був ініційований батьківським циклом.
Трака

0

Я не думаю, що це погана ідея. Ви можете вирішити це, додавши значення порядку замовлення для кожної дитини. Я маю на увазі щось на зразок "z-index", що використовується для відображення на веб-сторінках об'єктів, розташованих один за одним або позаду.

Я не впевнений, як би ви кодували щось подібне, але ця концепція звучить доцільно.


З цим рішенням проблема все ще існує. Це лише замінює концепцію порядку в масиві на z-індекс. Я все одно повинен був би мати систему спілкування від дитини до батька. Дякую хоча :)
Thraka
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.