2010-01-18 5 views
5

मैं ज़ेन फ्रेमवर्क घटकों के आधार पर बड़े पैमाने पर एक सीएमएस विकसित कर रहा हूं। इस सीएमएस के लिए डेटाबेस तालिकाओं में से कुछ के रूप में पालन कर रहे हैं:मॉडल के Granularization?

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 वस्तुओं सह से (दूसरे शब्दों एक डीबी तालिका प्रतिनिधित्व में) निम्न विधियों 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 का उल्लंघन करेगा?

संपादित (22 जनवरी)
हालांकि मैं Jeff's जवाब, मैं अभी भी नए/अन्य दृष्टिकोण के लिए खुला पसंद है।

उत्तर

3

सबसे पहले डेटाबेस डेटाबेस के संबंध में: आप शायद डेटाबेस को सामान्यीकृत कर सकते हैं। लोकेल और साइट_लोकेल टेबल के बीच दोहराव है। बेशक, मुझे यहां बड़ी तस्वीर नहीं दिखाई दे रही है, इसलिए आपने इसे करने के तरीके के पीछे कुछ भी हो सकता है।

स्पष्ट रूप से, या तो विकल्प ठीक है। मैं उस डिज़ाइन का चयन करूंगा जो आपके कोड को अधिक पठनीय और रखरखाव योग्य बनाता है। उदाहरण के लिए, यदि आपने पहला विकल्प चुना है, तो क्या आप इस जगह पर इस तरह के लूप के साथ खत्म हो जाएंगे?

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

हाय जेफ, आपकी प्रतिक्रिया के लिए धन्यवाद।डुप्लिकेशंस के बारे में, मैं रेफरेंशियल अखंडता बाधाओं (इनो डीबी) का उपयोग कर रहा हूं, इसलिए भाषा कोड और क्षेत्रकोड बाधाओं के साथ विदेशी कुंजी हैं। मुझे इस शैली को पसंद है क्योंकि यह लोकेल टेबल में शामिल होने के बिना कई से कई पंक्तियों को लाने में आसान बनाता है। लेकिन मैं साइटों से decoupled स्थानीय जोड़ने में सक्षम होना चाहता हूँ। उम्मीद है कि यह समझ में आता है। वैसे भी, मैं देख रहा हूँ कि आप क्या कह रहे हैं। मुझे लगता है कि आपने मुझे दोनों विकल्पों का उपयोग करने के लिए आश्वस्त किया है, क्योंकि मैं आपके द्वारा वर्णित परिदृश्य दोनों का उपयोग कर रहा हूं (पहले फ्रंटेंड में, व्यवस्थापक बैकएंड में दूसरा)। आपके सहयोग के लिए धन्यवाद। –

+0

धन्यवाद फिर जेफ। मैं अपना केक रखना चाहता हूं और इसे भी खाऊंगा। :) –