2010-01-18 57 views
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合作對象ntain以下方法:

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答案,我還在開新/其他觀點。

回答

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()什麼,那麼也許第一種選擇可能是理想的。或者你甚至可以使用這兩者的組合。

至於德米特法則,它更像德米特的指導方針。只要你有意識地去做,理解你爲什麼要這樣做,並理解後果(如果有的話),就可以打破任何規則。例如,如果違反法律會導致更易於維護和可讀的代碼,但您仍然保留應用程序中的高級別關注點,則通常可以。所以我不擔心這兩個選項是否違反了法律。

+0

嗨,傑夫,謝謝你的迴應。關於重複,我使用了引用完整性約束(InnoDB),因此languageCode和regionCode是帶有約束的外鍵。我喜歡這種風格,因爲它可以輕鬆獲取多對多行集而無需加入語言環境表。但我確實希望能夠添加與網站分離的語言環境。希望這是有道理的。無論如何,我明白你在說什麼。我想你說服我使用這兩個選項,因爲我將利用你提到的場景(前端第一,後端管理員第二)。感謝您的輸入。 – 2010-01-22 01:26:02

+0

再次感謝傑夫。我要吃我的蛋糕,也要吃。 :) – 2010-01-28 15:38:26