gpt4 book ai didi

models - 模型的粒度化?

转载 作者:行者123 更新时间:2023-12-02 05:45:24 25 4
gpt4 key购买 nike

我正在开发一个主要基于 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

我对于应该如何精细地定义模型持观望态度:

一种选择是从 listLocales() 方法返回 SiteLocale 对象/模型(换句话说,数据库表表示),其中这些 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

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

此外,第一个选项(或者甚至两个选项)是否会违反 Law of Demeter

编辑(1 月 22 日)
虽然我喜欢Jeff's回答,我仍然对新的/其他的观点持开放态度。

最佳答案

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

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

关于models - 模型的粒度化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2085841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com