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

私は、モデルをどのように粒度化する必要があるかについて、ちょっと迷っています。

1 つのオプションは、メソッドSiteLocaleからオブジェクト/モデル (つまり、DB テーブル表現)を返すことです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()

もう 1 つのオプションは、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 日)
私はジェフの答えが好きですが、私はまだ新しい/他の視点を受け入れています。

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())
    }
}

もしそうなら、私はそれを避けて、2番目のオプションを選択し、最終的に次のようになります:

do_something(site.getDefaultLocale())

これは一目ではるかに理解できます。多分それはあなたのサイトのパフォーマンスを改善するでしょう。

ただし、将来、SiteLocalesのリストを利用して多くの作業を行う予定であるが、、、、およびを超えgetDefaultLocale()て何を行うかが正確にわからない場合は、おそらく最初のオプションは次のようになります。理想。または、2つを組み合わせて使用​​することもできます。listActiveLocales()listAllLocales()

デメテルの法則に関しては、それはデメテルのガイドラインのようなものです。意識的にルールを破り、なぜそれを行っているのかを理解し、結果があればそれを理解する限り、ルールを破ることは問題ありません。たとえば、法律に違反すると、コードの保守性と読み取り性が向上しますが、アプリケーションで関心の分離を高度に維持できる場合は、通常は問題ありません。したがって、どちらのオプションも法律に違反するかどうかについては心配しません。

于 2010-01-22T00:59:14.167 に答える