क्या समाधान में फ़ोल्डर्स नाम स्थान से मेल खाते हैं?


129

क्या समाधान में फ़ोल्डर्स नाम स्थान से मेल खाते हैं?

मेरी एक टीम प्रोजेक्ट में, हमारे पास एक क्लास लाइब्रेरी है जिसमें प्रोजेक्ट में कई सब-फ़ोल्डर्स हैं।

प्रोजेक्ट का नाम और नामस्थान MyCompany.Project.Section:।

इस परियोजना के भीतर, कई फ़ोल्डर हैं जो नाम स्थान से मेल खाते हैं:

  • फ़ोल्डर Vehiclesमें MyCompany.Project.Section.Vehiclesनाम स्थान की कक्षाएं हैं
  • फ़ोल्डर Clothingमें MyCompany.Project.Section.Clothingनाम स्थान की कक्षाएं हैं
  • आदि।

इसी परियोजना के अंदर, एक और दुष्ट फ़ोल्डर है

  • फ़ोल्डर BusinessObjectsमें MyCompany.Project.Sectionनाम स्थान की कक्षाएं हैं

इस तरह के कुछ मामले हैं जहां "संगठनात्मक सुविधा" के लिए फ़ोल्डर्स बनाए जाते हैं।

मेरा सवाल है: मानक क्या है? कक्षा के पुस्तकालयों में फ़ोल्डर्स आमतौर पर नेमस्पेस संरचना से मेल खाते हैं या यह एक मिश्रित बैग है?


9
नोट: यदि नामस्थान फ़ोल्डर पदानुक्रम से मेल नहीं खाता है तो ReSharper शिकायत करेगा।
फ्रेड

जवाबों:


77

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

कक्षाएं ढूंढना आसान हो जाएगा और यह अकेले पर्याप्त कारण होने चाहिए।

हमारे द्वारा पालन किए जाने वाले नियम हैं:

  • प्रोजेक्ट / असेंबली का नाम रूट नेमस्पेस के समान है
  • केवल उपरोक्त नियम के अपवाद के साथ एक परियोजना है। अंत समाप्त होने के बाद, .कोर बंद कर दिया जाता है
  • फ़ोल्डर नामस्थान के बराबर है
  • प्रति फ़ाइल एक प्रकार (क्लास, स्ट्रक्चर, एनम, डेलीगेट, इत्यादि) सही फ़ाइल खोजने में आसान बनाता है

1
+1 के लिए "केवल उपरोक्त नियम का अपवाद एक परियोजना है। इसके समाप्त होने के बाद, .कोर को अकेले छीन लिया जाता है" । मेरे पास एक MyProject.Core.dllअसेंबली है और सभी कक्षाएं शुरू होती हैं MyProject.Core.Coreप्रत्यय का अलग होना बहुत अधिक मायने रखता है।
लुइज़ डेमिम २४'१३

2
एक और अपवाद जो मैं जोड़ सकता हूं वह अपवाद है। अपवाद पहले से ही 'अपवाद' से ग्रस्त हैं, इसलिए एक अतिरिक्त नामस्थान निरर्थक है। यह शब्द के अपवाद के साथ नामस्थान का एक हिस्सा होने में भी गड़बड़ी हो सकती है (सिस्टम भ्रमित कर सकता है। अपवाद)। हालाँकि, उन्हें फ़ोल्डर्स में व्यवस्थित करना काफी मददगार है।
फिलिप्पेविए

55

नहीं।

मैंने छोटी और बड़ी परियोजनाओं पर दोनों तरीकों की कोशिश की है, दोनों एकल (मुझे) और डेवलपर्स की एक टीम के साथ।

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

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

उदाहरण के लिए इस FxCop चेतावनी को लें:

CA1020: कुछ प्रकार के
कारणों से नामस्थान से बचें : वैश्विक नामस्थान के अलावा अन्य नामस्थान में पांच से कम प्रकार के https://msdn.microsoft.com/en-gb/library/ms182130.aspx हैं

यह चेतावनी एक सामान्य प्रोजेक्ट में नई फ़ाइलों को डंप करने के लिए प्रोत्साहित करती है। जेनरल फ़ोल्डर, या यहां तक ​​कि प्रोजेक्ट रूट जब तक आपके पास एक नया फ़ोल्डर बनाने के औचित्य के लिए चार समान कक्षाएं नहीं हैं। क्या ऐसा कभी होगा?

फ़ाइलें ढूँढना

स्वीकृत उत्तर कहता है, "कक्षाएं आसानी से मिल जाएंगी और यह पर्याप्त कारण होने चाहिए।"

मुझे लगता है कि उत्तर में एक प्रोजेक्ट में कई नामस्थान होने का जिक्र है, जो फ़ोल्डर संरचना के लिए मैप नहीं करता है, बल्कि मैं जो सुझाव दे रहा हूं, वह एकल नेमस्पेस के साथ एक प्रोजेक्ट है।

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

नाम का टकराव

सुनिश्चित करें कि कई नामस्थान बनाने से प्रोजेक्ट को एक ही नाम के दो वर्ग मिल सकते हैं। लेकिन क्या यह वाकई अच्छी बात है? क्या यह संभव है कि संभव होने से बस अस्वीकार करना आसान है? एक ही नाम के साथ दो कक्षाएं लगाने से एक अधिक जटिल स्थिति बन जाती है जहां 90% समय चीजें निश्चित तरीके से काम करती हैं और फिर अचानक आपको पता चलता है कि आपके पास एक विशेष मामला है। मान लें कि आपके पास अलग-अलग नामस्थानों में परिभाषित दो आयत वर्ग हैं:

  • वर्ग Project1.Image। आयत
  • वर्ग Project1.Window। आयत

किसी समस्या को हिट करने के लिए संभव है कि स्रोत फ़ाइल को दोनों नामस्थानों को शामिल करना होगा। अब आपको उस फाइल में हर जगह पूरा नाम लिखना है:

var rectangle = new Project1.Window.Rectangle();

या बयान का उपयोग कर कुछ बुरा के साथ गड़बड़:

using Rectangle = Project1.Window.Rectangle;

अपनी परियोजना में एक एकल नामस्थान के साथ आप अलग-अलग आने के लिए मजबूर हैं, और मैं अधिक विवरणात्मक, इस तरह के नामों पर बहस करूंगा:

  • वर्ग Project1.ImageRectangle
  • वर्ग Project1.WindowRectangle

और उपयोग हर जगह समान है, आपको एक विशेष मामले से निपटने की ज़रूरत नहीं है जब कोई फ़ाइल दोनों प्रकार का उपयोग करती है।

बयानों का उपयोग कर

using Project1.General;  
using Project1.Image;  
using Project1.Window;  
using Project1.Window.Controls;  
using Project1.Shapes;  
using Project1.Input;  
using Project1.Data;  

बनाम

using Project1;

कोड लिखते समय हर समय नामस्थान जोड़ने की सुविधा नहीं है। यह वास्तव में लगने वाला समय नहीं है, ऐसा करने के प्रवाह में ब्रेक है और सिर्फ बयानों के उपयोग से बहुत सारी फाइलों को भरना है - किस लिए? यह इसके लायक है?

प्रोजेक्ट फ़ोल्डर संरचना बदलना

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

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

विजुअल स्टूडियो अपने द्वारा बनाए गए प्रोजेक्ट फ़ोल्डर में एक नई फ़ाइल के नाम स्थान को स्वचालित रूप से मैप करता है

दुर्भाग्यपूर्ण है, लेकिन मुझे पता है कि नाम स्थान को सही करने का झंझट उनसे निपटने की परेशानी से कम है। इसके अलावा, मैं Add-> New का उपयोग करने के बजाय किसी मौजूदा फ़ाइल को कॉपी करने की आदत में हूं।

Intellisense और Object Browser

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

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


30
यह ईमानदारी से सबसे बुरा सपना समाधान में से एक है जिसे मैंने सुझाया है। यदि आप छोटे हैलो वर्ल्ड प्रोजेक्ट्स पर काम करते हैं तो यह सलाह काम करती है, लेकिन कल्पना करें कि आपके पास 1000+ .cs फाइलें हैं। यह बहुत सारी समस्याओं का कारण होगा, मुझे नहीं पता कि कहां से शुरू करना है।
बेंटऑनकोडिंग

10
"लेकिन कल्पना करें कि आपके पास 1000+ .cs फाइलें हैं"। मैंने एक एकल नाम स्थान के साथ उस आकार की परियोजनाओं में काम किया है। यह ठीक है। आपको क्या लगता है कि आपदा क्या होगी?
वेयलैंड यूटानी

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

3
@WeylandYutani मुझे पता है कि मुझे देर हो रही है लेकिन मुझे यह उल्लेख करने की आवश्यकता है कि यह वाक्य you can find it by using Go To Definition or the search solution explorer box in Visual Studioहमेशा सही नहीं होता है। यह बहुत सारी विरासत और इंटरफेस की कोशिश करें ... सही फ़ाइल खोजने पर शुभकामनाएँ।
इमैनुएल एम।

11
यह सलाह मैंने देखी है में से एक है। नाम स्थान केवल संघर्ष के संकल्प के लिए हैं, न कि कक्षाओं के आयोजन के लिए। केवल उन नामस्थानों का उपयोग करें, जहाँ उनका उपयोग करना समझ में आता है, जैसे कि जहाँ आप अन्य प्रोजेक्ट्स के साथ नामकरण टकराव की अपेक्षा करते हैं, जो आपके प्रोजेक्ट का उपयोग कर सकते हैं, कुछ नामस्थानों को शामिल करने या बयानों का उपयोग करने के साथ बाहर करने की अनुमति दे सकते हैं। यह भयानक टी 3 या 4 या अधिक नामस्थान वाली एक परियोजना है जिसका अक्सर उपयोग किया जाता है, क्योंकि यह हमेशा बयानों का उपयोग करने की एक हास्यास्पद संख्या में परिणाम देता है जिसे आपको जोड़ने और जोड़ने और जोड़ने की आवश्यकता होती है। अपनी परियोजनाओं को तोड़ दो।
त्रिनको

31

मुझे लगता है कि .NET के भीतर मानक, संभव होने पर इसे करने की कोशिश करना है, लेकिन अनावश्यक रूप से गहरी संरचनाओं को बनाने के लिए नहीं, बस इसे एक कठिन नियम के रूप में पालन करना है। मेरी परियोजनाओं में से कोई भी नामस्थान == संरचना नियम 100% समय का पालन नहीं करता है, कभी-कभी ऐसे नियमों से अलग होने के लिए कभी-कभी इसका सिर्फ क्लीनर / बेहतर होता है।

जावा में आपके पास कोई विकल्प नहीं है। मुझे लगता है कि सिद्धांत में क्या काम करता है का एक क्लासिक मामला बनाम व्यवहार में क्या काम करता है।


1
मैं कहता हूँ "ऐसा करो जब तुम वास्तव में कुछ अपने नामस्थान में होना चाहते हो"। यह एक सचेत निर्णय होना चाहिए। यदि आपकी परियोजनाएं ठीक से अलग-थलग हैं, तो यह प्रति प्रोजेक्ट एक नाम स्थान होना चाहिए। यदि आपकी क्लास किसी नेमस्पेस में है, तो यह उस नेमस्पेस या सबफ़ोल्डर लोकेशन वाले फोल्डर में होना चाहिए जो कम से कम नेमस्पेस जैसा ही हो। Car.Ford.Fusion (यदि Car.Ford आपका एकमात्र नामस्थान है) जैसी श्रेणी कार / फोर्ड जैसे फ़ोल्डर में होनी चाहिए या कार / फोर्ड / सेडान की तरह गहरी हो, तो वह फ़ोल्डर कम से कम नामस्थान की तरह विशिष्ट हो। बस इसे कार / असंबंधित / फोर्ड में न डालें; यह भ्रामक है।
त्रिनको

25

@ क्लसेवेक: मैं इन नियमों से सहमत हूं, और जोड़ने के लिए एक और है।

जब मेरे पास नेस्टेड कक्षाएं होती हैं, तो मैं अभी भी उन्हें एक फ़ाइल प्रति विभाजित करता हूं। ऐशे ही:

// ----- Foo.cs
partial class Foo
{
    // Foo implementation here
}

तथा

// ----- Foo.Bar.cs
partial class Foo
{
    class Bar
    {
        // Foo.Bar implementation here
    }
}

5

मैं हाँ कहूँगा।

सबसे पहले, नामस्थानों का अनुसरण करके वास्तविक कोड फ़ाइलों को खोजना आसान होगा (कहते हैं, जब कोई ई आपको एक नग्न अपवाद कॉल स्टैक ई-मेल करता है)। यदि आप अपने फ़ोल्डरों को नेमस्पेस के साथ सिंक से बाहर जाने देते हैं, तो बड़े कोडबेस में फाइलें ढूंढना थका देने वाला हो जाता है।

दूसरा, VS आपके मूल फ़ोल्डर संरचना के समान नामस्थान के साथ आपके द्वारा बनाए गए नए वर्ग उत्पन्न करेगा। यदि आप इस के खिलाफ तैरने का फैसला करते हैं, तो नई फाइलें जोड़ते हुए रोजाना एक और प्लंबिंग काम करना होगा।

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


4

हां, उन्हें केवल भ्रम की स्थिति में जाना चाहिए।


2

क्या मानक है?

कोई आधिकारिक मानक नहीं है लेकिन पारंपरिक रूप से फ़ोल्डर-टू-नेमस्पेस मैपिंग पैटर्न का सबसे अधिक उपयोग किया जाता है।

कक्षा के पुस्तकालयों में फ़ोल्डर्स आमतौर पर नेमस्पेस संरचना से मेल खाते हैं या यह एक मिश्रित बैग है?

हां, अधिकांश कक्षा पुस्तकालयों में फ़ोल्डर संगठनात्मक आसानी के लिए नामस्थान से मेल खाते हैं।

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