2010-01-18 3 views
5

젠드 프레임 워크 구성 요소를 기반으로 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 

나는에 가지 해요 내가 모델을 정의하는 방법 granularized에 울타리 :

하나의 옵션은 SiteLocale 개체를 반환하는 것입니다 /를 listLocales() 방법이 SiteLocale 객체의 공동에서 (즉 DB를 테이블 표현) 모델 다음과 같은 방법 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()) 

이 훨씬 더 이해하기 빠른 눈과입니다. 어쩌면 사이트 성능을 향상시킬 수도 있습니다.

그러나, 당신은 당신이, getDefaultLocale() 넘어 listActiveLocales()listAllLocales()을 할거야 정확히 모르는 당신이 미래에 SiteLocales의 목록을 활용하여 많은 일을 할거야 생각하지만, 경우, 아마도 첫 번째 옵션이 이상적 일 수 있습니다. 또는 두 가지 조합을 사용할 수도 있습니다.

Demeter의 법칙은 Demeter의 Guideline과 같습니다. 의식적으로하고, 왜하는지, 이해한다면 그 결과를 이해하는 한 모든 규칙을 어기는 것이 좋습니다. 예를 들어 법을 위반하면 유지 관리가 용이하고 판독 가능한 코드가되지만 응용 프로그램에서 높은 수준의 분리가 유지되는 경우 일반적으로 괜찮습니다. 그래서 어느 쪽의 선택이 법을 어기는지 걱정하지 않을 것입니다.

+0

안녕하세요, Jeff, 답변 해 주셔서 감사합니다.복제에 관해서는 참조 무결성 제약 조건 (InnoDB)을 사용하고 있으므로 languageCode 및 regionCode는 제약 조건이있는 외래 키입니다. 로캘 테이블에 가입하지 않고도 many-to-many 행 집합을 쉽게 가져올 수 있으므로이 스타일을 좋아합니다. 하지만 사이트에서 분리 된 로케일을 추가 할 수 있기를 원합니다. 희망이 의미가 있습니다. 어쨌든, 나는 네가하는 말을 본다. 두 가지 옵션을 모두 사용하도록 설득했다고 생각합니다. 내가 언급 한 두 가지 시나리오를 모두 활용할 것이기 때문입니다 (처음에는 프론트 엔드에서, 두 번째는 관리 백엔드에서). 귀하의 의견을 보내 주셔서 감사합니다. –

+0

다시 한 번 감사드립니다. Jeff. 내 케이크 먹고 먹을거야. :) –