Чи існує схема дизайну для управління глибокими відносинами між багатьма?


10

У мене виникають проблеми з визначенням цього шаблону даних, я натрапив на роботу над декількома додатками.

Він складається з:

  1. Тип об'єкта, який складається з багатьох самих об'єктів
  2. Другий тип об'єкта, де кожен екземпляр "має багато" першого об'єкта
  3. І кожен з під-об'єктів першого об'єкта може змінюватися в кожному об'єднанні до другого типу об'єкта.

Простим прикладом може бути:

  1. Курс програмування, що складається з набору уроків
  2. Уроки складаються із заданих завдань.
  3. Курс може бути призначений студенту.
  4. Однак, коли курс призначений студенту, кожен урок та / або завдання можуть бути налаштовані для цього учня, із видаленням та доповненням, до того моменту, коли початковий курс може бути невпізнанним.

У моїх рішеннях це означає:

Після присвоєння курсу студенту курс завантажується в пам'ять. Тоді для кожного суб-об’єкта генерується об’єкт зв’язку студент / суб'єкт з відповідними метаданими. По суті, я використовую оригінальний об'єкт як шаблон для генерування необхідних настроюваних об'єктів.

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


2
Ви впевнені, що хочете "зменшити кількість даних"? Ви натомість шукаєте способи "зменшити кількість нетривіального коду та логіки", які потрібно написати для реалізації необхідної поведінки? (Я помічаю, що постійне управління даними потребує реляційної структури даних, подібно до бази даних.)
rwong

@rwong Так, "скорочення кількості нетривіального коду та логіки" - це моя кінцева мета. Для мене це означає певним чином зменшити складність даних, але це не обов'язково. Це стало настільки поширеною схемою даних, що мені цікаво, чи існує якийсь простіший спосіб управління ним.
Микола Пікерінг

1
В принципі це вдосконалена версія відносин m: n. Як щодо заголовка типу "Як керувати складними об'єктними відносинами"?
Thomas Junk

1
Величезна кількість даних не є такою ж, як величезний рівень складності даних. Складність в управлінні тим, що ви будуєте, ймовірно, зросте зі складністю більше, ніж з обсягом.
Уолтер Мітті

1
Цікаво. Я працював над декількома програмами, які мають цю схему, але ніколи раніше не помічали її. Також хотілося б побачити більш прості способи управління подібними даними.
Жуль

Відповіді:


6

Я бачу декілька варіантів залежно від того, що вам потрібно: (1) якщо є багато унікальних екземплярів, які дотримуються загального алгоритму, (2) якщо є багато подібних об'єктів або ви будете генерувати об'єкти під час виконання, і (3) якщо ви хочете динамічно змінювати поведінку об'єкта під час роботи. Примітка: ви можете комбінувати всі згадані тут зразки, якщо це необхідно.

  1. Якщо кожен "другий тип об'єкта" унікальний, але дотримується аналогічної моделі поведінки, ви можете використовувати шаблон шаблону . Здається, ви можете це робити. Але щоб зробити це явним, ваш абстрактний базовий клас має запрограмований загальний алгоритм; певні етапи цього алгоритму реалізуються у похідних класах.

  2. Якщо ви створите багато об'єктів або якщо створення об'єктів під час виконання важливо для вас, ви можете використовувати Factory Pattern .

  3. І якщо ви хочете динамічно змінити поведінку, Stategy Pattern може працювати. Наприклад, якщо студент у звичайній навчальній програмі вирішив бути особливими потребами або перейти на прискорену програму. Це працює, склавши «студент» предмета, який би представляв базовий клас навчальної програми. Навчальна програма буде присвоєна похідній навчальній програмі при будівництві студента (це звучить дивно) і пізніше може бути переведена на іншу отриману навчальну програму.

(Просто FYI, якщо використовується (3) Шаблон стратегії з C ++, вам доведеться оцінити склад.)

Щоб зберігати ваші об'єкти та другі об’єкти, можливо, варто розглянути Iterator Pattern (переглядати їх, додавати, видаляти, сортувати тощо).

Хорошим посиланням є шаблони дизайну Head First , які охоплюють згадані нами зразки та їх реалізацію. Вони працюють на Java.


0

Мені важко повірити, за наявності сховища даних чи наполегливості, що вам потрібно буде мати об'єкти з такою глибиною в будь-який момент часу виконання. Це для графічних інтерфейсів CRUD? Якщо так, то я б запропонував змінити ваш підхід з самого початку. IE:

Визначити підструктури , необхідні для студента , щоб показати, і statefully зберігати його вказівний походження назад в БД, і statelessly поновлення , що відбувається або з точки зору і серверної БД.


Я не впевнений, що розумію вашу пропозицію. Я повинен генерувати порожній субект, а потім примусити користувача до іншої форми, яка дозволяє їм змінювати субектив?
Микола Пікерінг

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

Редагувати: Це також може означати створення об'єктів для збору даних конкретних даних, що перебувають у операції - якщо ви ухиляєтесь до ORM через їх зручність у цьому відношенні.
Джон П. Фельц

Якщо я не розумію цього, я не думаю, що нічого з цього процесу можна зробити без громадянства. Все залежить від контексту дії користувача. Коли користувач створює основний об'єкт, він очікує, що підструктура буде доступна для зміни негайно.
Микола Пікерінг

-1

Індивідуальний курс для кожного студента до того моменту, коли початковий курс не впізнаваний, говорить про те, що початковий курс є просто посиланням "за замовчуванням". Що я б робив, це створити клас під назвою CustomizedCourse (або їх перелік) і мати його (або список цього) як власність студента. CustomizedCourse може мати посилання на оригінальний курс для «референтного» використання, але основна робота та дані будуть у самому CustomizedCourse.


downvoter хочете коментувати?
frezq

Я не заявив (я - ОП), але, схоже, ви намагаєтесь описати шаблон або шаблон стратегії, які вже були описані в іншій відповіді.
Микола Пікерінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.