प्रस्तावना:

मला या लेखातील कमांड आणि कमांड हँडलर वापरण्याच्या नियमिततेबद्दल तक्रार करायची आहे, परंतु ते काय आहेत हे स्पष्ट करण्यात माझा वेळ वाया घालवू इच्छित नाही, म्हणून मी तुमच्याशी संपर्क साधेल. आणखी एक ब्लॉग पोस्ट. हे पुरेसे खोल आहे, म्हणून ते थोडे अवघड असू शकते, परंतु मला त्याबद्दल खरोखर काय आवडते ते पुस्तक संबंधित पोस्टच्या संग्रहाचा भाग आहे, पायथॉनसह गु. चाचणी-आधारित विकास क्षमता, डोमेन-आधारित डिझाइन և इव्हेंट-आधारित सूक्ष्मसेवा. मी आत्तापर्यंत जे वाचले आहे ते मी लिहिणार असलेल्या पुस्तकासारखेच आहे, परंतु ते ज्या उत्पादनामध्ये तयार करत होते त्याच्या थोड्या खोलवर, त्यांनी सर्वात अस्पष्ट सराव समाविष्ट केला नाही. मला अजूनही याबद्दल खूप आनंद आहे, जरी मला त्याबद्दल आधीच माहिती आहे, म्हणून मी ते चालू करण्यासाठी येथे आहे. आपण ते विकत घेऊ शकता किंवा त्यांच्या वेबसाइटवर विनामूल्य वाचू शकता.

त्यामुळे आता मी कदाचित ते पुस्तक लिहिणार नाही. मी कदाचित आणखी काही ट्यूटोरियल किंवा असे काहीतरी बनवू शकेन जे अशा प्रकारे टायचे कमाई करू शकेल. परंतु त्यातील बरेचसे आधीच कव्हर केले गेले असल्याने, मी ते विषय वगळू शकतो – काही प्रयत्न वाचवण्यासाठी त्यांच्या पुस्तकात सामील व्हा.

टेम्पलेटचे फायदे आणि तोटे

काय, जा! मग मला कमांड हँडलरचे उदाहरण का आवडत नाही? थोडक्यात, याचे कारण असे आहे की हे एका फंक्शनचे अमूर्तत्व आहे जे खूप कमी लाभ देते. मला आधी फायद्यांची यादी करू द्या जेणेकरून मला अन्यायकारक वाटू नये.

  • हे अगदी अमूर्त आहे. मी तांत्रिकदृष्ट्या आधीच सांगितले आहे, पण मी पुन्हा सांगतो. अधिक अमूर्त असणे याचा अर्थ असा की तो आपल्याला use पुनरावृत्ती अनेक वेळा वापरण्याची परवानगी देतो.
  • हा एक बऱ्यापैकी सोपा, सुप्रसिद्ध नमुना आहे, ज्यामुळे प्रकल्पाला नवीन लोक मिळवणे तुलनेने सोपे होते.
  • आयोजित करणे सोपे. तुम्ही तुमच्या सर्व आज्ञा (ողները कदाचित विकसक) एकाच ठिकाणी ठेवू शकता և हे नवीन लोकांना दाखवते की त्यांचा वापर काय आहे. जर तुम्ही इन्स्टॉलर्सला समान किंवा तत्सम ठिकाणी ठेवले तर कोणते डेव्हलपर आधीच विकसित केले गेले आहेत आणि ते कसे वापरले जातात हे पाहणे सोपे होते.
  • कारण ते खूप मोठे आहे – स्पष्टपणे, हे आपल्याला एक चांगले उदाहरण ठेवण्यास मदत करते. इतर अनेक नमुन्यांकडे दुर्लक्ष करणे खूप सोपे आहे, ज्यामुळे दुसऱ्या दिशेने जाणे, स्पॅगेटी कोड तयार करणे.

पॅटर्नचे तोटे

तर या सर्व फायद्यांसह, मी याबद्दल काय करू शकतो?

मुख्य कारण हे आहे की ते अत्यंत इंजिनिअर केलेले आहे, माझ्या मते. वरील सर्व गोष्टी पूर्ण करण्यासाठी, आपल्याला फक्त नमुन्याचा एक भाग (विकासक) आवश्यक आहे. हे थोडे कमी प्रभावी आहे, परंतु मला वाटते की तडजोड प्रत्यक्षात अधिक स्पष्टता देते – डेटाबेस शोधणे सोपे करते.

मी एक चांगली कल्पना आहे यावर जाण्यापूर्वी, मी पुढे जाण्यापूर्वी मी तुम्हाला चाहता नसण्याचे आणखी एक कारण सांगेन. हे अतिशय गतिमान आहे. आपण त्यांच्या रांग व्यवस्थापकांसह कमांड डायनॅमिकली रेकॉर्ड करता. जर तुम्ही आज्ञा register व्यवस्थापकांची नोंदणी केली नाही तर तुमच्याकडे इतर सर्व बांधकाम साहित्य असू शकतात և तरीही ते अयशस्वी होऊ शकतात. आणि कारण हा एक डायनॅमिक रेकॉर्ड आहे, प्रकाराशी परिचित असलेला कंपाइलर देखील आपल्याला हे कळू शकत नाही की सर्व काही ठिकाणाबाहेर आहे. याचा अर्थ असा आहे की रांगेत संबंधित आदेश जोडणारा वेब राउटर लिहिणे शक्य आहे that त्या आदेशासाठी संबंधित कमांड मॅनेजर लिहा, परंतु ते अद्याप चालणार नाही. शक्यतो तुमच्याकडे रांगेसाठी काहीतरी लिहिलेले आहे जेव्हा तुम्हाला ऑर्डर प्रकार नोंदवला गेला नाही तेव्हा तुम्हाला चेतावणी देईल, परंतु ती सोडवण्याची वेळ आली आहे. व्यसन इंजेक्शन फ्रेमवर्कमध्ये मला हीच समस्या आहे.

त्याच वेळी, प्रेषकाला थेट कॉल करण्याऐवजी प्रशासकाकडे पाहून कमांड प्रॉम्प्ट तपासून स्टार्टअप दरम्यान हे एक अतिरिक्त पाऊल आहे. चुकीच्या -गतिशील भाषेत चुकून त्यांची नोंद करणे शक्य आहे, जेणेकरून काहीही कार्य करणार नाही.

त्याऐवजी मी काय सुचवू?

मग माझा पर्याय काय? बरं, बहुतांश भागांसाठी, ते आधीच DDD चा मुख्य सेवा स्तर म्हणून अस्तित्वात आहे. लेयर लेयर आपल्याला डोमेनमध्ये वापरण्याची परवानगी असलेल्या सर्व क्रिया प्रदान करते. कमांड և कमांड मॅनेजर तयार करण्याऐवजी जे (बहुतेकदा) फक्त सेवा स्तर फंक्शन्सकडे पुनर्निर्देशित करतात, त्या सर्व्हिस लेयरच्या सर्व फंक्शन्सला त्यांच्या क्रियांच्या वस्तूंमध्ये विभाजित करा. ही अधिकृत संज्ञा नाही. उर्वरित पोस्टसाठी, मी फक्त त्यांच्याकडे असेच बघेन.

या क्रियांच्या वस्तूंमध्ये एकाच ऑब्जेक्टमध्ये कमांड आणि कमांडर दोन्ही समाविष्ट असतात. अगदी कमीतकमी, आपण किमान प्रत्येक गोष्टीचे नाव देणे थांबवू शकता FooCommand आणि FooHandler. तुम्ही फक्त त्याला “फू” म्हणा. तुम्हाला खरोखरच हवे असल्यास, तुम्ही “कमांड” (जे इतर नमुन्यांसह गोंधळलेले असू शकते), “अॅक्शन” (जे अनावश्यक आहे) किंवा “सेवा उपलब्धता” (कदाचित सर्वोत्तम पर्याय जोडू शकता, जरी ते लोकांना मार्गदर्शन करते. ते “Foo” प्रत्ययासाठी सर्वोत्तम नावापासून दूर आहेत, परंतु मी त्यास विरोधात आहे.

कोणत्याही परिस्थितीत, क्रियांमध्ये कमांड हँडलर कन्स्ट्रक्टर द्वारे वापरत असलेल्या अवलंबनांचा समावेश असू शकतो և मध्ये एक कार्य (किंवा ते कार्य असल्यास IS कार्य आहे __call__(...)), जे पॅरामीटर्सऐवजी सर्व आवश्यक माहिती घेते, कमांडच्या ऑब्जेक्ट ऐवजी (जे, खरोखर, पॅरामीटर्सच्या सूचीचा फक्त एक गोषवारा आहे).

कमांड लाइनचे काय? त्यात कमांडच्या विस्ताराचे अतिरिक्त फायदे आहेत, बरोबर? नक्कीच, कमांड प्रॉम्प्ट रांग अगदी सोपी करते, परंतु प्रत्यक्षात कृती रांग वापरणे अद्याप शक्य आहे. आणि क्रियांसह आपल्याला काहीही नोंदणी करण्याची आवश्यकता नाही. आपण प्रभावीपणे फक्त रांगेत फंक्शन्स जोडता जे नंतर चालवता येतील. आपण इतर लोकांच्या मदतीसाठी अधिक भेदभाव केला पाहिजे. अ functools.partial त्याची काळजी घेऊ शकतो, किंवा इतर काही प्रकारचे फंक्शन जे नंतर अॅक्शन ऑपरेट करेल. आपण कृती प्रकारात आणखी एक पद्धत जोडू शकता जी आपल्यासाठी करते. उदाहरणार्थ, पायथन मध्ये:

class MyActionType:
    def __init__(self, dependency1, dependency2):
        self.dep1 = dependency1
        self.dep2 = dependency2

    def do_action(self, param1, param2):
        ...

    def prepare_action(self, param1, param2):
        def prepped_action():
            return self.do_action(param1, param2)
        return prepped_action

येथे कृती प्रकार a प्रदान करते prepare_action एक पद्धत जी फंक्शन परत करते जी वितर्क घेत नाही – मुख्य ऑपरेशन पद्धतीला कॉल करते. रिटर्न केलेले फंक्शन रांगेत जोडले जाऊ शकते, և रांग दिसते तेव्हाच त्याला कॉल करू शकते.

नकार:

हे सर्व असूनही, मला वाटते की आज्ञाधारक उदाहरणासाठी जागा आहे. मला वाटते की मुख्य फायदा मोठ्या, वितरित प्रणालीमध्ये आहे. तसेच, माझ्याकडे कोणताही ठोस अनुभव नाही, उदाहरणार्थ, म्हणून तुम्ही माझे मत मीठाच्या धान्यासह निश्चितपणे घेऊ शकता (जरी परिषदेत इतर स्मार्ट, अधिक अनुभवी लोकांनी सुचवलेले हे जवळजवळ समान उदाहरण आहे: उदास, मी करतो आता सापडत नाही). स्पॅगेटी कोड रोखण्यासाठी कमांड लाइन नक्कीच चांगली आहे, परंतु अॅक्शन पॅटर्नला योग्यरित्या चिकटवण्यासाठी फक्त थोडी अतिरिक्त शिस्त आवश्यक आहे.

इतर:

तर तुमच्याकडे ते आहे, कमांड उदाहरणासाठी माझी सोपी बदली. मला वाटले नव्हते की मी ऑर्डरचे उदाहरण स्पष्ट केले नाही तर मी खरोखर इतके लिहू. आता मला खरोखर आनंद झाला की मी त्याचे वर्णन करण्यास त्रास दिला नाही. या उदाहरणासह आपल्याला पाहिजे ते करा. मला फक्त माझ्या छातीतून हे सर्व बाहेर काढायचे होते.

स्पष्टीकरण अद्यतन.

मला काहीतरी स्पष्ट करायचे आहे. माझे मत कमांडर մասին इव्हेंट्स डेव्हलपर्स իրադարձ इव्हेंट्स և डेव्हलपर्ससारखे नाही. वरवरच्या पातळीवर, ते जवळजवळ सारखेच आहेत, परंतु त्यांच्यात एक मोठा फरक आहे, ज्यामुळे ते अधिक मौल्यवान बनतात – ते शब्दार्थ नाही. आपल्याकडे अनेक कार्यक्रम असू शकतात जे एकाच कार्यक्रमाला (किंवा अजिबात नाही) पूर्ण करतात. आणि आपण एकाच इव्हेंटसाठी एकाच हँडलरची नोंदणी देखील करू शकता. जर तुम्ही कमांडसह असे केले तर तुम्ही त्यांच्या समजुतीचे उल्लंघन करत आहात.

आज्ञा आहे “हे एक काम करा”. जेव्हा तुम्ही ती गोष्ट केली की ती गोष्ट करू शकता इतर घटनांना चालना देणारी घटना बनू शकते, परंतु जर कमांडमुळे थेट काही गोष्टी घडणे आवश्यक असेल, तर हे तपशील आहेत की कमांड एका व्यवस्थापकामध्ये डीकोड करते. आणि जर काही गोष्टी इतरांनंतर घडायच्या असतील, तर प्रथम एखादी घटना तयार करू शकते जी अनुयायांच्या कृतींनुसार होऊ शकते. आणि जर तुमची इव्हेंट सिस्टीम समांतर अनेक व्यवस्थापक चालवत असेल, तर तुम्ही एकाच वेळी अनेक फॉलो-अप ऑपरेशन्स करू शकता, हे सर्व फक्त मागील ऑपरेशनवर अवलंबून असते, जे सिंक्रोनाइझ करण्याचा थेट मार्ग कमांड हँडलरमध्ये आहे.

सारांश: इव्हेंट्समध्ये नेहमीच ग्राहक असणे आवश्यक नसते. व्यवसाय तर्कशास्त्र काही विकासकांना नेहमी तयार राहण्याची आवश्यकता असू शकते, परंतु हे इव्हेंट्सच्या कल्पनेपेक्षा विशिष्ट घटनांसाठी विशिष्ट आहे. उदाहरणार्थ, दुय्यम प्रणाली जेव्हा उपलब्ध असेल तेव्हा सबस्क्राइब करू शकते, satisfied ते समाधानी झाल्यानंतर सदस्यता रद्द करू शकते. आज्ञा अंमलात आणण्यासाठी काहीही सबस्क्राइब केले नसल्यास, ती खरोखरच आज्ञा आहे का?

याशिवाय, ती संपूर्ण नामकरण गोष्ट पुन्हा आहे. तुम्ही अर्ध्या “DoThisCommand” आणि दुसऱ्या अर्ध्या “DoThisHandler” च्या नावासाठी आज्ञा वापरता. माय अॅक्शन सिस्टमसह, आपल्याकडे एक प्रकार किंवा फंक्शन आहे ज्याला फक्त DoThis म्हणतात. इव्हेंटच्या बाबतीत, तुमच्याकडे “AysHagatsEpah” किंवा अगदी “SaPatahets” नावाचे इव्हेंट्स आहेत आणि इव्हेंट मॅनेजर जे करतात त्यावरून त्यांची नावे ठेवली जातात. कारण तेथे बरेच असू शकतात, आपण त्यांना “ThisHappenedHandler” म्हणू इच्छित नाही.

त्यांच्या पूर्ण क्षमतेची जाणीव करून, प्रत्येक ऑपरेशनल कॉल प्रभावीपणे कमांड, इव्हेंट्स आणि त्यांच्या व्यवस्थापकांद्वारे अंमलात आणला जाऊ शकतो. एक वेळ अशी आहे जेव्हा तुम्ही ते खूप दूर नेता, माझा असा विश्वास आहे की बहुतेक वेळा आज्ञेचे उदाहरण इव्हेंटइतके उपयोगी नसते.