5

我正在开发一个主要基于 Zend Framework 组件的 CMS。此 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

您认为正确的方法是什么?为什么?

此外,第一个选项(或者甚至两个选项)会违反得墨忒耳定律吗?

编辑(1 月 22 日)
虽然我喜欢Jeff 的回答,但我仍然愿意接受新的/其他观点。

4

1 回答 1

3

首先,关于数据库表:您可能可以进一步规范化数据库。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()也许第一个选项可能是理想的。或者你甚至可以使用两者的组合。

至于得墨忒耳法则,更像是得墨忒耳的指引。只要您有意识地违反任何规则,了解您为什么这样做,并了解后果(如果有的话),就可以打破任何规则。例如,如果违反法律导致代码更易于维护和可读,但您仍然在应用程序中保留高级别的关注点分离,这通常是可以的。所以我不会担心这两种选择是否违法。

于 2010-01-22T00:59:14.167 回答