फ़ाइलों और संरचना के लिए सबसे अच्छा तरीका क्या है जिसमें समान नाम वाले सामान्य वर्ग होते हैं?


14

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

MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>

यह देखते हुए कि मैं इन सभी को एक ही नाम स्थान पर चाहता हूं, मैं उलझन में हूं कि मैं अपनी कक्षाओं और फाइलों को कैसे तैयार करूं?

यदि हम इस विचार का पालन करते हैं कि हमारे पास एक फ़ाइल तक सीमित कक्षाएं होनी चाहिए और वे फाइलें एक फ़ोल्डर संरचना में होनी चाहिए जो नेमस्पेस पदानुक्रम का प्रतिनिधित्व करती हैं और यह कि फ़ाइल का नाम वर्ग के नाम से मेल खाना चाहिए, तो मैं इस स्थिति से कैसे निपटूं ?

क्या मैं सच में यहाँ पूछ रहा हूँ कि मैं क्या नाम रखना चाहिए है फ़ाइल जिसमें MyClass<T1>, और मैं क्या नाम रखना चाहिए फ़ाइल में शामिल है कि MyClass<T1, T2>? मैं यह नहीं पूछ रहा हूं कि टाइप मापदंडों के नाम क्या होने चाहिए।


हमें कुछ विशिष्ट उदाहरण दें जो समस्या का बेहतर विवरण देते हैं। आपके द्वारा दिए गए उदाहरण बहुत अधिक हैं ... erm, जेनेरिक। आपको "मेरी कक्षाओं और फ़ाइलों को संरचना और नाम कैसे दें" से क्या मतलब है?
रॉबर्ट हार्वे

Microsoft केवल एक नंबर को टाइप पैरामीटर से जोड़कर स्वयं ऐसा करता है। Tuple डॉक्स देखें: msdn.microsoft.com/en-us/library/…
पीट

@ पता: यह वास्तव में केवल टपल पर लागू होता है। Microsoft भी TKey, TValueसम्मेलन का उपयोग करता है । फंक का एक TResultप्रकार का पैरामीटर है। हालांकि मैं मानता हूँ कि आप उपयोग कर सकते हैं करते हैं T1, T2आदि अन्यथा की तरह विशिष्ट उपयोगों की जरूरत नहीं है कि इनपुट पैरामीटर के परिवर्तनशील के लिए TKeyऔर TValue
रॉबर्ट हार्वे

@RobertHarvey खैर, हाँ, लेकिन केवल एक वास्तविक कुंजी / मूल्य संग्रह के संदर्भ में जैसे कि एक शब्दकोश। किसी भी प्रकार की एक चर संख्या से मिलकर वे एक संख्या को जोड़ते हैं। यहाँ एक और उदाहरण है: msdn.microsoft.com/en-us/library/dd402872(v=vs.110).aspx
पीट

1
खैर, आपके संपादन ने कुछ टिप्पणियों को अप्रचलित कर दिया। :) आप सिर्फ एक ही भौतिक फ़ाइल में कक्षाएं क्यों नहीं रख सकते हैं? यदि वे इतने अलग हैं कि आपको उन्हें अलग-अलग फाइलों में रखने की आवश्यकता है, तो क्या आप हमें बता सकते हैं कि उन्हें क्या अलग बनाता है?
पीट

जवाबों:


14
MyGenericClass`1.cs
MyGenericClass`2.cs
MyGenericClass`3.cs

और इसी तरह, जहां बैकटिक के बाद की संख्या सामान्य प्रकार के मापदंडों की संख्या है। इस सम्मेलन का उपयोग Microsoft द्वारा किया जाता है।

वैकल्पिक रूप से, आप कुछ का उपयोग कर सकते हैं

MyGenericCollectionClass[TKey, TValue].cs

जो न केवल सामान्य प्रकार के मापदंडों की संख्या, बल्कि उनके विशिष्ट नामों को भी संरक्षित करता है। दी, यह कोण कोष्ठक को संरक्षित नहीं करता है, लेकिन हम जीवन में सब कुछ नहीं कर सकते जो हम चाहते हैं, क्या हम कर सकते हैं?


1
कंपाइलर आंतरिक रूप से जेनेरिक प्रकारों के नाम का प्रबंधन करता है, एक backtick और जेनेरिक मापदंडों की संख्या को जोड़ता है क्योंकि .NET एक ही नाम के साथ कई प्रकारों को जेनेरिक मापदंडों की भिन्न संख्या के साथ अनुमति नहीं देता है लेकिन C # करता है। तो फ़ाइल नामकरण सम्मेलन मेल खाता है कि कंपाइलर क्या करता है।
कोडइन्चोस

1
मैं आपको गलत साबित करना चाहता था, लेकिन वास्तव में आप सही हैं: github.com/dotnet/corefx/tree/master/src/… मुझे यह सम्मेलन पसंद नहीं है।
डेन

1
@, ऐसा लगता है कि अब उन्हें उस सम्मेलन से पछतावा हुआ है। शायद यह कुछ समस्या निहित है? github.com/dotnet/corefx/commit/…
सैम

@Sam उम्मीद है, Microsoft टीमों के बीच संचार समस्या नहीं है। क्योंकि और कोई नहीं कर रहा है। इसके अलावा यह कंपाइलर टीम के लिए है, मेरी राय में फैसला करने के लिए लाइब्रेरी टीम नहीं।
डेन

मेरे पास फ़ाइल नाम में "` "का उपयोग करने के लिए गेंदें नहीं हैं।
क्रिस्टियन ई।

4

के मामले में Tupleऔर Actionहै कि पीट उल्लेख किया है, माइक्रोसॉफ्ट के लिए खुद को एक एकल फाइल का उपयोग करें - देख Tuple.cs और Action.cs

मुझे लगता है कि यह आंशिक रूप से इस बात पर निर्भर करता है कि सभी वर्गों के लिए कार्यक्षमता मूल रूप से समान है या नहीं। व्यक्तिगत रूप से मैं एक ही फाइल में lumping वर्गों को नापसंद करता हूं, लेकिन यह एक अपवाद हो सकता है। स्रोत कोड में जहां मैं काम करता हूं, मैंने एक ऑटोजेनरेटेड (टी 4 का उपयोग करके) NamedTupleवर्ग जोड़ा, जो उसी तरह से काम करता है Tuple, लेकिन कंस्ट्रक्टर में पहले तर्क के रूप में एक स्ट्रिंग नाम के साथ।

अपने प्रश्न का उत्तर देने के लिए, यदि आप एक भी फ़ाइल का उपयोग नहीं करना चाहते हैं, तो शायद MyClass_1.cs के लिए MyClass<T1>, MyClass_2.cs MyClass<T1, T2>, आदि का उपयोग करें ।

हालांकि, न तो विकल्प आदर्श है, इसलिए मैं "Microsoft इसे इस तरह से, इसलिए ..." का सुझाव देने के लिए इच्छुक होगा।


2
Tupleऔर Actionसभी प्रतिनिधि हैं; उनके पास कोई क्रियान्वयन कोड नहीं है, इसलिए सभी भिन्नताओं को अलग-अलग फ़ाइलों में रखना थोड़े निरर्थक होगा। बस यह साबित करता है कि हर नियम में एक अपवाद है।
रॉबर्ट हार्वे

आम तौर पर एक ही फ़ाइल में कई सार्वजनिक प्रतिनिधियों को डालने को ठीक माना जाता है (बशर्ते वे संबंधित हों)।
स्टीफन

1
@ रोबर्टहाइवे, Tupleएक प्रतिनिधि नहीं है, लेकिन प्रत्येक कार्यान्वयन वैसे भी कम है।
आर्टुरो टॉरेस सैंचेज़

@ ArturoTorresSánchez: ठीक है, मैं सोच रहा था Func
रॉबर्ट हार्वे

0

क्या आपने अपने आप से पूछा है, यदि कक्षाएं वास्तव में एक ही इरादा रखती हैं? यदि एक वर्ग दूसरे की तुलना में अधिक सामान्य है, तो यह एक जेनेरिकक्लास , एक मोरजेनिकक्लास और मोस्टजेनिकक्लास होगा । कल्पना करें कि कक्षा का प्रत्येक प्रकार का पैरामीटर वर्ग में एक नया आयाम जोड़ता है, इसलिए यह पूछने में मदद कर सकता है कि यह किस आयाम का है।

चलो यह उदाहरण लेते हैं:

  • Container<Thing>
  • MetricContainer<Thing, Metric>
  • MetricTransportableContainer<Thing, Metric, Transport>

मुझे पता है, कि यह सबसे अच्छा उदाहरण नहीं है, लेकिन तीन आयामों को दिखाने के लिए बहुत स्पष्ट है:

  • आंतरिक आयाम, यह क्या लोड कर सकता है
  • मीट्रिक आयाम, जिसके साथ मीट्रिक को लोड किया जा सकता है, केवल चीजों की गिनती या वर्ग उपाय या क्यूबिकल क्षमता द्वारा या वजन के आधार पर
  • बाहरी आयाम, जहां इसे लोड किया जा सकता है।

तो आप कारों का परिवहन मॉडल कर सकते हैं:

Container<Cars>
MetricContainer<Cars, CountMetric>
MetricTransportableContainer<Cars, CountMetric, Ship>

तरल पदार्थों का परिवहन:

Container<Fluid>
MetricContainer<Fluid, Volume>
MetricTransportableContainer<Fluid, Volume, Shelf>

ऊर्जा का परिवहन:

Container<Energy>
MetricContainer<Energy, ElectricPower>
MetricTransportableContainer<Energy, ElectricPower, Box>

चीनी, अनाज का परिवहन:

Container<CrumblyMaterial>
MetricContainer<CrumblyMaterial, Weight>
MetricTransportableContainer<CrumblyMaterial, Weight, Silo>

ओह, क्या आश्चर्य की बात है: List<T>एक आयाम है जो उन चीजों का प्रतिनिधित्व करता है जिन्हें सूची रोक सकती है; और यह Map<T, S>दो आयामों के साथ है जो उन चीजों का प्रतिनिधित्व करते हैं जो मानचित्र पकड़ सकता है और पहुंच कुंजी।


1
मुझे नहीं लगता कि आपने प्रश्न को समझा। प्रश्न के अंतिम पैराग्राफ को देखें।
रॉबर्ट हार्वे

1
@RobertHarvey कृपया प्रश्न को ध्यान से पढ़ें: क्लासनाम फ़ाइल नाम के लिए जलीय होना चाहिए। यह एक जगह है। समस्या वर्ग के गलत विश्लेषण और सामान्य रूप से सामान्य वर्गों के गलत नामकरण में निहित है। मेरे जवाब को सम्‍मिलित करने के लिए: "इसका नाम बताइए कि यह क्या है और क्या नहीं है।"
शर्लिनक्स


1
@RobertHarvey मेरा उत्तर पढ़ें: एक कक्षा को एक फ़ाइल में रखें!
शर्लिनक्स

1
मुझे लगता है कि आप इस बिंदु को याद कर रहे हैं। प्रश्न पूछता: मैं कैसे रख सकता हूं Tuple<T1>, Tuple<T1, T2>और Tuple<T1, T2, T3>नाम संघर्ष के बिना एक मानक तरीके से अलग सीएस फ़ाइलों में,?
रॉबर्ट हार्वे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.