Грануляция моделей? - PullRequest
       22

Грануляция моделей?

5 голосов
/ 18 января 2010

Я занимаюсь разработкой CMS, в значительной степени основанной на компонентах Zend Framework. Ниже приведены некоторые таблицы базы данных для этой CMS:

site
| id | name |
-------------

locale
| languageCode | regionCode |
-----------------------------

site_locale // link sites with locales
| siteId | languageCode | regionCode | isActive | isDefault |
-------------------------------------------------------------

У меня есть модель с именем Site, которая состоит, среди прочего, из следующих методов:

getId()
getName()
listLocales() // list all locales for this site

Я нахожусь на грани того, как детализировать я должен определять модели:

Один из вариантов - вернуть SiteLocale объекты / модели (другими словами, представление таблицы БД) из метода listLocales(), где эти SiteLocale объекты содержат следующие методы:

getSite() // returns the Site model
getLocale() // returns a Zend_Locale
isActive() // is this locale active for the site this model represents?
isDefault() // is this the default locale for the site this model represents()

Другой вариант - просто создать следующие методы в модели Site и покончить с этим:

getDefaultLocale() // simply return the default site locale as Zend_Locale
listActiveLocales() // simply return all active site locales as Zend_Locales
listAllLocales() // simply return all site locales as Zend_Locales

Что, по вашему мнению, является правильным путем? А почему?

Кроме того, будет ли первый вариант (или, возможно, даже оба варианта) нарушать Закон Деметры ?

РЕДАКТИРОВАТЬ (22 января)
Хотя мне нравится ответ Джеффа , я все еще открыт для новых / других перспектив.

1 Ответ

3 голосов
/ 22 января 2010

Во-первых, в отношении таблиц базы данных: возможно, вы могли бы еще больше нормализовать базу данных. Существует дублирование между таблицами locale и site_locale. Конечно, я не вижу здесь общей картины, так что может быть что-то позади того, как вы это сделали.

Честно говоря, любой из вариантов подойдет. Я бы выбрал дизайн, который сделает ваш код более читабельным и понятным. Например, если вы выбрали первый вариант, вы бы в конечном итоге получили такие циклы повсюду?

site_locales = site.listLocales()
foreach (site_locale in site_locales) {
    if site_locale.isDefault() {
        do_something(site_locale.getLocale())
    }
}

Если так, то я бы избежал этого и пошел бы со вторым вариантом и в итоге получил бы:

do_something(site.getDefaultLocale())

Это гораздо понятнее с первого взгляда. Может быть, это даже улучшит производительность вашего сайта.

Тем не менее, если вы думаете, что собираетесь сделать большую работу, которая использует списки SiteLocales в будущем, но вы точно не знаете, что вы собираетесь делать, кроме getDefaultLocale(), listActiveLocales(), и listAllLocales(), тогда, возможно, первый вариант может быть идеальным. Или вы могли бы даже использовать комбинацию из двух.

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

...