2012-04-04 17 views
7

मैं अपने पहले Grails एप्लिकेशन पर काम कर रहा हूं, जिसमें पुराने स्ट्रैट्स वेब एप्लिकेशंस पर पोर्टिंग शामिल है। बहुत सारी मौजूदा कार्यक्षमताएं हैं, और जैसे-जैसे मैं चीजों को स्थानांतरित करता हूं, मुझे वास्तव में कठिन समय लगता है कि सेवा में क्या जाना चाहिए और मॉडल पर सीधे क्या शामिल किया जाना चाहिए?डोमेन क्लास में कौन सा तर्क जाना चाहिए और Grails में किसी सेवा में क्या जाना चाहिए?

रेल विकास पर ज्यादातर रूबी की पृष्ठभूमि से आ रहा है, मुझे लगता है कि यह डोमेन वर्ग में लगभग हर चीज डालने के लिए दृढ़ता से इच्छुक है। लेकिन, एक आवेदन के साथ जितना बड़ा मैं पोर्टिंग कर रहा हूं, कुछ वर्ग हजारों लाइनों पर लंबे समय तक खत्म हो जाएंगे।

आप कैसे तय करते हैं कि डोमेन में क्या होना चाहिए इसके विपरीत सेवा में क्या जाना चाहिए? क्या कोई स्थापित सर्वोत्तम प्रथाएं हैं? मैंने कुछ देखा है, लेकिन ज्यादातर लोग इस मुद्दे को स्वीकार करते हैं।

उत्तर

9

सामान्य तौर पर, मुख्य दिशानिर्देश मैं पालन है:

तर्क का एक हिस्सा, एक से अधिक डोमेन वर्ग से संबंधित एक सेवा में डालते हैं तो, अन्यथा यह डोमेन कक्षा में चला जाता है।

तर्क आप के साथ काम कर रहे हैं किस तरह, यह तुलना में काफी गहराई में जाने के लिए कठिन है, लेकिन यहाँ है कुछ अधिक सामान्य विचारों के बारे में अधिक जानकारी के बिना:

  1. चीजें हैं जो प्रस्तुति देखने के लिए संबंधित के लिए, वे टैग libs (या शायद सेवाओं) में जाते हैं
  2. उन चीजों के लिए जो यह देखने के लिए सौदा करते हैं कि क्या देखने के लिए भेजा जाता है और इसे भेजने के लिए क्या दृश्य है, जो नियंत्रकों (या शायद सेवाओं) में जाता है
  3. उन चीजों के लिए बाहरी संस्थाओं से बात करें (यानी फाइल सिस्टम, कतार, इत्यादि), वे जाते हैं सेवाओं में

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

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

+3

डोमेन पर होने वाली विधियों को स्पॉट करने का एक अच्छा तरीका यह है कि यदि आपके पास एक डोमेन क्लास को एकमात्र तर्क के रूप में पारित किया गया है तो वह विधि शायद डोमेन पर संबंधित है। मैं @ cdeszaq के उत्तर पर भी विस्तार करूंगा और यह भी कहूंगा कि यदि आप किसी डोमेन क्लास के एक से अधिक 'इंस्टेंस' से निपट रहे हैं, तो इसे एक सेवा में रखें। उदाहरण के लिए यदि आप एक विशिष्ट वर्ग के कई उदाहरणों को बदल रहे हैं तो मैं इसे एक सेवा में डाल दूंगा। आम तौर पर, अपने सर्वोत्तम निर्णय का उपयोग करें, अपनी टीम से उन तरीकों के बारे में बात करें जिनके बारे में आप अनिश्चित हैं कि वे कहां हैं। –

+0

उनमें से दोनों बहुत अच्छे अंक हैं। – cdeszaq

+1

बस इसमें जोड़ना है कि सेवा विधियां डिफ़ॉल्ट लेनदेन से हैं: http://grails.org/doc/latest/guide/services.html#transactionsRollbackAndTheession – Steve

-1

जावा ईई दृष्टिकोण से: डोमेन कक्षाओं में बिल्कुल कोई तर्क नहीं। अपने डोमेन वर्ग को यथासंभव आसान और छोटा रखें। आपका डोमेन मॉडल आपके आवेदन का मूल है और इसे प्राप्त करना आसान होना चाहिए।

  • निर्भरता इंजेक्शन के लिए Grails विकसित किया गया है। डोमेन क्लास में रहने वाले सभी तर्कों का परीक्षण करना मुश्किल है, और रिफैक्टर के लिए बहुत आसान है।
  • आप सेवाओं (डीआई) जैसे कार्यान्वयन का आदान-प्रदान नहीं कर सकते हैं।
  • आप आसानी से अपने डोमेन क्लास के कोड का परीक्षण नहीं कर सकते।
  • आप अपने सिस्टम को स्केल नहीं कर सकते हैं, क्योंकि आपके कार्यान्वयन सेवाओं की तरह पूल नहीं किए जा सकते हैं।

मेरी सिफारिश: सेवाओं में हर तर्क रखें।सेवाओं का परीक्षण करना आसान है, पुन: उपयोग करने में आसान, बनाए रखने में आसान, पुनः कॉन्फ़िगर करने में आसान है।

grails के लिए विशिष्ट: यदि आप अपनी डोमेन कक्षा बदलते हैं, तो इन-मेमोरी-डीबी मारे जायेंगे, इसलिए आप अपना टेस्ट डेटा खो देते हैं, जो आपको तेजी से प्रोटोटाइप से रोकता है।

+0

क्या आप अपने उत्तर को थोड़ा सा विस्तारित कर सकते हैं और समझा सकते हैं कि आप ' पाने में आसान 'और आप क्यों मानते हैं कि डोमेन क्लास में कोई तर्क नहीं होना चाहिए? –

+3

Grails वास्तव में जेईई मॉडल का बहुत सख्ती से पालन नहीं करता है। प्रमाणीकरण और डीबी मैपिंग डोमेन ऑब्जेक्ट्स में बंडल की जाती है, इसलिए आप पहले से ही एक मूल बीन से अधिक हो रहे हैं। मैं दृढ़ता से _against_ एनीमिक डोमेन कक्षाओं को वोट दूंगा, जैसा कि आप यहां सुझाव देते हैं, क्योंकि इसे बहुत कम लाभ के लिए अधिक कक्षाएं और जटिलता की आवश्यकता होती है। – cdeszaq

+0

शायद अद्यतन उत्तर अधिक स्पष्ट है। – Chris

1

मुझे व्यक्तिगत रूप से लगता है कि यह न केवल सेवा और डोमेन वर्ग के बीच एक निर्णय है बल्कि प्लगइन्स या इंजेक्शन कोड भी है।

Book.findAllByName() जैसे गतिशील खोजकर्ताओं के बारे में सोचें। यह बहुत अच्छा है कि Grails उन्हें डोमेन कक्षाओं में इंजेक्ट करता है। अन्यथा उन्हें प्रत्येक डोमेन कक्षा में कॉपी करना होगा या वे एक सेवा (dynamicFinderService.findAllByName('Book') -argh) के माध्यम से कॉल करने योग्य होंगे।

अपनी परियोजनाओं में

तो, मैं काफी कुछ चीजें हैं जो मैं एक प्लगइन करने के लिए कदम और डोमेन वर्गों में इंजेक्षन होगा ...

+1

बहुत अच्छा बिंदु। विशेष रूप से नए Grails "रूपांतरित" के लिए, प्लगइन्स एक जादुई ब्लैक बॉक्स का थोड़ा सा प्रतीत हो सकता है, लेकिन वे बहुत शक्तिशाली हैं और नाटकीय रूप से कोड को सरल बना सकते हैं। – cdeszaq

1

Grails Best Practices

पर एक नजर डालें मुझे लगता है कि यह एक अच्छा है लेख अच्छी प्रथाओं को समझाते हुए

संबंधित मुद्दे