क्या कार्यान्वयन कक्षाओं में डिज़ाइन पैटर्न नाम का उपयोग करना कभी अच्छा है? [बन्द है]


28

हाल ही में मैं बहुत से एक मामूली बड़े अजगर codebase में आए MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapterआदि वर्गों।

जबकि एक हाथ पर उन नामों मुझे बताया अनुसंधान और इसी पैटर्न को जानने के लिए, वे क्या वर्ग के बहुत वर्णनात्मक नहीं थे करता है

इसके अलावा, वे में शब्दों के लिए मना सूची में आते हैं लगते प्रोग्रामिंग: variable, process_available_information, data, amount, compute: दायरा बहुत अधिक व्यापक नाम, कि हम में समारोह के बारे में कुछ भी नहीं बताया जब उनके ही द्वारा किया

तो होना चाहिए CommunicationManagerया बल्कि होना चाहिए PortListener? या शायद मैं समस्या को बिल्कुल नहीं समझता ...?


यदि आप इस बात से परिचित हैं कि पैटर्न क्या करता है, तो पैटर्न नाम एक अच्छा वर्णन है, हालांकि सिर्फ पैटर्न नाम एक बुरा विचार है, यह एक MyClassFactory, एक FooAdapter, आदि के लिए बेहतर है
शाफ़्ट सनकी

यह इंगित करने के लिए प्रश्न संपादित किए गए कि कक्षाओं को केवल "AbstractFactory" नहीं कहा गया था, लेकिन कुछ वर्णनात्मक शब्द भी थे।
वोरैक

1
... क्या उन्होंने गंभीरता से इसे एक के Fctoryबजाय कहा Factory, या यह सिर्फ एक टाइपो है?
इज़काता

@ इज़्काता, लोल, मेरा बुरा। हालाँकि, वहाँ एडाप्टर और एडाप्टर थे!
वोरैक

जवाबों:


47
  • AbstractFactoryवास्तव में एक नाम के लिए एक गरीब विकल्प है। इस कारखाने द्वारा क्या बनाया गया है, यह जानने का कोई तरीका नहीं है , और जब आप एक ऐसी इकाई की Animalतलाश करेंगे, जो एस बनाती है, तो आपको कभी भी नाम से संबंधित कारखाना नहीं मिलेगा।

  • AnimalAbstractFactoryन ही कोई बुद्धिमान विकल्प है, क्योंकि अधिकांश भाषाओं में, यह हस्ताक्षर में कीवर्ड के साथ बेमानी होगा abstract

    यह कहा जा रहा है, कई अच्छे कारण हैं, टिप्पणियों द्वारा हाइलाइट किए गए, वास्तव में Abstractनाम में शामिल करने के लिए: न केवल ऐसे कई संदर्भ हैं जहां आपके पास पूर्ण हस्ताक्षर नहीं है, लेकिन सिर्फ नाम है, लेकिन यह भी, AnimalFactoryएक इंटरफ़ेस के लिए रखते हुए एक बुद्धिमान विकल्प हो सकता है (जब तक, दुर्भाग्य से, भाषा / फ्रेमवर्क का कन्वेंशन इंटरफेस के साथ उपसर्ग करना है I)।

  • AnimalCreationUtilityएक बुरा विकल्प भी होगा: यदि यह एक कारखाना है , तो उन लोगों के लिए चीजों को आसान बना देगा जो कोड पढ़ेंगे, और इसे एक कारखाना कहेंगे

  • abstract AnimalFactoryठीक है। यह अतिरेक नहीं है, और कहा कि यह स्पष्ट है है एक सार कारखाने जो प्रतिनिधियों अपने बच्चों को जानवरों का निर्माण।

तो हाँ, डिज़ाइन पैटर्न के नाम सहित एक अच्छा विचार है, लेकिन यह केवल नाम का एक हिस्सा होना चाहिए, और हस्ताक्षर के अन्य भागों के साथ अतिरेक नहीं होना चाहिए।


2
यह एक प्रमुख स्थान पर एक टिप्पणी लिखने से बेहतर क्यों है "इस मॉड्यूल में, हम एमवीसी को लागू करते हैं। कारण: ... मॉडल: ... दृश्य: ... नियंत्रक: ... संरचना नक्शा: ... एपीआई:। .. ”।
वोरैक

37
@ वोरैक: एक स्पष्ट नाम होना हमेशा टिप्पणियों पर भरोसा करने से बेहतर है।
आर्सेनी मूरज़ेंको

2
@ जल्दी या बाद में कोई व्यक्ति उस प्रमुख टिप्पणी को अपडेट किए बिना एक नया वर्ग जोड़ देगा (या इसके अस्तित्व के बारे में जानकर भी)। हालांकि पूरे ऐप में लगातार उपयोग किए जाने वाले नामकरण सम्मेलन की अनदेखी करना बहुत कठिन है।
कोनराड मोरावस्की

2
जब आप अपने प्रोजेक्ट समाधान के माध्यम से ब्राउज़ कर रहे हैं, तो क्या आप यह खोजने के लिए प्रत्येक क्लास फ़ाइल खोलेंगे? नहीं, इसलिए यह हमेशा वर्णनात्मक नाम कक्षाओं / फ़ाइलों के लिए एक बेहतर विचार है।
मैट्रिक्स

2
मैं दूसरी बात से असहमत होना चाहता हूं: मुझे लगता है कि AnimalAbstractFactory एक अच्छा विकल्प है, क्योंकि भले ही यह कक्षा की घोषणा में निरर्थक है, यह चाइल्ड क्लास घोषणा में बहुत मददगार होगा: LionFree AnimalAbstractFactory का विस्तार करता है, जो मुझे लगता है, जानकारी का एक अच्छा टुकड़ा है।
इगोर

11

विशिष्ट उदाहरण पर निर्भर करता है। बिल्डर पैटर्न हमेशा आपकी कक्षा * बिल्डर का नामकरण करके दिया जाता है, जबकि एक सिंगलटन को आमतौर पर इस तरह का नाम देने की आवश्यकता नहीं होती है।

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


3
यहां संगति महत्वपूर्ण है, क्योंकि एक बार केवल कुछ कारखानों को बुलाया जाता है ...Factory, तो यह महसूस करना काफी मानसिक हो जाता है कि एक वर्ग एक कारखाना है यदि इसका नामकरण उस सम्मेलन को तोड़ देता है।
कोनराड मोरावस्की

10

कक्षाओं में पैटर्न नामों का उपयोग करने का पूरा बिंदु यह समझना आसान है कि कक्षा क्या करती है। यदि आप कक्षा का नाम AnimalFactory रखते हैं, तो यह स्पष्ट है कि वर्ग पशु उदाहरण बनाता है। यदि आपकी कक्षा के नाम में एक पैटर्न का नाम शामिल है और यह वर्णन नहीं करता है कि आपने क्या किया है तो आपने गलत पैटर्न चुना है या इसे गलत तरीके से लागू किया है।


1

मुझे लगता है कि यह वास्तव में अच्छी तरह से काम कर सकता है। उदाहरण के लिए:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
यह पूछे गए प्रश्न का उत्तर कैसे देता है? मेरे पढ़ने के अनुसार, आपके "उदाहरण" केवल कक्षा के नाम और कोड टिप्पणियों का बेकार दोहराव दिखाते हैं
gnat

टिप्पणियां प्रत्येक वर्ग के उद्देश्य को सही ठहराने के लिए होती हैं क्योंकि कक्षा का नाम कुछ के लिए स्पष्ट नहीं होता है। इन्हें देखकर मुझे तुरंत पता चलता है कि मेरे पास कमांड है जो कुछ करता है, डेटा, डेकोरेटर को क्वेरी करता है जो मौजूदा व्यवहार लॉगिंग तंत्र में अतिरिक्त व्यवहार जोड़ता है और एक कारखाना जो खाता फ़िल्टर बनाता है। मेरी राय में आप अपने वर्ग के नामों के साथ जितने अधिक वर्णनात्मक होंगे, दूसरों के लिए आपके कोड को पढ़ना उतना ही आसान हो जाएगा। यदि आप एक डिज़ाइन पैटर्न का उपयोग कर रहे हैं, तो ऐसा कहें - दिन के अंत में डिज़ाइन पैटर्न होने का पूरा उद्देश्य दूसरों के लिए आपके कोड को पढ़ने में आसान बनाना है
CodeART
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.