नाम स्थान के साथ Smurf नामकरण कक्षाओं से बचने में समस्याएं


39

मैंने यहाँ (नंबर 21) से स्मर्फ नामकरण शब्द निकाला । किसी को भी परिचित नहीं मुसीबत बचाने के लिए, Smurf नामकरण एक आम उपसर्ग के साथ संबंधित वर्गों, चर, आदि का एक समूह लगाकर का कार्य तो आप के साथ "एक अंत है SmurfAccountViewएक गुजरता है SmurfAccountDTOकरने के लिए SmurfAccountController", आदि

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

  1. मैं लाइब्रेरी के साथ Configurationक्लास के साथ काम कर रहा हूं । इसे बुलाया जा सकता था, WartmongerConfigurationलेकिन यह वार्टमॉन्गर नेमस्पेस में है, इसलिए इसे अभी-अभी बुलाया गया है Configuration। इसी तरह मेरे पास एक Configurationवर्ग है जिसे बुलाया जा सकता है SmurfConfiguration, लेकिन यह स्मर्फ नाम स्थान में है ताकि यह निरर्थक होगा। मेरे कोड में कुछ ऐसे स्थान हैं जहाँ पूरी तरह से योग्य नामों के Smurf.Configurationसाथ-साथ Wartmonger.Configurationटाइप करना नामुमकिन है और कोड को कम पठनीय बनाता है। यह एक से निपटने के लिए अच्छा होगा SmurfConfiguration(यदि यह मेरा कोड था और पुस्तकालय नहीं था) WartmongerConfiguration

  2. मेरे पास Serviceमेरे Smurf नाम स्थान में एक वर्ग है जिसे बुलाया जा सकता था SmurfService। एक जटिल Smurf पुस्तकालय के शीर्ष पर Serviceएक मुखौटा है जो Smurf नौकरियां चलाता है। SmurfServiceएक बेहतर नाम की तरह लगता है क्योंकि Serviceस्मर्फ के बिना उपसर्ग इतना अविश्वसनीय रूप से सामान्य है। मैं स्वीकार कर सकता हूं कि SmurfServiceपहले से ही एक सामान्य, बेकार नाम था और महक को दूर ले जाने से यह और अधिक स्पष्ट हो गया। लेकिन यह नाम दिया जा सकता था किया गया है Runner, Launcher, आदि और यह अभी भी रूप में मेरे लिए "बेहतर महसूस" होगा SmurfLauncherक्योंकि मैं नहीं जानता कि क्या एक Launcherकरता है, लेकिन मुझे पता है कि एक SmurfLauncherहै। आप यह तर्क दे सकते हैं कि क्या Smurf.Launcherहोना चाहिए एक के रूप में ही स्पष्ट होना चाहिएSmurf.SmurfLauncher, लेकिन मैं देख सकता हूँ `Smurf.Launcher किसी वर्ग के बजाय सेटअप से संबंधित किसी प्रकार का वर्ग है जो स्मर्फ्स लॉन्च करता है।

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


3
क्या Smurf.Launcherस्मर्फ लॉन्च करता है , या यह लॉन्च करता है SmurfJob? शायद इसे कहा जा सकता है Smurf.JobLauncher?
ब्लोगर्बर्ड

2
यह एक वर्ग का नाम है एक Xservice, XManager, आदि का नाम गंध, ये कोई मतलब नहीं है। यह एक बर्तन की तरह है। यदि आप फ़ाइल नामों को संक्षिप्त कर रहे हैं तो कुछ भी वहाँ हो सकता है या वहाँ से गायब हो सकता है। जब तक आप अंदर न देखें, यह जानने का कोई तरीका नहीं है। मैं इसे SmurfService से कुछ और पूरी तरह से नाम बदल दूंगा।
डैनियल कापलान

1
यह वास्तव में SmurfJobएस लॉन्च करता है , या तकनीकी रूप से उन्हें स्मर्फ प्रलेखन की भाषा के अनुरूप होने के लिए चलाता है। इस बात का प्रकाश और अन्य उत्तर में, मैं नाम बदलने के लिए जा रहा हूँ SmurfServiceकरने के लिए SmurfJobRunner। ऐसा लगता है कि नंबर 1 में कोई भाषा अज्ञेय नहीं है, जैसा कि मुझे उम्मीद है। मैं ऐसे उदाहरण देख सकता हूं जहां साथ SmurfConfigurationजाना सही कॉल होगा, लेकिन मेरे मामले में मुझे लगता Configurationहै कि परेशानी के साथ भी सबसे अच्छा है Wartmonger.Configuration
डैनियल कोवर्मन

6
मैं यह समझने की कोशिश कर रहा हूं कि आपके पास एक एकल वर्ग क्यों है जो सभी Wartmongers और Smurfs दोनों को कॉन्फ़िगर करने के बारे में परवाह करता है।
डोनल फैलो

अलग क्यों Smurf.Configurationऔर कैसे SmurfConfigurationमहसूस करते हैं? निश्चित रूप से यह अतिरिक्त आकर्षण नहीं है, क्या यह है? ( Configअगर लंबाई की समस्या है तो कम करें।) क्या Smurf.Configurationकोई समस्या SmurfConfigurationनहीं है?
पाब्लो एच

जवाबों:


16

आप कुछ अच्छे अंक जुटाएं।

  1. डुप्लिकेट क्लासेस होने के संबंध में, आप C # में क्लासेस अलियास कर सकते हैं। उदाहरण using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;के लिए उपयोग करें इस पोस्ट को StackOverflow पर देखें । आपने अपनी प्रोग्रामिंग भाषा को इंगित नहीं किया है, लेकिन आपने जो कुछ भी लिखा है, उससे मुझे इसका अनुमान है। इसलिए जहां आप दो अलग-अलग परियोजनाओं के साथ काम कर रहे हैं, आप उन्हें अलग-अलग कर सकते हैं SmurfConfigurationऔर WartmongerConfigurationदोनों वर्गों का उपभोग करते समय अस्पष्टता से मुक्त करेंगे।

  2. एक सेवा के रूप में बाहरी एप्लिकेशन के संपर्क में है, मुझे आपके एप्लिकेशन नाम के साथ सेवा की ब्रांडिंग करने में कोई समस्या नहीं दिखती है, इसलिए इस मामले में यह SmurfServiceमान्य होगा क्योंकि यह वास्तव में उपभोग एप्लिकेशन में सेवाओं के समूहों को तोड़ देगा।

मुझे लगता है कि नामकरण की इस शैली से बचने के लिए नाम स्थान का उपयोग किया जाना चाहिए। यह कोड को ग्रो करना और फेस वैल्यू पर यह देखना मुश्किल बनाता है कि कोई वर्ग MyCompanyMyProductMyAreaClassName को पढ़े बिना क्या है। अलियासिंग तकनीक का उपयोग करने से आपको जहां जरूरत है वहां अस्पष्टता को कम करने की अनुमति मिलती है। केवल एक बार जब मुझे लगता है कि आपको अपने नामकरण में जटिलता का परिचय देना चाहिए, जैसा कि मैंने # 2 में बताया है, जब लोग एक सेवा का उपभोग करेंगे। यह वह जगह है जहाँ यह नामकरण की इस शैली के लिए सही अर्थ है क्योंकि अगर उपभोक्ता के पास विभिन्न प्रकार की सेवाएँ हैं, तो यह अस्पष्टता का उपभोग कर सकता है।


5
उपनाम सिर्फ चीजों को कुतरते हैं। Smurf.Service के बजाय अब आपके पास SmurfService = Smurf.Service है। तो आप के रूप में अच्छी तरह से सिर्फ SmurfService पहली जगह में बात का नाम हो सकता है। उनके पास एक जगह है, लेकिन इस विशेष मुद्दे के लिए नहीं। हालाँकि, इसका किसी समस्या का शायद सबसे अच्छा उत्तर है जिसका कोई उत्तर नहीं है :)
gbjbaanb

। मेरे में C # मेरे सवाल में आया था, लेकिन मैं वास्तव में जावा और के साथ काम कर रहा हूँ org.apache.smurfville.wartmonger.configuration। यह दुर्भाग्य से उपनामों पर शासन करता है। 2 एक ठोस बिंदु है, इसलिए मैं Smurf को सेवा के लिए ब्रांडिंग रखने जा रहा हूं।
डैनियल कोवर्मन

25

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

उस ने कहा, यह वास्तव में Smurf वर्गों का एक समूह होने के लिए बुरा नहीं है अगर Smurf आपको वर्ग के बारे में कुछ विशिष्ट बताता है। कक्षा के नाम आपको वर्णनात्मक रूप से बताए जाने चाहिए कि कक्षा क्या करती है।

      Session
       ^   ^
      /     \
DBSession   HttpSession

इसी तरह एक वस्तु DBSessionले सकता है DBRequestजो एक DBResponseवस्तु देता है । HttpSessionहो सकता है यह भी पर काम HttpRequestऔर HttpResponseवस्तुओं।

ये एक उद्देश्य के साथ स्मर्फ कक्षाएं हैं।

वे में रहते हैं हो सकता है MyCompanyनाम स्थान लेकिन MyCompanyHttpSessionऔर MyCompanyDBSessionकी तुलना में आप पहले था कि आप किसी भी अधिक जानकारी नहीं देता है। इस मामले में Smurf को छोड़ें और इसे एक नाम स्थान बनाएं।

MyCompany.HttpSession

3

मैं भ्रम के इसी बिंदु के खिलाफ पहले भी भाग चुका हूं और आमतौर पर यह वास्तव में एक सवाल है कि हम इस नाम के हिस्से के रूप में किस तरह की चीज को शामिल करते हैं।

आप उल्लेख करते हैं SmurfConfigurationऔर WartmongerConfigurationसंभावित प्रकार के कॉन्फ़िगरेशन के रूप में। आप इंगित करते हैं कि आपने अपने नामस्थान पर विशेषण (अपनी तरह) को हटा दिया है ताकि आपके पास जो कुछ बचा है वह सिर्फ वेनिला है Configuration। मैं ऐसा करने से बचूंगा।

यह निर्णय लेने जैसा है कि स्ट्रॉबेरी आइसक्रीम स्ट्रॉबेरी नेमस्पेस में बस आइसक्रीम है और इसी तरह चॉकलेट के साथ, लेकिन क्या हुआ कि आपने विशेषण को तलाक दे दिया है जो इसे इस चीज से अपनी पहचान देता है। यह स्ट्रॉबेरी श्रेणी की आइसक्रीम नहीं है। यह स्ट्रॉबेरी आइसक्रीम है - एक तरह की आइसक्रीम।

आइए कल्पना करें कि आपके ऐप में, आप Strawberry.IceCreamक्लास को इम्पोर्ट करते हैं और फिर सीधे से इंस्टेंट करना शुरू करते हैं IceCream

var ic = new IceCream(); //actually I'm strawberry ice cream

यह तब तक अच्छा और अच्छा लग सकता है, जब तक आप दूसरे IceCreamवर्ग का आयात नहीं करते । अब आप किसी भी तरह से उनके बीच अंतर करने की मूल समस्या पर वापस आ गए हैं, जो समस्याग्रस्त है। आप सभी के साथ क्या चाहते थे:

var sic = new StrawberryIceCream();
var cic = new ChocolateIceCream();

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


2

यह निश्चित रूप से अंगूठे का एक अच्छा नियम है कि यदि आपको कक्षाओं के एक समूह पर एक आम उपसर्ग मिला है, तो वे संभवतः अपने स्वयं के नामस्थान में जाने के लायक हैं। तब समस्या से निपटने के लिए, जब आपको दो नामस्थानों से समान रूप से नामित कक्षाओं का उपयोग करने की आवश्यकता होती है:

1) उपनामों का नाम दें, हालांकि मैं इसे छोटा और इस बिंदु तक ले जाऊंगा, किसी भी प्राकृतिक संक्षिप्त नाम, शायद सिर्फ 1 पत्र:

using Sm = Smurf;
using W = Wartmonger;

तब हमेशा उपसर्ग जहाँ भी इस्तेमाल किया और नाम उदाहरण उचित रूप से:

Sm::Configuration smConf; 
W::Configuration wConf;

2) अन्य उत्तर में सुझाए अनुसार, कक्षा को उपनाम दें।

using SmConf = Smurf.Configuration;

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

4) रिफैक्टर कोड ताकि आपको दो अलग-अलग जगहों से कॉन्फ़िगरेशन का उपयोग करने की आवश्यकता न हो। इसका विवरण आपके ऊपर है।

5) अपनी कक्षा में पास होने से पहले दो कॉन्फ़िगरेशन को एक में मिलाएं। प्रतिनिधित्व करने के लिए एक संयुक्त आत्मविश्वास वर्ग का उपयोग करें:

struct Conf {
    SmurfConfiguration smurf;
    WartmongerConfiguation wart;
}

लघु सदस्य चर नाम अब क्लास / नेमस्पेस को अलियासिंग करने के समान है।


0

अजीब लगता है कि आपको परेशान करने वाले नाम में एक बिंदु जोड़ देता है।

Wartmonger.Configuration configuration = Wartmonger.Configuration .new();

// vs

WartmongerConfiguration configuration = WartmongerConfiguration.new();

यदि दोनों Smurfऔर Wartmongerकॉन्फ़िगरेशन एक ही स्थान पर एक साथ उपयोग किए जाते हैं, लेकिन अलग-अलग उन्हें कई स्थानों पर उपयोग किया जाता है - तो नाम स्थान निश्चित रूप से अच्छा दृष्टिकोण है।

नाम स्थान होने आंतरिक कोड में उपयोग "क्लीन" के नाम, जहां उपसर्गों के साथ आप का उपयोग कर खत्म करने के लिए संभावना दे देंगे SmurfConfigurationअंदर SmurfServiceकी आंतरिक कोड है, जो हो सकता है कष्टप्रद हर आपको लगता है कि कोड खुल जाएगा।

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