Вопрос по использованию контроллеров - PullRequest
3 голосов
/ 05 июля 2010

Мне дали вариант использования приложения Quizz.Вариант использования предназначен только для создания новых тестов.У меня возникают проблемы с определением, какой дизайн лучше:

a)

альтернативный текст http://dl.dropbox.com/u/6187267/shooterpics/diagram1.jpg

b)

альтернативный текст http://dl.dropbox.com/u/6187267/shooterpics/diagram2.jpg

Хотя это может выглядеть как модель предметной области, на самом деле это диаграмма классов (мне было лениво добавлять методы / атрибуты в диаграммы :().

Идея, лежащая в основе всего этого, заключается в том, чтоУ меня есть QuizCatalog с Quiz zes. Каждый Quiz имеет набор Question s, который должен быть создан с помощью QuestionFactory (Question является абстрактным классом, а QuestionA,QuestionB и т. Д. Являются конкретными классами.) Каждый Question имеет набор PossibleAnswers.

Разница в терминах ассоциаций между Design A и Design B заключается в том, что в первом яучитывая, что CreateQuizController будет просто делегировать каждую задачу, которую он должен QuizCatalog. Если QuizCatalog нужно что-то сделать, он будет делегировать все, что может понадобиться в иерархии. Это на самом деле хорошо, так как кажется, что уменьшает связность.

Design B, с другой стороны, следует другой философии: ассоциации, наблюдаемые в Design A, все еще существуютst (поскольку QuizCatalog по-прежнему имеет Quiz zes, Question PossibleAnswer s и т. д.), но теперь я сделал CreateQuizController доступ в основном ко всем типам объектов в домене, которые могут понадобиться для созданияв процессе (я сигнализировал такого рода ассоциации с d).Идея состоит в том, что вместо того, чтобы просить QuizCatalog создать Quiz, CreateQuizController создаст Quiz сам по себе (и если ему нужно создать Вопросы для Quiz, он сам по себе будет таким же,происходит Question PossibleAnwser и т. д.).

Есть 2 вещи, которые меня беспокоят Design A:

1.

Если мне нужно создать временные объекты, которые нужно заполнить перед тем, как положить "всистема "(например, Quiz фактически добавляется к QuizCatalog только после того, как он был заполнен всеми требуемыми Question с), следуя этой схеме, мне придется хранить их в каком-то другом месте, кроме Controller.

Например, когда я впервые создаю Quiz, мне, вероятно, придется сохранить его в QuizCatalog, фактически не добавляя его в текущую коллекцию тестов, которая доступна для остальной системы.Я считаю такое поведение немного неловким.Я считаю, что лучше хранить такие временные объекты в Controller, как будто что-то не так происходит, тогда «Система» сохраняется так же, как и раньше, без проблем.

Проблема в том, чтоэто заставляет Controller знать почти обо всем, что может быть нежелательно.С другой стороны, нет никакой разницы в том, насколько связаны остальные классы в System.

2.

Если я собираюсь использовать Дизайн A, я на самом деле нене вижу большого смысла в использовании CreateQuizController, поскольку в принципе все можно сделать, просто имея ссылку на QuizCatalog.На мой взгляд, он просто делегирует всю свою работу в QuizCatalog, так почему она вообще стоит?

Кроме того, используя Design A, я бы, вероятно, счел QuestionFactory Синглтоном, в то время какесли использовать Design B, я бы, вероятно, просто попросил конструктор CreateQuizController принять экземпляр QuestionFactory.


Что вы думаете об этом?

Спасибо

PS: Только после рисования диаграмм я заметил, что у Quizz есть 2 z :( Мой плохой.

1 Ответ

1 голос
/ 05 июля 2010

Я думаю, что из-за именования у CreateQuizController слишком много обязанностей. Я предполагаю (опять же из его названия), что он может создавать тесты и контролировать тесты. Как насчет разделения этого на два класса, QuizFactory и QuizController?

Поэтому, если нам нужен новый тест, мы просим QuizFactory создать новый, QuizFactory затем создаст новый тест, используйте QuestionFactory, чтобы создать вопросы и возможные ответы, и мы добавим новая викторина для (статическая) QuizCatalog.

Если мы хотим запустить тест, мы затем выберем тест из каталога, создадим QuizController (с этим тестом), и QuizController запустит тест, представит вопросы и вести счет.

QuizController не нужно было бы знать вопросы, было бы достаточно, если бы тест предлагал методы, такие как getNextQuestion() и getPreviousQuestion(), и метод для проверки ответа кандидата (чтобы контролер мог знать реальный вопрос только).

Таким образом, отношения has-a от QuizController до Quiz будет достаточно. И в моем дизайне QuizCatalog будет (как) одноэлементным и, следовательно, статическим или принадлежит другому классу верхнего уровня, как некоторые QuizManager.

...