вопросы проектирования композитных моделей - PullRequest
6 голосов
/ 24 марта 2011

У меня есть вопрос о двух операциях, которые вы обычно видите на примере составной диаграммы классов.
* GetDescendents
* GetChild (int)

Типичным примером являются файлы и каталоги.придерживаться этого.Допустим, интересующей операцией является Size, поэтому File имеет реальный размер, а Directory имеет Size, полученный из рекурсивной итерации GetDescendents.Все идет нормально.Мой вопрос касается использования клиентом GetDescendents.Скажем, вам нужны файлы в каталоге, которые являются изображениями для определенной операции.Поэтому на практике вы используете некоторую комбинацию GetDescendents и Children для возврата imageFiles (в зависимости от того, хочет ли клиент все вложенные imageFiles или только на корневом уровне).

Итак, вопрос номер один, не так ли?скорее всего, есть метод GetImageFiles для композита, в отличие от того, чтобы клиент понял это?И если предположить, действительно ли GetDescendents когда-либо практично выставлять вызывающим клиентам (например, ImageViewer) вне композиции?

Второй вопрос о GetChild (int);такое int порядковый индекс позиции для возврата одного ребенка?Уровень глубины в GetDescendents?Каков пример того, как клиент будет использовать этот метод?

Cheers,
Berryl

1 Ответ

4 голосов
/ 24 марта 2011

Эти вопросы связаны не с составным шаблоном как таковым, а с большей проблемой того, как вы разрабатываете API-интерфейс и недвусмысленно сообщаете о своих намерениях как разработчика класса.

Например, если вы хотите, чтобы ваш GetChild(int) дал индексированному непосредственному ребенку, вы можете назвать его GetChildAtIndex(int index); если вы хотите, чтобы он предоставлял дочерние элементы на определенном уровне в иерархии, вы можете назвать его GetChildrenAtLevel(int level) (обратите внимание, что это множественное число и возвращает коллекцию).

Вам, как дизайнеру класса, нужно предоставить достаточно операций, чтобы сделать ваш класс понятным и пригодным для использования. Если вы думаете, что очень распространенной операцией будет получение файлов изображений в структуре каталогов, вы можете использовать метод GetAllImageFiles(). Однако для более общего класса каталогов этот выбор кажется произвольным и находится на неправильном уровне абстракции. Почему файлы изображений такие особенные? Вместо этого вы можете предоставить более общий метод, который будет получать все файлы на основе их расширений, или метод, который использует предикат для фильтрации результатов на основе предоставленных клиентом критериев.

...