क्या प्रबंधक कक्षाएं खराब वास्तुकला का संकेत हो सकती हैं?


49

हाल ही में मैंने यह सोचना शुरू किया है कि आपके डिज़ाइन में बहुत सारे प्रबंधक वर्ग होना एक बुरी बात है। मेरे लिए सम्मोहक तर्क बनाने के लिए विचार पर्याप्त परिपक्व नहीं हुआ, लेकिन यहां कुछ सामान्य बिंदु हैं:

  • मैंने पाया कि मेरे लिए "प्रबंधकों" पर बहुत भरोसा करने वाली प्रणालियों को समझना बहुत कठिन है। ऐसा इसलिए है, क्योंकि वास्तविक प्रोग्राम घटकों के अलावा, आपको यह भी समझना होगा कि प्रबंधक का उपयोग कैसे और क्यों किया जाता है।

  • प्रबंधकों, समय का एक बहुत, डिजाइन के साथ एक समस्या को कम करने के लिए इस्तेमाल किया जा रहा है, जैसे कि जब प्रोग्रामर को प्रोग्राम बनाने का कोई तरीका नहीं मिल सकता है बस काम टीएम और सब कुछ सही ढंग से संचालित करने के लिए प्रबंधक कक्षाओं पर भरोसा करना था।

बेशक, आम अच्छा हो सकता है। एक स्पष्ट उदाहरण एक EventManager, मेरे सभी समय के पसंदीदा निर्माणों में से एक है। : पी मेरी बात यह है कि प्रबंधकों को बहुत अधिक समय लगता है, और कार्यक्रम के आर्किटेक्चर के साथ समस्या के अलावा किसी अन्य अच्छे कारण के लिए नहीं।

क्या प्रबंधक कक्षाएं वास्तव में खराब वास्तुकला का संकेत हैं?


5
मुझे लगता है Of course, mangers can be good. An obvious example is an EventManagerकि यह सब वहीं समझाता है। अवधारणा का दुरुपयोग खराब वास्तुकला है, लेकिन वैध उपयोग के मामले हैं। वही सबसे अधिक कुछ के लिए सच है।

27
अधिक अकल्पनीय नामकरण का संकेत लगता है।
पीडीआर

9
EventManagerएक वर्ग के लिए एक भयानक नाम है। यह तीव्रता से घटनाओं के साथ कुछ करता है , लेकिन क्या ?
क्रिस्टोफर हम्मरस्ट्रॉम

5
समस्याओं में से एक यहाँ एक भाषा सीमा है steve-yegge.blogspot.com/2006/03/… प्रबंधक प्रबंधक अक्सर क्रियाओं को क्रियाशील करने के कारण होते हैं, मुफ्त कार्य वे हैं जो वास्तव में चाहते हैं
jk।

1
प्रबंधकों के पास अक्सर बहुत अधिक शक्ति (जिम्मेदारियां) होती हैं और उनसे निपटने के लिए दर्द हो सकता है - जैसे किसी भी कार्यालय के वातावरण में;) EventManager का मतलब कुछ भी नहीं है। EventDispatcher वर्णन करता है कि यह क्या करता है।
कोडार्ट

जवाबों:


31

कुछ कारणों से प्रबंधक कक्षाएं खराब वास्तुकला का संकेत हो सकती हैं:

  • अर्थहीन पहचानकर्ता

    नाम FooManagerकुछ भी नहीं कहता है कि वर्ग वास्तव में क्या करता है , सिवाय इसके कि इसमें किसी भी तरह से Fooउदाहरण शामिल हैं । कक्षा को अधिक सार्थक नाम देने से इसका वास्तविक उद्देश्य स्पष्ट हो जाता है, जिससे संभवतः रिफैक्टरिंग को बढ़ावा मिलेगा।

  • आंशिक जिम्मेदारियां

    एकल जिम्मेदारी सिद्धांत के अनुसार, प्रत्येक कोड इकाई को बिल्कुल एक ही उद्देश्य पूरा करना चाहिए। एक प्रबंधक के साथ, आप कृत्रिम रूप से उस जिम्मेदारी को विभाजित कर सकते हैं।

    ResourceManagerउस पर विचार करें , जो Resourceउदाहरणों के जीवनकाल और पहुंच को समन्वयित करता है । किसी एप्लिकेशन के पास एक एकल ResourceManagerहै जिसके माध्यम से वह Resourceइंस्टेंस प्राप्त करता है । इस मामले में कोई वास्तविक कारण नहीं है कि एक ResourceManagerउदाहरण के कार्य को Resourceकक्षा में स्थिर तरीकों से क्यों नहीं परोसा जा सकता है ।

  • असंरचित अमूर्तन

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

बेशक, प्रबंधकों का उपयोग केवल बुराई से अधिक, उन्हीं कारणों से किया जा सकता है। एक- EventManagerजो वास्तव में Dispatcherस्रोतों से एक घटना है और उन्हें रुचि के लक्ष्यों के लिए भेजती है। इस मामले में यह घटनाओं को प्राप्त करने और भेजने की जिम्मेदारी को अलग करने के लिए समझ में आता है, क्योंकि एक व्यक्ति Eventसिर्फ एक संदेश है, जिसमें सिद्ध या गंतव्य की कोई धारणा नहीं है।

हम एक लिखने Dispatcherकी Eventमूलतः एक ही कारण है कि हम एक लिखने के लिए उदाहरण हैं GarbageCollectorया एक Factory:

एक प्रबंधक जानता है कि उसके पेलोड को क्या जानना चाहिए।

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


3
मैंने निश्चित रूप से पहले FooManager कक्षाएं बनाई हैं। मैंने कारखाने और समीपताएँ भी बनाई हैं। लेकिन कभी-कभी ऐसा लगता है कि आपको वास्तव में क्या जरूरत है एक ग्लोरिफ़ाइकॉलिज़न <Foo> प्रकार और FooManager बिल को पूरी तरह से फिट करने के लिए लगता है। आप एक वर्ग को क्या कहेंगे जो सचमुच फू वस्तुओं के आंतरिक संग्रह का प्रबंधन करता है और फू उदाहरणों को पुनः प्राप्त करने के लिए बहुत साफ और संक्षिप्त इंटरफ़ेस प्रदान करता है? मुझे लगता है कि एक "प्रबंधक" एक ऐसा वर्ग है जो एक कारखाने को बंद कर देता है (यानी सभी फू उदाहरण आंतरिक रूप से और साथ ही उन वस्तुओं का एक संग्रह है)। क्या आप इसे कुछ और कहेंगे? या अलग डिजाइन करते हैं?
DXM

आह हां, EventDispatcherमैं कुछ समय के लिए एक अच्छा नाम खोजने की कोशिश कर रहा हूं। : पी
Paul

@DXM फ़ॉउस के एक संग्रह के लिए, यह सचमुच "फूएलिस्ट" हो सकता है। वैश्विक स्थान के लिए, जहां फ़ॉइस पंजीकृत हैं, इसलिए बाद में उन्हें पुनः प्राप्त किया जा सकता है, "फूग्रिज़िस्ट्री", दिमाग में आता है। संग्रह संग्रह और कारखाना कुछ ऐसा नहीं है जिसे मैं व्यक्तिगत रूप से करना पसंद करता हूं, लेकिन मेरा मानना ​​है कि इसे आमतौर पर "फूप्रोसेपोरेटरी" कहा जाएगा।
आर। श्मिटज़

28

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

मेरी बात को स्पष्ट करने के लिए एक सरल उदाहरण: फ़ैक्टरी पैटर्न का नाम रखने से पहले , लोग इसका उपयोग कर रहे थे, लेकिन वे यह नहीं जानते थे कि इसे कैसे कॉल किया जाए। इसलिए, किसी व्यक्ति को अपनी Fooकक्षा के लिए एक कारखाना लिखना पड़ा हो सकता है FooAllocationManager। यह बुरा डिजाइन नहीं है, यह सिर्फ कल्पना की कमी है।

और फिर किसी को एक वर्ग को लागू करने की आवश्यकता होती है जो बहुत सारे कारखानों को बनाए रखता है और उन्हें विभिन्न वस्तुओं को सौंपता है जो उनके लिए पूछते हैं; और वह अपनी कक्षा को बुलाता है FactoryManagerक्योंकि यह शब्द Industryउसके पास कभी नहीं आया, या उसने सोचा कि यह बेकार होगा क्योंकि वह प्रोग्रामिंग में ऐसा कुछ भी पहले कभी नहीं सुना था। फिर, कल्पना की कमी का मामला।


10

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

"सूचना विशेषज्ञ" के सिद्धांत का पालन करते हुए , एक तार्किक ऑपरेशन को उस डेटा के करीब रहना चाहिए जो इसे संभव हो। इसका मतलब होगा कि डोमेन लॉजिक को वापस डोमेन मॉडल में ले जाना, ताकि यह ये लॉजिकल ऑपरेशंस हों जो बाहर से डोमेन मॉडल की स्थिति को बदलने के बजाय 'प्रबंधकों' के डोमेन डोमेन की स्थिति पर एक प्रभाव डालते हैं।


8

संक्षिप्त उत्तर: यह निर्भर करता है

"प्रबंधक वर्गों" के कई अलग-अलग रूप हैं, उनमें से कुछ अच्छे हैं, कुछ अन्य बुरे हैं, और उनमें से अधिकांश के लिए यह संदर्भ पर बहुत निर्भर करता है कि क्या प्रबंधक वर्ग शुरू करना सही बात है। उन्हें सही पाने के लिए एक अच्छा प्रारंभिक बिंदु एकल जिम्मेदारी सिद्धांत का पालन करना है - यदि आप ठीक से जानते हैं कि आपके प्रत्येक प्रबंधक वर्ग के लिए क्या जिम्मेदार है (और क्या नहीं), तो आपको उन्हें समझने में बहुत कम समस्याएं होंगी।

या सीधे आपके प्रश्न का उत्तर देने के लिए: यह एक खराब वास्तुकला का संकेत देने वाली प्रबंधक कक्षाओं की संख्या नहीं है, लेकिन उनमें से कई अस्पष्ट जिम्मेदारियों के साथ, या बहुत अधिक चिंताओं से निपट रहे हैं।


क्षमा करें, मुझे यह उत्तर बहुत उपयोगी नहीं लगा। आप एक अच्छी बात करते हैं कि जिम्मेदारियां स्पष्ट नहीं होती हैं और बहुत सारी चिंताएं खराब होती हैं। लेकिन यह किसी भी वर्ग पर लागू होता है , न कि केवल "प्रबंधक" वर्ग पर। अन्य उत्तर इस बात पर अधिक विशिष्ट लगते हैं कि प्रबंधक वर्ग सहायक या हानिकारक कैसे हो सकता है।
user949300

3

हालांकि यह कहना आसान हो सकता है कि वे स्वाभाविक रूप से एक खराब डिज़ाइन के संकेत हैं, वे सार्वभौमिक रूप से एक ही कार्य और जिम्मेदारी को शामिल करके पूरे प्रोजेक्ट में कोड की जटिलता और अन्य बॉयलरप्लेट कोड को कम कर सकते हैं।

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

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


2

क्या प्रबंधक कक्षाएं खराब वास्तुकला का संकेत हो सकती हैं?

आपने अपने प्रश्न का उत्तर दिया: उन्हें खराब डिज़ाइन का संकेत नहीं होना चाहिए।

EventManager के साथ आपके प्रश्न में उदाहरण के अलावा, एक और उदाहरण है: MVC डिज़ाइन पैटर्न में, प्रस्तुतकर्ता को मॉडल / दृश्य कक्षाओं के लिए प्रबंधक के रूप में देखा जा सकता है।

हालांकि, यदि आप एक अवधारणा का दुरुपयोग करते हैं, तो यह एक खराब डिजाइन और संभवतः वास्तुकला का संकेत है।


प्रश्न निकाय में - "आपके डिज़ाइन में बहुत सारी प्रबंधक कक्षाएं होना एक बुरी बात है"। मेरा मानना ​​है कि यह वही है जो ओपी वास्तव में जानना चाहता है।
ऊद

2

जब कक्षा में नाम में "प्रबंधक" होता है, तो देव वर्ग की समस्या से सावधान रहें (बहुत सारी जिम्मेदारियों के साथ)। यदि यह वर्णन करना मुश्किल है कि एक वर्ग अपने नाम के लिए क्या जिम्मेदार है, तो यह एक डिजाइन चेतावनी संकेत है।

बुरी प्रबंधक कक्षाएं एक तरफ, सबसे खराब नाम जो मैंने कभी देखा है वह "DataContainerAdapter" था

"डेटा" को नामों में प्रतिबंधित प्रतिबंधों में से एक होना चाहिए- यह सभी डेटा है, "डेटा" आपको अधिकांश डोमेन में बहुत अधिक नहीं बताता है।


2

प्रबंधक कक्षाएं - जैसे "-er" के साथ समाप्त होने वाली लगभग किसी भी कक्षा - बुराई हैं और ओओपी के साथ कोई लेना-देना नहीं है। तो मेरे लिए यह बुरी वास्तु का संकेत है।

क्यों? "-Er" नाम का अर्थ है कि एक कोड डिजाइनर ने कुछ कार्रवाई की और इसे कक्षा में बदल दिया। परिणामस्वरूप हमारे पास एक कृत्रिम इकाई है जो किसी भी ठोस अवधारणा को प्रतिबिंबित नहीं करती है, लेकिन कुछ कार्रवाई करती है। यह बहुत प्रक्रियात्मक लगता है।

इसके अलावा, आमतौर पर ऐसी कक्षाएं कुछ डेटा लेती हैं और उस पर काम करती हैं। यह निष्क्रिय डेटा और सक्रिय प्रक्रियाओं का एक दर्शन है और इसने प्रक्रियात्मक प्रोग्रामिंग में अपना स्थान पाया। यदि आपको लगता है कि, प्रबंधक वर्गों में कुछ भी बुरा नहीं है, लेकिन यह तब OOP नहीं है।

वस्तु-चिंतन का तात्पर्य है कि वस्तुएं स्वयं के लिए काम करती हैं। अपने डोमेन की खोज करें , सिमेंटिक नेट का निर्माण करें, अपनी वस्तुओं को जीवित जीव, स्मार्ट और जिम्मेदार इंसान होने दें।

ऐसी वस्तुओं को नियंत्रित करने की आवश्यकता नहीं है। उन्हें पता है कि क्या करना है और कैसे करना है। इसलिए प्रबंधक वर्ग दो बार ओओपी सिद्धांतों को तोड़ते हैं। "-Er" वर्ग होने के अलावा, यह अन्य वस्तुओं को नियंत्रित करता है। लेकिन यह प्रबंधक पर निर्भर करता है। यह वह नियंत्रित करता है - वह एक बुरा प्रबंधक है। यदि वह समन्वय करता है - वह एक अच्छा प्रबंधक है। इसीलिए MVC में "C" अक्षर को "समन्वयक" के रूप में लिखा जाना चाहिए।


आप एक दिलचस्प बिंदु बनाते हैं लेकिन मुझे अभी भी आश्चर्य है कि आप "इकाई प्रबंधक" को कैसे वर्गीकृत करेंगे? मेरी व्यक्तिगत पृष्ठभूमि से, एक <निकाय> प्रबंधक एक विशेष <निकाय> पर CRUD संचालन के लिए है। क्या यह डोमेन मॉडल को एनीमिक बनाता है? मैं ऐसा नहीं सोचता, बस नहीं "सक्रिय रिकॉर्ड"। इसके अलावा हम एक "इकाई प्रबंधक" इकाई के समग्र यौगिकों CRUD समन्वय तर्क में नहीं डाल सकते हैं? मैं उस के लिए एक बेहतर जगह नहीं देख रहा हूँ। तो इसे किसी तरह से CRUD
पहलू के

सभी मैं ORM के concep के बारे में कह सकता है medium.com/@wrong.about/you-dont-need-an-orm-7ef83bd1b37d
Zapadlo

मैं ओआरएम का जिक्र करना जरूरी नहीं था, हालांकि ... मैं ओओ के सिद्धांतों का उतना ही सम्मान करता हूं, लेकिन मुझे ऐसा लगता है कि वे बहुत ज्यादा सिद्धांतवादी हैं और हमेशा पूरी तरह से व्यवहार में नहीं आ सकते हैं ... उदाहरण के लिए, यदि हमें decoupling, reusability, DRY, उत्पादकता की आवश्यकता है, उदाहरण के लिए: डोमेन लॉजिक / नियम जो सामान्य सेवाओं में विभिन्न संस्थाओं पर लागू होते हैं, इसलिए डोमेन मॉडल को कम व्यवहारिक बनाते हैं ... यह एक रिपॉजिटरी / मैपर पैटर्न का सटीक प्रभाव है (जो कि आप एमएम करते हैं) लागू करने के लिए देखें) वीएस एक सक्रिय रिकॉर्ड पैटर्न जो मुझे लगता है कि आप पर एहसान करेंगे ...
क्लेम

1

इस प्रश्न का सही उत्तर है:

  1. निर्भर करता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.