Избегайте циклических ссылок на отношения объектов ко многим - PullRequest
0 голосов
/ 22 декабря 2018

Я сталкиваюсь с некоторыми проблемами объектных отношений в приложении, которое, помимо прочего, обрабатывает упражнения с несколькими вариантами ответов.

Думая об этих упражнениях, я могу что:

1- У меня естьупражнения, в которых есть несколько вопросов, которые имеют несколько альтернатив.2- Конкретный вопрос может быть частью упражнений.3- Конкретная альтернатива НЕ может быть частью нескольких вопросов.

С точки зрения отношений:

Упражнение Вопрос
Вопрос <1-n> Альтернатива

Я кодировал классы следующим образом:

class Exercise {
    private $id;
    private $name;
    private $questions = []; //array of ExerciseQuestion
    //...
}

class ExerciseQuestion {
    private $id;
    private $exercise = new Exercise();
    private $question = new Question();
    private $order; //handles question's order of appearance
    //...
}

class Question {
    private $id;
    private $wording;
    //...
}

class Alternative {
    private $id;
    private $question = new Question();
    private $text;
    //...
}

Я не знаю, правильно ли я это сделал, но вместо того, чтобы хранить идентификаторы отношений в атрибутах классов, я храню экземпляр связанного класса,Когда я начинал, это был правильный подход.

Проблема, которую я предвидел, заключается в том, что в отношении Exercise-ExerciseQuestion-Question я попаду в ад круговых ссылок.У меня будет упражнение с несколькими ExerciseQuestion, которое содержит экземпляр Exercise с большим количеством ExerciseQuestion внутри.Прав ли я в этом предположении?

Есть ли лучший или правильный способ выразить такие отношения?Стоит ли менять идентификаторы хранилищ вместо экземпляров или можно использовать какой-то шаблон проектирования?

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Я не уверен, понимаю ли я, что вы говорите, но если вы спрашиваете: это циклическая ссылка проблематично?ответ да нет, это зависит от того, что вы собираетесь делать и как вы решаете свою проблему.Но если вы говорите о своей реализации, то ответ однозначно: нет, это не проблема, потому что атрибут class хранит не «объект», а «ссылку на объект», следовательно, нет круговой конструкции, которая привела бы к бесконечной рекурсивной итерации в вашемcase Good luck

0 голосов
/ 22 декабря 2018

У вас проблема с вашей моделью.В объекте отношения должны храниться только идентификаторы частей, участвующих в отношении, exerc_id и question_id, а также любые дополнительные атрибуты, которые применяются к отношению обоих объектов, например порядок.Вы не создаете экземпляры вовлеченных объектов в объекте отношений.

Если быть точным, ваша модель ER выглядит следующим образом

Exercise (id, name)
Question (id, wording)
ExerciseQuestion (exercise_id, question_id, order) // both ids
                                                   // form primary key
Alternative (id, text, question_id)

И ваши классы должны следовать этому.

0 голосов
/ 22 декабря 2018

Если я правильно вас читаю, у вас на самом деле нет проблем.Если ваш домен включает в себя круговые или самоссылающиеся отношения, то ваши модели тоже должны это делать.

Поскольку ваши объекты являются сущностями (они имеют идентичности), вам следует позаботиться о том, чтобы для каждого идентификатора существовал только один экземпляр.Но до тех пор, пока вы применяете это, они могут ссылаться друг на друга так, как вам нужно.

Теперь с циклическими ссылками может быть непросто иметь дело, если вам нужно каким-то исчерпывающим образом пройти по графу объектов.В этом случае вам нужно позаботиться о том, чтобы не попасть в бесконечный цикл.Но если ваш домен на самом деле имеет эти отношения, то вам нужно смоделировать их, и вам нужно будет реализовать какой-то способ обнаружения циклов и работы с ними.Детали будут проинформированы вашими конкретными потребностями.

...