दिलचस्प पोस्ट
अनुसूचित एक्झूस्टर सेवा का उपयोग करते हुए प्रत्येक दिन कुछ कार्य को कैसे चलाया जा सकता है? बाहरी एसडी कार्ड स्थान खोजें जो @NotNull जावा एनोटेशन मैं उपयोग करना चाहिए? .txt फ़ाइल को Hadoop के अनुक्रम फ़ाइल स्वरूप में कनवर्ट कैसे करें आईओएस ट्यूटोरियल में एक्सएमएल पार्सिंग 'नया' कारण मेमोरी लीक का उपयोग क्यों करता है? दशमलव अंकों के साथ संख्यात्मक मान दर्ज करने का सबसे अच्छा तरीका क्या है? रिवर्स इंजीनियरिंग से निष्पादन योग्य रक्षा? jqgrid लंबा पाठ लपेटन कैसे दो अक्षर के बीच एक स्ट्रिंग पाने के लिए? कैसे msbuild कार्य के लिए एक कार्य propery के रूप में PreProcessor परिभाषाओं को सेट करने के लिए Asp.net mvc में JsonResult के माध्यम से एक ExpandoObject लौटाए कैसे? समयबाह्य jQuery के प्रभाव जावास्क्रिप्ट टू फिक्स्ड न राउंडिंग जावास्क्रिप्ट स्ट्रिंग अपरिवर्तनीय हैं? क्या मुझे JavaScript में "स्ट्रिंग बिल्डर" की आवश्यकता है?

रेल में ओओ डिज़ाइन: सामान डालने के लिए कहां

मैं वास्तव में रेल का आनंद ले रहा हूं (हालांकि मैं आम तौर पर अस्वस्थ हूं), और मैं रुबी बहुत ओ ओ का आनंद लेता हूं। फिर भी, विशाल ActiveRecord subclasses और विशाल नियंत्रक बनाने की प्रवृत्ति काफी स्वाभाविक है (भले ही आप प्रति संसाधन नियंत्रक का उपयोग करते हैं) यदि आप गहरे वस्तु वाले विश्व बनाने के लिए थे, तो आप कक्षाओं (और मॉड्यूल, मुझे क्या मानते हैं) कहेंगे? मैं विचारों के बारे में पूछ रहा हूं (स्वयं सहायताकर्ताओं में?), नियंत्रक और मॉडल

लिब ठीक है, और मुझे कुछ वातावरण मिलते हैं ताकि इसे देव वातावरण में पुनः लोड किया जा सके , लेकिन मैं यह जानना चाहता हूं कि क्या यह सब करने के लिए एक बेहतर तरीका है। मैं वाकई बहुत बड़ी बढ़ती कक्षाओं के बारे में चिंतित हूं। इसके अलावा, इंजिन के बारे में और वे कैसे फिट होते हैं?

वेब के समाधान से एकत्रित समाधान "रेल में ओओ डिज़ाइन: सामान डालने के लिए कहां"

चूंकि रेल MVC के संदर्भ में ढांचा प्रदान करता है, इसलिए यह आपके लिए उपलब्ध कराए गए मॉडल, दृश्य और नियंत्रक कंटेनरों का उपयोग करना समाप्त करना स्वाभाविक है। शुरुआती (और यहां तक ​​कि कुछ मध्यवर्ती प्रोग्रामर) के लिए विशिष्ट मुहावरे, एप्लिकेशन में सभी तर्क को मॉडल (डेटाबेस वर्ग), नियंत्रक या दृश्य में क्रमा करना है।

कुछ बिंदु पर, कोई व्यक्ति "वसा-मॉडल, पतली-नियंत्रक" प्रतिमान को इंगित करता है, और मध्यवर्ती डेवलपर्स जल्दबाजी से अपने नियंत्रकों से सबकुछ उत्पादित करते हैं और इसे मॉडल में डालते हैं, जो कि एप्लिकेशन लॉजिक के लिए एक नया कचरा हो सकता है।

पतली नियंत्रक, वास्तव में, एक अच्छा विचार है, लेकिन परिणाम – मॉडल में सब कुछ डाल रहा है, वास्तव में सबसे अच्छी योजना नहीं है

रूबी में, आपके पास चीजों को अधिक मॉड्यूलर बनाने के लिए अच्छे विकल्प हैं एक काफी लोकप्रिय जवाब सिर्फ मॉड्यूल (आमतौर पर lib में रखा गया) का उपयोग होता है जो तरीकों के समूह को पकड़ता है, और फिर मॉड्यूल को उचित कक्षाओं में शामिल करें। यह उन मामलों में मदद करता है जहां आपके पास कई श्रेणियों में पुन: उपयोग की जाने वाली कार्यक्षमता की श्रेणियां हैं, लेकिन जहां कक्षाओं के साथ कार्यक्षमता अभी भी संलग्न है

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

यह समाधान कुछ मामलों में अच्छी तरह से काम कर सकता है – अन्य मामलों में, आप अपने कोड में कक्षाओं का उपयोग करने के बारे में सोचना चाहते हैं जो मॉडल, दृश्य या नियंत्रक नहीं हैं

इसके बारे में सोचने का एक अच्छा तरीका "एकल जिम्मेदारी सिद्धांत" है, जो कहता है कि एक वर्ग को एक (या छोटी संख्या) चीजों के लिए जिम्मेदार होना चाहिए। आपके मॉडलों को आपके आवेदन से डाटाबेस को जारी रखने के लिए जिम्मेदार हैं। आपका नियंत्रक एक अनुरोध प्राप्त करने और एक व्यवहार्य प्रतिक्रिया देने के लिए जिम्मेदार हैं।

यदि आपके पास ऐसी अवधारणाएं हैं जो उन बक्से (दृढ़ता, अनुरोध / प्रतिक्रिया प्रबंधन) में बड़े करीने से फिट नहीं हैं, तो आप शायद इस बारे में सोचना चाहते हैं कि आप इस प्रश्न के विचार को कैसे मॉडल करेंगे । आप एप / वर्गों में या कहीं और गैर-मॉडल कक्षाओं को स्टोर कर सकते हैं, और उस निर्देशिका को अपने लोड पथ में जोड़ कर कर सकते हैं:

 config.load_paths << File.join(Rails.root, "app", "classes") 

यदि आप यात्री या जेआरयूबी का उपयोग कर रहे हैं, तो आप शायद अपने रास्ते को उत्सुक लोड पथ में जोड़ना चाहते हैं:

 config.eager_load_paths << File.join(Rails.root, "app", "classes") 

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

अद्यतन: यह उत्तर रेल 2.x और उच्चतर पर लागू होता है।

अपडेट : रेलवे 4 में नए डिफ़ॉल्ट के रूप में चिंता का उपयोग किया गया है

यह वास्तव में मॉड्यूल की प्रकृति पर निर्भर करता है। मैं आम तौर पर ऐप के भीतर एक / चिंताओं फ़ोल्डर में नियंत्रक / मॉडल एक्सटेंशन रखता हूं

 # concerns/authentication.rb module Authentication ... end # controllers/application_controller.rb class ApplicationController include Authentication end # concerns/configurable.rb module Configurable ... end class Model include Indexable end # controllers/foo_controller.rb class FooController < ApplicationController include Indexable end # controllers/bar_controller.rb class BarController < ApplicationController include Indexable end 

सामान्य प्रयोजन पुस्तकालयों के लिए / lib मेरी पसंद है I मेरे पास हमेशा प्रोजेक्ट नेमस्पेस लिब में है जहां मैंने सभी एप्लिकेशन-विशिष्ट लाइब्रेरीज़ डाल दिए।

 /lib/myapp.rb module MyApp VERSION = ... end /lib/myapp/CacheKey.rb /lib/myapp/somecustomlib.rb 

रूबी / रेल मुख्य एक्सटेंशन आमतौर पर कॉन्फ़िग इन्टरलाइज़र्स में होते हैं ताकि रेलवे बूस्टर पर एक बार पुस्तकालयों को लोड किया जा सके।

 /config/initializer/config.rb /config/initializer/core_ext/string.rb /config/initializer/core_ext/array.rb 

पुन: प्रयोज्य कोड के टुकड़ों के लिए, मैं अक्सर (माइक्रो) प्लगिन बना देता हूं ताकि मैं उन्हें अन्य परियोजनाओं में पुन: उपयोग कर सकूं।

हेल्पर फाइलें आमतौर पर सहायक विधियों और कभी-कभी कक्षाएं रखती हैं जब ऑब्जेक्ट का उपयोग हेल्पर्स (उदाहरण के लिए फ़ॉर्म बिल्डर्स) द्वारा किया जाता है।

यह वास्तव में सामान्य अवलोकन है यदि आप अधिक अनुकूलित सुझाव प्राप्त करना चाहते हैं तो कृपया विशिष्ट उदाहरणों के बारे में अधिक विवरण प्रदान करें 🙂

… विशाल ActiveRecord subclasses बनाने की प्रवृत्ति और विशाल नियंत्रक काफी स्वाभाविक है …

"विशाल" एक चिंताजनक शब्द है … 😉

आपके नियंत्रक कैसे बड़े होते हैं? यह आपको कुछ देखना चाहिए: आदर्श, नियंत्रक पतले होना चाहिए। पतली हवा के बाहर नियम-के-अंगूठे को उठाते हुए, मैं सुझाव देता हूं कि यदि आप नियमित रूप से प्रत्येक नियंत्रक विधि (कार्रवाई) के अनुसार 5 या 6 लाइन कोड से अधिक होते हैं, तो आपके नियंत्रक शायद बहुत मोटी होते हैं क्या दोहराव है कि सहायक फ़ंक्शन या फ़िल्टर में जा सकता है? वहाँ व्यापार तर्क है कि मॉडल में धकेल दिया जा सकता है?

आपके मॉडल को विशाल कैसे हो सकता है? क्या आपको प्रत्येक कक्षा में जिम्मेदारियों की संख्या कम करने के तरीकों पर विचार करना चाहिए? क्या कोई सामान्य व्यवहार आप मिक्सिंस में निकाल सकते हैं? या कार्यक्षमता के क्षेत्रों में आप सहायक वर्गों को नियुक्त कर सकते हैं?

संपादित करें: थोड़ा विस्तार करने की कोशिश कर रहा है, उम्मीद है कि कुछ भी बुरी तरह से विकृत न करें …

सहायक: app/helpers में रहते हैं और ज्यादातर विचार सरल बनाने के लिए उपयोग किए जाते हैं। वे या तो नियंत्रक-विशिष्ट (उस नियंत्रक के सभी दृश्यों के लिए भी उपलब्ध हैं) या आम तौर पर उपलब्ध हैं (application_helper.rb में module ApplicationHelper )।

फ़िल्टर: कहें कि आपके पास कई कार्रवाइयों में कोड की समान पंक्ति है (अक्सर, params[:id] या समान का उपयोग करके किसी ऑब्जेक्ट की पुनर्प्राप्ति)। यह दोहराव पहले एक अलग विधि के लिए समझा जा सकता है और फिर पूरी तरह से क्लास परिभाषा में एक फिल्टर घोषित करके कार्यों से बाहर हो सकता है, जैसे कि before_filter :get_object ActionController रेल मार्गदर्शिका में अनुभाग 6 देखें, घोषणात्मक प्रोग्रामिंग को अपने मित्र बनें।

रिफैक्टरिंग मॉडल एक धार्मिक चीज़ का थोड़ा और अधिक है चेलों के चेले बॉब बताएंगे कि, उदाहरण के लिए, आप ठोस के पांच कमांडों का पालन करते हैं। जोएल एंड जेफ एक अधिक, एर, "व्यावहारिक" दृष्टिकोण की सिफारिश कर सकते हैं , हालांकि वे बाद में थोड़ा अधिक सुलझ गए थे। एक क्लास के भीतर एक या अधिक तरीकों को ढूँढना जो अपने विशेषताओं के स्पष्ट-परिभाषित उपसंकल्प पर कार्य करते हैं, उन वर्गों की पहचान करने का प्रयास करने का एक तरीका है जो आपके सक्रियरेकॉर्ड-व्युत्पन्न मॉडल से पुन:

रेल मॉडलों को ActiveRecord :: Base के उप-परिमाण नहीं होना चाहिए, जिस तरह से। या इसे किसी अन्य तरीके से रखने के लिए, एक मॉडल को तालिका का एक एनालॉग नहीं होना चाहिए, या यहां तक ​​कि कुछ भी संग्रहीत करने से संबंधित होना चाहिए। इससे भी बेहतर, जब तक आप अपनी फ़ाइल को app/models में रेल के सम्मेलनों के अनुसार कहते हैं (रेल के लिए क्या होगा पता करने के लिए क्लास के नाम पर #inderscore कॉल करें), रेल बिना किसी require बिना इसे मिल जाएगा।

यहाँ "पतली नियंत्रक" दर्शन से उत्पन्न होने वाले वसा वाले मॉडल को पुनर्संरचना के बारे में एक उत्कृष्ट ब्लॉग पोस्ट है:

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

मूल संदेश "फट मॉडल से एक्स्ट्रेक्ट मिक्सिंस" नहीं है, इसके बजाय सेवा कक्षाओं का उपयोग करें, लेखक ऐसा करने के लिए 7 पैटर्न प्रदान करता है