Как выбрать вид в зависимости от типа объекта? - PullRequest
0 голосов
/ 11 апреля 2011

У меня есть 4 объекта («Роман», «Короткая история», «Нехудожественная литература», «Научная фантастика»), каждый из которых выходит из базового класса Книги.Пользователь может просматривать страницу сведений о книге, на которой должен отображаться другой набор сведений в зависимости от типа книги.Таким образом, в идеале, я мог бы иметь 4 сценария просмотра различий, которые будут вызываться в соответствии с типом выбранной книги.Как бы я это сделал?Должен ли я хранить ссылку на скрипт в каждом объекте?Должен ли я иметь оператор switch в действии контроллера, чтобы определить правильное представление?

Ответы [ 3 ]

1 голос
/ 11 апреля 2011

присвойте имена сценариям / файлам представлений в качестве объектов с суффиксом деталей (например, novel_details.php).

Поэтому, когда вы отображаете / визуализируете вид, вы анализируете имя объекта с подробностями sufix

$this->render( $object->name."_details.php");*

Редактировать: * Все зависит от того, какую платформу MVC вы используете.

0 голосов
/ 11 апреля 2011

Вы могли бы иметь ...

$bookTypeToView = array(
   'novel' => 'novel.php',
   'short_story' => 'short.php'
   ...
);

А потом сделать что-то похожее на ...

$this->view = isset($bookTypeToView[$book['type']]) ? $bookTypeToView[$book['type']] : 'default';
0 голосов
/ 11 апреля 2011

Реализуете ли вы MVC самостоятельно или используете уже существующий фреймворк? Платформы типа Rails обычно имеют хорошее отображение между классами / методами и запросами, например ::100100

GET /book/view/id/1 --> Book::view(1)

В зависимости от структуры ваших моделей, это может соответствовать GUID книги; альтернативно, если вы настаиваете на такой иерархии типов, вы можете предпочесть что-то вроде:

GET /book/view/type/novel/id/3 --> Novel::view(3)

Где id относится к роману, а не к книге, id. Кроме того:

GET /novel/view/id/3 --> Novel::view(3)

будет работать идентично.

Может быть, более уместно, вы должны отдавать предпочтение композиции, а не наследованию; есть ли причина иметь 4 типа книг? Чем они действительно отличаются? Если они различаются только по типу метаданных, которые они содержат, вы можете рассмотреть инкапсуляцию этого различия каким-либо иным способом, кроме перемещения по иерархии типов (например, если методы, влияющие на различные типы книг, похожи, вы просто исключите любой алгоритм, который применяется к определенным типам книг, и используйте композицию объектов, чтобы включить эту функциональность в ваши классы). Я думаю, что это также позволит вам упростить структуру представления, что, косвенно, даст вам более четкое решение этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...