अमूर्त वर्गों के लिए सामान्य नामों से कैसे बचें?


10

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

  • व्युत्पन्न वर्गों को ग्राहकों के रूप में व्यवहार करना बेहतर है और कार्यक्षमता के भाग के आधार वर्ग का नाम इसे लागू करता है? इसे अधिक अर्थ देता है लेकिन उल्लंघन करेगा-ए। जैसे कि यह व्युत्पन्न वर्ग के लिए प्राप्त हो रहा है, लेकिन EmailAcquirer एक उचित नाम होगा, लेकिन व्युत्पन्न वर्ग किसी के लिए अधिग्रहण नहीं करेगा।
  • या केवल वास्तव में अस्पष्ट नाम है क्योंकि कौन जानता है कि व्युत्पन्न वर्ग क्या करेंगे। हालाँकि "प्रोसेसर" अभी भी बहुत सामान्य है क्योंकि यह कई प्रासंगिक संचालन कर रहा है, जैसे कि IMAP लॉग इन करना और उपयोग करना।

इस दुविधा से बाहर निकलने का कोई रास्ता?

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


क्या आपके पास "सामान्य रूप से" दावे के लिए एक स्रोत (और कुछ संदर्भ) है? इसके अलावा, सूची के लिए एक अतिरिक्त नामकरण नियम - एक सही नाम की तलाश में समय बर्बाद न करें जो संभवतः मौजूद नहीं है। यदि संदेह है, तो आप इसे सबसे अच्छा नाम दे सकते हैं, एक टिप्पणी के रूप में एक लंबा विवरण जोड़ें जहां यह आवश्यक हो तो परिभाषित किया जाए, लेकिन आप हमेशा बाद में रिफ्लेक्टर कर सकते हैं यदि कोई आपकी पसंद को पसंद नहीं करता है या सही नाम अचानक आपके सामने आता है जब आप ' कुछ और कर रहे हैं।
स्टीव 314

3
@ स्टीव ३१४ - हाँ, स्टीव मैककोनेल, कोड कम्प्लीट, १ एड।, अध्याय ४ या ५ रूटीन पर। इन अध्यायों में नामकरण पर व्यापक चर्चा, अनिवार्य रूप से यह निष्कर्ष निकालने पर कि यदि आपके पास एक अच्छा नाम नहीं है, तो आपके पास शायद एक अच्छा कार्य नहीं है।
djechlin

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

1
@ स्टीव 314 प्रोग्रामिंग पूरी तरह से जटिलता के प्रबंधन के बारे में है, और यदि आपका मस्तिष्क किसी चीज के लिए एक शब्द के साथ नहीं आ सकता है, तो यह एक बहुत अच्छा मौका है कि यह उस की जटिलता को प्रबंधित करने में सक्षम नहीं होगा जब उसे चीजों का उपयोग करना होगा। बड़े वाक्य या बड़े सिस्टम के हिस्से के रूप में। यह वास्तव में एक अच्छा नाम खोजने में असमर्थता कहने के लिए एक साहसिक दावा नहीं है चिंता का एक बड़ा कारण है। लेकिन मैककोनेल में इसकी बड़े पैमाने पर चर्चा की गई है, मैं कम से कम उन दो अध्यायों को पढ़ने की सलाह दूंगा, हालांकि पूरी किताब कवर-टू-कवर पढ़ने लायक है।
djechlin 22

कोड पूरा होने के दावों पर भरोसा नहीं करना चाहिए। मैं किताबें प्रतिष्ठा के बारे में पता कर रहा हूँ, लेकिन मैं यह भी के बारे में पता कर रहा हूँ इस । इसके अलावा, मैं उम्र के लिए पूरी तरह से जटिलता का प्रबंधन कर रहा हूं - गलतियां होती हैं, कोस की, लेकिन जब चीजें गलत हो जाती हैं, तो कभी-कभी समस्या एक ऐसा कार्य है जो इतना सरल है कि यह स्पष्ट रूप से गलत नहीं हो सकता है, लेकिन वैसे भी है
स्टीव

जवाबों:


10

समस्या का नाम नहीं है, लेकिन यह है कि आप एक वर्ग में बहुत अधिक डाल रहे हैं।

आपके उदाहरण वर्ग में, कुछ भाग बहुत ठोस हैं (मेल कैसे प्राप्त किए जाएंगे)। अन्य भाग बहुत सार हैं (आप मेल के साथ क्या करेंगे)।

वंशानुक्रम की तुलना में अलग वर्गों के साथ ऐसा करने के लिए बेहतर है।

मैं सुझाव देता हूँ:

  • एक अमूर्त MessageIterator, एक POPMailBoxDownloader द्वारा उप-वर्ग

  • एक अन्य वर्ग जो एक POPMailBoxDownloader OWNS करता है और संदेशों के साथ कुछ करता है।


यह बिल्कुल सही लगता है। ऐसा लगता है कि यदि आप अपने आप को कुछ "प्रक्रियाईवेंट" या एक वर्ग "मैसेजप्रोसेसर" का नाम दे रहे हैं, तो एक अच्छा मौका है जिसे आप व्युत्पत्ति के बजाय रचना पर डिज़ाइन कर सकते हैं। इस मामले में यह एक ट्रेडऑफ़ है, क्योंकि अनुरक्षक लचीलेपन के लिए उपयोगी हो सकता है, लेकिन एक ग्राहक यह सोचकर नाराज़ होगा कि प्रत्येक फ़ंक्शन क्या करता है (अनुचर की तुलना में मोरो)।
djechlin

6

अगर मुझे कक्षा के लिए एक अच्छा नाम नहीं मिल रहा है तो मैं कक्षा के लिए इनलाइन कोड प्रलेखन लिखता हूं। यह एक गंध में वर्ग के उद्देश्य का वर्णन करता है। आमतौर पर मैं इस विवरण से कक्षा के लिए एक अच्छा नाम प्राप्त कर सकता हूं। यह अमूर्त वर्गों के लिए भी सहायक है।

यदि वर्ग का वर्णन "किसी उपयोगकर्ता के इनबॉक्स में लॉग होता है और उससे संदेशों को संसाधित करता है", तो मैं "इनबॉक्सप्रोसेसर" को कक्षा के नाम के रूप में सुझाऊंगा। यदि एक व्युत्पन्न वर्ग के पास "उपयोगकर्ता के इनबॉक्स में लॉग होता है और स्पैम ईमेल को स्पैम फ़ोल्डर में ले जाता है" तो विवरण के रूप में, मैं एक नाम के रूप में "इनबॉक्सस्पैममूवर" चुनूंगा।

"प्रोसेसर" जैसे सामान्य नामों का उपयोग करते समय मुझे कोई समस्या नहीं दिखाई देती है अगर यह एक अमूर्त वर्ग के सामान्य उद्देश्य को दर्शाता है।

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


2

फ्रैंक ज़प्पा को paraphrase करने के लिए, यह वही है जो इस तरह से होना चाहिए। आपका उदाहरण सिर्फ इतना गहरा नहीं खोता है कि किस तरह का प्रसंस्करण चल रहा है। क्या यह एक EmailToTroubleTicketProcessor, EmailGrammarCorrectorया एक है EmailSpamDetector?

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

यह बिल्कुल सच नहीं है; सवाल आप कुछ अमूर्त के लिए उत्तर नहीं दे सकता है " कैसे यह क्या करता है यह क्या करता है?" क्योंकि यह कार्यान्वयन-विशिष्ट है। यदि एक EmailSenderकक्षा में एक DeliveryStatus deliver(Email e)विधि है, तो एक निहित अनुबंध है कि एक कार्यान्वयन एक ईमेल ले जाएगा, इसे वितरित करने का प्रयास करें और यह कैसे चला गया इसके बारे में कुछ स्थिति लौटाएं। आपको परवाह नहीं है कि यह एसएमटीपी सर्वर से जुड़ता है या इसे एक होमिंग कबूतर के लिए तब तक प्रिंट करता है जब तक कि कार्यान्वयन क्या वादा किया गया था। सार बस उस वादे को निर्धारित करता है ताकि एक कार्यान्वयन कह सके, "हाँ, मैं ऐसा करता हूं।"


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

यह अभी भी वही बात है। यहां तक ​​कि अगर आपका तरीका है void doWhatYouDoWith(Email e), तब भी आप वर्ग को कॉल कर सकते हैं EmailDisposer, जो यह कहने के लिए पर्याप्त विशिष्ट है कि यह क्या करता है, लेकिन सामान्य रूप से यह लागू करने के लिए कैसे पर्याप्त है। हालाँकि मुझे लगता है कि @KrisVanBael ने इसे रद्द कर दिया है: यदि आपने ऐसी किसी चीज़ का सहारा लिया है, तो एक छत के नीचे बहुत कुछ हो सकता है।
ब्लरफ्ल

0

इस बारे में सोचें कि ऐसे शब्दों का उपयोग करना क्यों बुरा है। क्या वे वर्णनात्मक हैं? कक्षाओं का वर्णन करने के लिए कौन से शब्द हैं ? EmailBaseClass? क्या EmailManager या इससे मिलते-जुलते शब्दों की तुलना में यह अधिक वर्णनात्मक हो सकता है? कुंजी प्रश्न में वर्ग के बारे में एक अंतर्दृष्टि है , इसलिए उचित क्रियाएं या संज्ञाएं ढूंढें। अपने कोड को ऐसे समझें जैसे वह कविता थी।


"EmailBaseClass" नामकरण की तरह होगा int age"ageInteger," केवल इससे भी बदतर क्योंकि मैं इसे से सादे पाठ ईमेल, MIME ईमेल आदि प्राप्त करने की उम्मीद करूंगा। abstractपहली जगह में शब्द से पहले क्या है यह वर्णन करने की आवश्यकता नहीं है (यह जावा है)। क्या आपके पास इस वर्ग के आधार भाग के लिए कोई विशेष जानकारी है? और अधिक अंतर्दृष्टि अभी भी कुछ नामकरण की समस्या को हल नहीं करती है जो कि एक-एक रिश्ते को पार करने वाली है, मैं या तो कुछ बहुत अस्पष्ट या बहुत सामान्य हो सकता हूं, मुझे इससे बाहर निकलने का कोई रास्ता नहीं दिखता है जब तक कि अगर मैं नहीं था अधिक जानकारी होने में अधिक अंतर्दृष्टि।
djechlin

@djechlin - ऐसे दुर्लभ मामले हैं जहां ageIntegerया ऐसा कुछ वास्तव में उचित है। हंगेरियन नोटेशन एक संदर्भ से संक्षिप्त संस्करण है जहां यह बहुत हुआ। निश्चित रूप से, ऐसे समय होते हैं जब आपको ageNumericऔर ageStringउसी दायरे में किसी चीज की आवश्यकता हो सकती है , जिसमें नाम का प्रकार एक संकेत के साथ सबसे आसान और स्पष्ट तरीका हो सकता है।
स्टीव 314

@djechlin मैं व्यक्तिगत रूप से यह कोड के साथ काम करने का सबसे आसान लगता है मैं सिर्फ सकता है जो नज़र में समझ हासिल करने के लिए। यानी, नाम बताएं कि मैं किसके साथ काम कर रहा हूं। यह जानने की जरूरत नहीं है कि systemControllerएक अमूर्त आधार वर्ग है या एक विशाल पदानुक्रम में एक पत्ती है। बेशक, इसे आईडीई के साथ फिर से बनाया जा सकता है (जैसा कि मुझे लगता है कि अधिकांश जावा विकास के मामले में है?) जो तुरंत उपयोगकर्ता को कक्षा की सामग्री और संरचना के बारे में सूचित कर सकता है इसलिए वास्तव में व्यावहारिक नाम समान नस में उचित नहीं हो सकते।
zxcdw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.