क्या # भाग एक एंटीपैटर्न या कोड गंध हैं?


264

सी # संपादक में कोड के क्षेत्रों को बनाने के लिए #region/ #endregionकीवर्ड के उपयोग की अनुमति देता है । जब भी मैं ऐसा करता हूं, हालांकि मैं कोड के बड़े हिस्से को छिपाने के लिए करता हूं जो शायद अन्य वर्गों या विधियों में फिर से बनाए जा सकते हैं। उदाहरण के लिए, मैंने ऐसे तरीके देखे हैं जिनमें कोड की 500 लाइनें 3 या 4 क्षेत्रों के साथ हैं जो इसे प्रबंधनीय बनाते हैं।

तो क्या क्षेत्रों का विवेकपूर्ण उपयोग परेशानी का संकेत है? मुझे ऐसा लगता है।


9
FYI करें: CodeMap बहुत क्षेत्रों की जरूरतों को समाप्त करता है। visualstudiogallery.msdn.microsoft.com/… - क्लिक करें और यह आपको विधि / विशेषता / जो भी हो, पर ले जाता है। मैं हर दिन इसका उपयोग करता हूं और यह आश्चर्यजनक है कि आप उत्पादकता में और संज्ञानात्मक शब्दों में कितना लाभ प्राप्त करते हैं। आपको कक्षा का बहुत स्पष्ट 'पक्षी नेत्र दृश्य' मिलता है।

7
क्या कोई इसे विकी बना सकता है? इस सवाल का कोई सही या गलत जवाब नहीं है (अच्छी तरह से, कारण के भीतर), यह लगभग पूरी तरह से व्यक्तिपरक है।
एड एस।

6
जेफ अटवुड उनसे नफरत करता है । उनका तर्क है कि वे बुरे कोड को छिपाते हैं।
ब्रायन

3
कोड गंध एक डेवलपर है जो स्नान नहीं करता है और दुर्गन्ध का उपयोग नहीं करता है!
चिह्न

5
बदबूदार क्षेत्र में सावधानी से तैयार किए गए क्षेत्र, जो कि फ़िज़रिश के कुछ निचोड़ को एक क्रस्टी सोफे पर रखते हैं। जब तक आप इसे बदलने के लिए (समय) धन नहीं पाते, तब तक यह इसे धारण करने योग्य बनाता है।
न्यूटोपियन

जवाबों:


284

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

जबसे:

एक एंटी-पैटर्न (या एंटीपैटर्न) एक ऐसा पैटर्न है जो सामाजिक या व्यावसायिक संचालन या सॉफ्टवेयर इंजीनियरिंग में उपयोग किया जाता है जो आमतौर पर इस्तेमाल किया जा सकता है लेकिन व्यवहार में अप्रभावी और / या उल्टा होता है।

क्षेत्रों रहे हैं विरोधी पैटर्न। उन्हें अधिक कार्य की आवश्यकता होती है जो गुणवत्ता या कोड की पठनीयता को नहीं बढ़ाता है, जो बग की संख्या को कम नहीं करता है, और जो केवल कोड को रिफ्लेक्टर के लिए अधिक जटिल बना सकता है।

तरीकों के अंदर क्षेत्रों का उपयोग न करें; इसके बजाय रिफ्लेक्टर

तरीके छोटे होने चाहिए । यदि एक विधि में केवल दस लाइनें हैं, तो आप शायद अन्य पांच पर काम करते समय उनमें से पांच को छिपाने के लिए क्षेत्रों का उपयोग नहीं करेंगे।

इसके अलावा, प्रत्येक विधि को एक और एक ही काम करना चाहिए । दूसरी ओर, क्षेत्र अलग-अलग चीजों को अलग करने के लिए अभिप्रेत हैं । यदि आपका तरीका A करता है, तो B, दो क्षेत्रों को बनाना तर्कसंगत है, लेकिन यह एक गलत तरीका है; इसके बजाय, आपको विधि को दो अलग-अलग तरीकों में रिफ्लेक्टर करना चाहिए।

इस मामले में क्षेत्रों का उपयोग करना भी रिफैक्टिंग को और अधिक कठिन बना सकता है। आप कल्पना कीजिए:

private void DoSomething()
{
    var data = LoadData();
    #region Work with database
    var verification = VerifySomething();
    if (!verification)
    {
        throw new DataCorruptedException();
    }

    Do(data);
    DoSomethingElse(data);
    #endregion

    #region Audit
    var auditEngine = InitializeAuditEngine();
    auditEngine.Submit(data);
    #endregion
}

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

private void DoSomething()
{
    var data = LoadData();
    #region Work with database
    var verification = VerifySomething();
    var info = DoSomethingElse(data);

    if (verification)
    {
        Do(data);
    }

    #endregion

    #region Audit
    var auditEngine = InitializeAuditEngine(info);
    auditEngine.Submit(
        verification ? new AcceptedDataAudit(data) : new CorruptedDataAudit(data));
    #endregion
}

अब, क्षेत्रों का कोई मतलब नहीं है, और आप संभवतः पहले क्षेत्र में कोड को देखे बिना दूसरे क्षेत्र में कोड को पढ़ और समझ नहीं सकते हैं।

एक और मामला जो मुझे कभी-कभी दिखाई देता है, वह यह है:

public void DoSomething(string a, int b)
{
    #region Validation of arguments
    if (a == null)
    {
        throw new ArgumentNullException("a");
    }

    if (b <= 0)
    {
        throw new ArgumentOutOfScopeException("b", ...);
    }
    #endregion

    #region Do real work
    ...
    #endregion
}

यह उन क्षेत्रों का उपयोग करने के लिए ललचाता है जब तर्क सत्यापन LOC के दसियों पर शुरू होता है, लेकिन इस समस्या को हल करने का एक बेहतर तरीका है: .NET फ्रेमवर्क स्रोत कोड द्वारा उपयोग किया जाने वाला:

public void DoSomething(string a, int b)
{
    if (a == null)
    {
        throw new ArgumentNullException("a");
    }

    if (b <= 0)
    {
        throw new ArgumentOutOfScopeException("b", ...);
    }

    InternalDoSomething(a, b);
}

private void InternalDoSomething(string a, int b)
{
    ...
}

समूह से बाहर के क्षेत्रों का उपयोग न करें

  • कुछ लोग उन्हें फ़ील्ड्स, प्रॉपर्टीज़ आदि के साथ समूह बनाने के लिए उपयोग करते हैं यह दृष्टिकोण गलत है: यदि आपका कोड StyleCop-compliant है, तो फ़ील्ड्स, प्रॉपर्टीज़, प्राइवेट मेथड्स, कंस्ट्रक्टर्स इत्यादि पहले से ही एक साथ समूहीकृत और खोजने में आसान हैं। यदि ऐसा नहीं है, तो यह नियम लागू करने के बारे में सोचना शुरू करने का समय है जो आपके कोडबेस में एकरूपता सुनिश्चित करता है।

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

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

क्या क्षेत्रों के लिए एक अच्छा उपयोग है?

नहीं, एक विरासत उपयोग था: उत्पन्न कोड। फिर भी, कोड जेनरेशन टूल्स को केवल आंशिक कक्षाओं का उपयोग करना होगा। यदि C # में क्षेत्रों का समर्थन है, तो यह ज्यादातर इसलिए है क्योंकि यह विरासत उपयोग करती है, और क्योंकि अब बहुत सारे लोग अपने कोड में क्षेत्रों का उपयोग करते हैं, इसलिए उन्हें मौजूदा कोडबेस को तोड़े बिना उन्हें हटाना असंभव होगा।

के बारे में के रूप में इसके बारे में सोचो goto। तथ्य यह है कि भाषा या आईडीई एक सुविधा का समर्थन करता है इसका मतलब यह नहीं है कि इसका दैनिक उपयोग किया जाना चाहिए। StyleCop SA1124 नियम स्पष्ट है: आपको क्षेत्रों का उपयोग नहीं करना चाहिए। कभी नहीँ।

उदाहरण

मैं वर्तमान में अपने सहकर्मी के कोड की कोड समीक्षा कर रहा हूं। कोडबेस में बहुत सारे क्षेत्र होते हैं, और वास्तव में दोनों का एक आदर्श उदाहरण है कि कैसे क्षेत्रों का उपयोग न करें और क्यों क्षेत्र खराब कोड का नेतृत्व करते हैं। यहाँ कुछ उदाहरण हैं:

4 000 LOC राक्षस:

मैंने हाल ही में Programmers.SE पर कहीं पढ़ा है। जब किसी फ़ाइल में बहुत अधिक usings होते हैं ("अनयूज्ड यूज़िंग" कमांड को निष्पादित करने के बाद), तो यह एक अच्छा संकेत है कि इस फ़ाइल के अंदर की क्लास बहुत अधिक कर रही है। वही फ़ाइल के आकार पर लागू होता है।

कोड की समीक्षा करते समय, मैं एक 4 000 LOC फ़ाइल में आया था। ऐसा प्रतीत हुआ कि इस कोड के लेखक ने सैकड़ों बार एक ही 15-पंक्तियों की विधि को कॉपी-पेस्ट किया, चर के नामों और थोड़े विधि को बदलकर। एक साधारण रेगेक्स ने फ़ाइल को 4 000 LOC से 500 LOC तक ट्रिम करने की अनुमति दी, बस कुछ जेनरिक जोड़कर; मुझे पूरा यकीन है कि अधिक चतुर रीफैक्टरिंग के साथ, यह क्लास कुछ दर्जन लाइनों तक सिमट सकती है।

क्षेत्रों का उपयोग करके, लेखक ने खुद को इस तथ्य को अनदेखा करने के लिए प्रोत्साहित किया कि कोड को बनाए रखना और खराब तरीके से लिखा जाना असंभव है, और कोड को रिफ्लेक्टर के बजाय भारी नकल करना।

क्षेत्र "Do A", क्षेत्र "Do B":

एक अन्य उत्कृष्ट उदाहरण एक मॉन्स्टर इनिशियलाइज़ेशन मेथड था, जिसमें केवल टास्क 1 किया गया, फिर टास्क 2, फिर टास्क 3, आदि पाँच या छह कार्य थे जो पूरी तरह से स्वतंत्र थे, प्रत्येक एक कंटेनर क्लास में कुछ इनिशियलाइज़ कर रहा था। उन सभी कार्यों को एक विधि में वर्गीकृत किया गया था, और क्षेत्रों में समूहीकृत किया गया था।

इससे एक फायदा हुआ:

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

दूसरी ओर, मुद्दे कई थे:

  • यह स्पष्ट नहीं था कि क्या क्षेत्रों के बीच निर्भरता थी। उम्मीद है, चर का पुन: उपयोग नहीं किया गया था; अन्यथा, रखरखाव एक बुरा सपना भी हो सकता है।

  • विधि का परीक्षण करना लगभग असंभव था। आप आसानी से कैसे जान पाएंगे कि जिस विधि से एक समय में बीस चीजें होती हैं, उन्हें सही तरीके से करता है?

फ़ील्ड्स क्षेत्र, गुण क्षेत्र, निर्माता क्षेत्र:

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

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

एक और समस्या यह है कि यदि आप इसे हर जगह करते हैं, तो आप अपने आप को एक-ब्लॉक क्षेत्र बना पाएंगे, जिसका कोई मतलब नहीं है। यह वास्तव में मेरे द्वारा समीक्षा किए गए कोड में मामला था, जहां #region Constructorएक निर्माता के बहुत सारे थे ।

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


13
मुझे लगता है कि # ब्रेक्स के कम-से-कम कुछ उपयोग योग्य हैं - जैसे गार्ड क्लॉज का गिरना (इनपुट पैरामीटर्स की जांच करना), जो अनियंत्रित रह जाने पर, विधि के "या" मीट से अलग हो जाते हैं। एक और उदाहरण एपीआई सीमाओं पर अपवाद हैंडलिंग है; आप अक्सर अपवाद को लपेटने के लिए अन्य तरीकों को कॉल करके स्टैक ट्रेस को प्रभावित नहीं करना चाहते हैं, इसलिए आपके पास लपेटने और पुनर्विचार करने के लिए कोड की कई लाइनें हैं। यह भी अक्सर गैर-प्रासंगिक कोड होता है, और सुरक्षित रूप से ढह सकता है।
डैनियल बी

9
वास्तविकता की जांच। मैंने बहुत सारे अंतर-विधि # भाग देखे हैं जो मददगार थे। जब आप नेस्टेड कंट्रोल लॉजिक के साथ कई सौ लाइन मेथड को दर्जनों-सैकड़ों लाइनों के साथ w / में से कुछ में लगाते हैं - तो अच्छाई का धन्यवाद करें कि बेवकूफ को कम से कम क्षेत्रों में रखा जाए।
राडारबॉब 27'13

37
@ श्रंगार: संक्षेप में, क्षेत्र भद्दा कोड में सहायक होते हैं जो पहले स्थान पर मौजूद नहीं होना चाहिए।
आर्सेनी मूरज़ेंको

41
-1 (यदि मेरे पास प्रतिष्ठा थी)। यहां तक ​​कि अगर आपके प्रकार के सदस्य अच्छी तरह से संगठित और अलग हैं, तो उनमें से बहुत कुछ हो सकता है। क्षेत्र आपको पिछले 10 या 12 संपत्तियों और संबंधित गेटर्स को स्क्रॉल करने के लिए बचाते हैं और बस एक विधि को प्राप्त करने के लिए बस जाते हैं जिस पर आप काम करना चाहते हैं। एकमात्र विकल्प आपके सभी गुणों को व्यक्तिगत रूप से ध्वस्त करना है, जो कि ऐसा कुछ नहीं है जिसका मैं प्रशंसक हूं। बड़े पैमाने पर प्रदर्शन / छुपाने की कार्यक्षमता वाले क्षेत्र अत्यंत उपयोगी हैं। मैं हालांकि इंट्रा-विधि क्षेत्रों के बारे में सहमत हूं।
असद सईदुद्दीन

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

113

यह मेरे लिए अविश्वसनीय है कि कितने लोग इतने उत्साह से क्षेत्रों से नफरत करते हैं!

मैं उनकी बहुत सी आपत्तियों से पूरी तरह सहमत हूं: #regionइसे देखने से छिपाने के लिए कोड को शोव करना बुरी बात है। एक वर्ग को विभाजित #regionsकरना जब इसे अलग-अलग वर्गों में विभाजित किया जाना चाहिए स्पष्ट रूप से एक गलती है। #regionनिरर्थक अर्थ संबंधी जानकारी को एम्बेड करने के लिए उपयोग करना , ठीक है, निरर्थक।

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

अब जब मैंने C ++ में काम करने में अधिक समय बिताया है, तो Windows API से सीधे प्रोग्रामिंग करते हुए, मैं खुद को यह चाह रहा हूं कि क्षेत्रों का समर्थन उतना ही अच्छा हो जितना कि C # के लिए है। आप तर्क दे सकते हैं कि एक वैकल्पिक GUI लाइब्रेरी का उपयोग करने से मेरा कोड सरल या स्पष्ट हो जाएगा, इस प्रकार स्क्रीन से अप्रासंगिक कोड शोर प्राप्त करने की आवश्यकता समाप्त हो जाएगी, लेकिन मेरे पास ऐसा नहीं करने के लिए अन्य कारण हैं। मैं अपने कीबोर्ड और IDE के साथ पर्याप्त रूप से प्रवीण हूं जो कि क्षेत्रों में विभाजित किए गए कोड का विस्तार / पतन दूसरे के एक अंश से कम लेता है। जिस समय मैं ब्रेनपावर में बचत करता हूं, अपने सचेत फोकस को केवल उस कोड तक सीमित करने की कोशिश करता हूं, जिस पर मैं वर्तमान में काम कर रहा हूं, इसके लायक इससे अधिक है। यह सब एक ही वर्ग / फ़ाइल में है, लेकिन यह सब एक ही समय में मेरी स्क्रीन पर नहीं है।

मुद्दा यह है कि #regionsअपने कोड को अलग और तार्किक रूप से विभाजित करने के लिए उपयोग करना हर कीमत पर टाला जाना बुरी बात नहीं है। जैसा कि एड बताते हैं, यह "कोड गंध" नहीं है। यदि आपका कोड बदबू आ रही है, तो आप सुनिश्चित कर सकते हैं कि यह उन क्षेत्रों से नहीं आ रहा है, बल्कि आपने जो भी कोड उन क्षेत्रों में दफनाने की कोशिश की है। यदि कोई विशेषता आपको अधिक संगठित होने में मदद करती है, या बेहतर कोड लिखती है, तो मैं कहता हूं कि इसका उपयोग करें । यदि यह बाधा बन जाता है, या आप इसे गलत तरीके से उपयोग करते हुए पाते हैं, तो इसका उपयोग करना बंद कर दें। यदि सबसे खराब सबसे खराब आता है, और आप ऐसे लोगों के साथ एक टीम पर काम करने के लिए मजबूर हैं जो इसका उपयोग करते हैं, तो कोड शॉर्टकट को बंद करने के लिए कीबोर्ड शॉर्टकट याद रखें: Ctrl+ M, Ctrl+P। और शिकायत करना बंद करो। कभी-कभी मुझे यह महसूस होता है कि यह एक और तरीका है जो उन लोगों को "सच", "कट्टर" प्रोग्रामर के रूप में देखना चाहते हैं जो खुद को आजमाना चाहते हैं। आप वाक्यविन्यास रंग से परहेज कर रहे हैं से बेहतर क्षेत्रों से परहेज नहीं कर रहे हैं। यह आपको अधिक माचो डेवलपर नहीं बनाता है।

कहा जा रहा है कि सभी, एक विधि के भीतर के क्षेत्र सिर्फ सरासर बकवास हैं। जब भी आप ऐसा करना चाहते हैं, तो आपको एक अलग विधि में परावर्तन करना चाहिए। कोई बहना नहीं।


9
ख़ूब कहा है। संगठन के लिए क्षेत्रों का उपयोग आईडीई के "व्हॉट्सएप" विकल्प पर टॉगल करने से अधिक हानिकारक नहीं है। यह व्यक्तिगत प्राथमिकता है।
जोश

24
WPM पर ViewModels के साथ काम करना जिसमें 10 या 20 गुण हैं जो मेरे मॉडल पर गुणों को लपेटते हैं, मुझे क्षेत्रों से प्यार है - मैं बस उन गुणों को एक क्षेत्र में दूर कर सकता हूं (उन्हें कभी भी छुआ जाने की आवश्यकता नहीं है) और प्रासंगिक कोड पर अपनी आंखें रखें ।
कर्क ब्रॉडहर्स्ट

4
पूर्णतया सहमत। .NET 2.0 में, प्रॉपर्टीज लगभग 8-10 लाइन लंबी होती हैं। जब आपके पास एक वर्ग में 20 से अधिक गुण होते हैं, तो वे बहुत अधिक स्थान लेते हैं। क्षेत्र उन्हें ढहाने के लिए एकदम सही हैं।
क्रिस्टोफ क्लेस

6
@ क्रिस्तोफ: जैसा कि .NET 4.0 में गुण हैं जो सरल इनपुट सत्यापन करते हैं। स्वचालित गुण सिर्फ मेरे उद्देश्यों के लिए जादुई नहीं हैं।
कॉडी ग्रे

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

70

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

मुझे व्यक्तिगत रूप से बहुत सारे क्षेत्रों का उपयोग करना पसंद नहीं है। यह कोड पर प्राप्त करना कठिन बनाता है, और कोड वही है जो मुझे दिलचस्पी है। मुझे ऐसे क्षेत्र पसंद हैं जब मेरे पास कोड का एक बड़ा हिस्सा होता है जिसे बहुत बार छूने की आवश्यकता नहीं होती है। इसके अलावा वे बस मेरे रास्ते में आने लगते हैं, और "प्राइवेट मैथड्स", "पब्लिक मैथड्स" जैसे क्षेत्र, बस उन्हें पागल कर देते हैं। वे विविधता की टिप्पणियों के समान हैं i++ //increment i

मैं यह भी जोड़ूंगा कि क्षेत्रों का उपयोग वास्तव में एक "विरोधी पैटर्न" नहीं हो सकता है क्योंकि उस शब्द का उपयोग आमतौर पर प्रोग्राम लॉजिक / डिज़ाइन पैटर्न का वर्णन करने के लिए किया जाता है, न कि किसी टेक्स्ट एडिटर के लेआउट के लिए। यह व्यक्तिपरक है; आप के लिए क्या काम करता है का उपयोग करें। आपके क्षेत्रों के अति प्रयोग के कारण आप कभी भी एक अप्राप्य कार्यक्रम के साथ समाप्त नहीं होने जा रहे हैं, जो कि सभी विरोधी पैटर्न के बारे में है। :)


2
आम तौर पर मैं आपको कोड गंध टिप्पणी के लिए नीचा दिखाऊंगा, लेकिन इस मामले में यह बिल्कुल सटीक है। गैर-कोड एक कोड गंध नहीं हो सकता है। +2!

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

13
मुझे यकीन नहीं है कि मैं कोड के बारे में आपकी टिप्पणी को समझता हूँ। कोड की बदबू यह नहीं बताती है कि समस्या है, बस समस्या हो सकती है।
क्रेग

7
शब्द कोड गंध के लिए खड़े होने के लिए +1। जब मैं एक पोस्ट को देख रहा था, तो मैं तंग आ गया था कि निजी तरीके एक कोड गंध थे। लेकिन कुल मिलाकर मैं क्षेत्रों के लिए आपकी अरुचि से असहमत हूं। मैं आसानी से विचलित हो रहा हूं। वास्तव में मुझे यह अच्छा लगेगा अगर VS में VB4 मोड था जहां आप एक बार में केवल एक ही विधि प्रदर्शित कर सकते थे।
जोश

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

23

हाँ क्षेत्र एक कोड गंध हैं!

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

क्या आप एक उदाहरण के बारे में सोच सकते हैं जहां आप "गीज़, काश मेरे सहयोगी ने यहां कुछ क्षेत्रों का उपयोग किया हो!"।

भले ही मैं अपनी आईडीई को उन सभी क्षेत्रों में स्वचालित रूप से विस्तारित करने के लिए कॉन्फ़िगर कर सकता हूं जो अभी भी एक आंख-गले हैं और वास्तविक कोड को पढ़ने से रोकते हैं।

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

वेलुलेसिंग ग्रूमिंग!

इसके अतिरिक्त यदि आपकी फ़ाइल की जरूरत है और क्षेत्रों के उपयोग के माध्यम से 'सूचना वास्तुकला' आप मुख्य समस्या का सामना करना चाहते हैं: आपकी कक्षा बहुत बड़ी है! इसे छोटे हिस्सों में तोड़ना ज्यादा फायदेमंद होता है और जब सही तरीके से किया जाता है, तो सही शब्दार्थ / पठनीयता जुड़ जाती है।


संकलक का # भाग क्या हैं? मुझे लगा कि वे सिर्फ आईडीई के लिए एक निर्देश थे जिसे अनदेखा किया जा सकता है।
स्टीव राकुट्स

2
कंपाइलर को आपके C # कोड को पार्स करते समय उन्हें अनदेखा करना होगा। अगर यह उन्हें अनदेखा नहीं करता है तो यह उन पर फेंक देगा। मेरा मतलब है कि इस तरह से।
जॉपी

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

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

15

मैं व्यक्तिगत रूप से विभिन्न प्रकार के तरीकों या कोड के कुछ हिस्सों को एक साथ समूहित करने के तरीके के रूप में क्षेत्रों का उपयोग करता हूं।

तो एक कोड फ़ाइल इसे खोलने पर इस तरह दिख सकती है:

  • सार्वजनिक गुण
  • कंस्ट्रक्टर्स
  • तरीके सहेजें
  • तरीके संपादित करें
  • निजी हेल्पर के तरीके

मैं क्षेत्रों को विधियों के अंदर नहीं रखता हूं। IMHO जो कोड गंध का संकेत है। मैं एक बार एक ऐसी विधि के पार आया था जो 1200 से अधिक लंबी थी और इसमें 5 अलग-अलग क्षेत्र थे। यह एक डरावना दृश्य था!

यदि आप इसे अपने कोड को एक तरह से व्यवस्थित करने के तरीके के रूप में उपयोग कर रहे हैं जो अन्य देवों के लिए तेजी से चीजों को ढूंढना होगा, तो मुझे नहीं लगता कि यह परेशानी का संकेत है। यदि आप किसी विधि के अंदर कोड की पंक्तियों को छिपाने के लिए इसका उपयोग कर रहे हैं, तो मैं कहूंगा कि यह उस विधि पर पुनर्विचार करने का समय है।


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

3
@ ईडी एस - इसीलिए मैंने कहा कि "जैसा दिख सकता है"। यह बहुत व्यक्तिपरक है। मैं यह नहीं कह रहा हूं कि हर फाइल को इस तरह दिखना चाहिए। मुझे आश्चर्य होगा अगर उन्होंने ऐसा किया। एक जटिल विषय पर सिर्फ एक उदाहरण। :)
तनिष्ठा

ओह मुझे पता है, जैसे मैंने कहा; यह व्यक्तिपरक है। आपके / आपकी टीम के लिए जो भी काम करता है। मेरे पास बस इस योजना के लिए है क्योंकि यह काम नहीं करता है (मेरे लिए), लेकिन मुझे एक परियोजना को बनाए रखना था जिसने यह किया। इसने मुझे पागल कर दिया।
एड।

3
@EdS। इसलिए अपने विकल्पों में बनाम जाएं और क्षेत्रों को बंद करें। समस्या सुलझ गयी।
एंडी

आपकी वस्तुओं में सहेजने के तरीके क्यों हैं? :(
TheCatWhisperer

10

#regionएक बहुत बड़े वर्ग को पठनीय बनाने के लिए ब्लॉक का उपयोग करना आमतौर पर एकल जिम्मेदारी सिद्धांत का उल्लंघन करने का संकेत है। यदि उनका उपयोग समूह व्यवहार के लिए किया जा रहा है, तो यह भी संभावना है कि वर्ग बहुत अधिक कर रहा है (एक बार फिर एसआरपी का उल्लंघन कर रहा है)।

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


5

यहाँ मुख्य शब्द "विवेकपूर्ण" है। ऐसे मामले की कल्पना करना कठिन है जहां एक क्षेत्र को एक विधि के अंदर रखना विवेकपूर्ण है; यह सब कोड छिपाना और आलस्य होने की संभावना है। हालाँकि, कुछ क्षेत्रों के यहाँ और किसी के कोड में होने के अच्छे कारण हो सकते हैं।

यदि बहुत सारे और बहुत सारे क्षेत्र हैं, तो मुझे लगता है कि एक कोड गंध है। क्षेत्र अक्सर भविष्य के रीफैक्टरिंग के लिए एक संभावित स्थान पर संकेत होते हैं। बहुत सारे क्षेत्रों का अर्थ है कि कोई वास्तव में कभी संकेत नहीं ले रहा है।

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

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

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


4

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

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

मेरे अनुभव में, एक कोड के सैकड़ों के साथ एक विधि निश्चित रूप से एक गंध है।


4

अंगूठे का मेरा नियम है: यदि आपके पास फ़ाइल में 5 से अधिक क्षेत्र हैं तो यह कोड गंध है

Ie, यह क्षेत्र, विधियों, गुणों और निर्माणकर्ताओं को परिसीमित करने के लिए ठीक हो सकता है, लेकिन यदि आप इस क्षेत्र में हर दूसरी विधि को लपेटना शुरू कर रहे हैं तो यह कुछ गंभीर है

..और हां, मैं बहुत से प्रोजेक्ट्स पर गया हूं, जहां अक्सर ऐसा होता है, अक्सर खराब कोडिंग मानकों, कोड जनरेशन या दोनों के कारण। यह दृश्य स्टूडियो में सभी रूपरेखा को टॉगल करने के लिए कोड का एक अच्छा अवलोकन प्राप्त करने के लिए पुराना उपवास करता है।


4

उनका उपयोग क्या है

मैंने उन्हें व्यक्तिगत रूप से "हैंड कोडिंग" इंटरफ़ेस इवेंट्स के लिए उपयोग किया है, इससे पहले कि विंडोज़ फॉर्म ऐप के लिए।

हालाँकि, मेरे काम में हम SQL को संभालने के लिए एक कोड जनरेटर का उपयोग करते हैं और यह स्वचालित रूप से क्षेत्रों का उपयोग अपने चयन, अपडेट, डिलीट, आदि प्रकार के तरीकों को सॉर्ट करने के लिए करता है।

इसलिए जब मैं उनका अक्सर उपयोग नहीं करता, तो वे कोड के बड़े हिस्से को हटाने के लिए पूरी तरह से ठीक होते हैं।


1
मैंने समान कोड जनरेटर का उपयोग किया है और उत्पन्न कोड को हटाने के लिए आंशिक कक्षाओं का उपयोग करना पसंद करता हूं।
क्रेग

हम करते हैं, क्षेत्र उत्पन्न कोड के अंदर होते हैं ताकि यह पढ़ने या डिबग करने के लिए आसान हो (यदि आवश्यक हो)।
केन

4

आप क्षेत्रों है, तो में कोड आप निश्चित रूप से एक समस्या (उत्पन्न कोड के मामले को छोड़कर।) कोड में क्षेत्रों लाना मूल रूप से कह रहा है है "इस refactor।"

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


1
यह एक अलग वर्ग के लिए एक बेहतर उपयोग मामला है जो एक अलग फ़ाइल में संग्रहीत है, या शायद हार्डकोडेडटाटा सोर्स कार्यान्वयन के साथ एक इंजेक्शन वाले IMDDataSource।
ब्रायन बोएचर

3

हाल ही में एक परियोजना पर, 1700 लाइन पद्धति थी जिसमें कई क्षेत्रों को एम्बेडेड किया गया था। दिलचस्प बात यह है कि क्षेत्रों ने अलग-अलग कार्यों का सीमांकन किया जो विधि के भीतर किए जा रहे थे। मैं कोड की कार्यक्षमता को प्रभावित किए बिना प्रत्येक क्षेत्र पर एक रिफैक्टर -> निकालने की विधि करने में सक्षम था।

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


3

क्या क्षेत्रों का उपयोग कोड में किया जा सकता है जो अच्छी गुणवत्ता है? शायद। मुझे यकीन है कि वे कई मामलों में हैं। हालांकि, मेरा व्यक्तिगत अनुभव मुझे बहुत संदिग्ध लगता है - मैंने क्षेत्रों को लगभग विशेष रूप से दुरुपयोग देखा है। मैं कहता हूँ कि मैं निराश हूँ, लेकिन अभी भी आशावादी हूँ।

मैं उस क्षेत्र-उपयोग कोड को मोटे तौर पर विभाजित कर सकता हूं जिसे मैंने तीन श्रेणियों में देखा है:

  • पूरी तरह से फैक्टरेड कोड: मैंने जो कोड देखे हैं उनमें से अधिकांश क्षेत्रों को एक गरीब-आदमी के फैक्टरिंग टूल के रूप में उपयोग करता है। उदाहरण के लिए, एक वर्ग जो उस बिंदु तक बढ़ गया है, जहां विभिन्न उद्देश्यों के लिए इसे विशेषज्ञ बनाने के लिए समझ में आता है, इसके बजाय अलग-अलग क्षेत्रों में विभाजित किया जा सकता है, प्रत्येक उद्देश्य के लिए एक।

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

  • छात्रों या हाल के स्नातकों द्वारा लिखित कोड। कुछ कार्यक्रम और पाठ्यक्रम सभी प्रकार के अजीब उद्देश्यों के लिए क्षेत्रों के उपयोग के साथ छात्रों को प्रयास करने और विकसित करने के लिए लगते हैं। आप स्रोत कोड को उस बिंदु पर लेटते हुए देखेंगे जहां पर कोड की लाइनों के लिए क्षेत्र टैग का अनुपात 1: 5 या उससे अधिक की सीमा में है।


3

मैं कहूंगा कि यह एक "कोड गंध है।"

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


@Andrew ग्रिम: हाँ
whatsisname

3

मैं केवल एक चीज के लिए क्षेत्रों का उपयोग करता हूं (कम से कम मैं उन अन्य स्थानों के बारे में नहीं सोच सकता जो मैं उनका उपयोग करता हूं): एक विधि के लिए समूह इकाई परीक्षणों के लिए।

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

मैंने अतीत में कोड को व्यवस्थित करने के लिए क्षेत्रों का उपयोग किया हो सकता है, लेकिन मुझे पिछली बार याद नहीं था कि मैंने ऐसा किया था। मैं हालांकि इकाई परीक्षण कक्षाओं में अपने क्षेत्रों में रहता हूं।


1
क्या आपके पास कभी ऐसे परीक्षण हैं जो एक से अधिक तरीकों का परीक्षण करते हैं?
मार्की

मैं वास्तव में सवाल नहीं समझ रहा हूँ या आप इसे क्या लक्ष्य बना रहे हैं। इसका उत्तर है: नहीं, एक इकाई परीक्षण हमेशा केवल एक विधि या एक विधि के एक निश्चित पहलू पर लक्षित होता है।
ऐनी शूसेलर

2

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

यह प्लगइन वास्तव में छोटे क्षेत्रों के फ़ॉन्ट आकार को अधिकतम करेगा। इनका विस्तार भी किया जाएगा ताकि आपको सभी क्षेत्रों को खोलने के लिए ctr + m + l को हिट न करना पड़े। यह कोड कैंसर के इस रूप को ठीक नहीं करता है लेकिन यह इसे सहने योग्य बनाता है।


0

मैं दृश्यता और सदस्य प्रकार के प्रत्येक संयोजन को शामिल करने के लिए क्षेत्रों का उपयोग करता हूं। तो सभी निजी कार्य एक क्षेत्र में जाते हैं, आदि।

ऐसा करने का कारण यह नहीं है कि मैं कोड को मोड़ सकता हूं। ऐसा इसलिए है क्योंकि मेरे पास मेरे संपादक की स्क्रिप्टिंग है, इसलिए मैं एक प्रॉक्सी का संदर्भ डाल सकता हूं, कह सकता हूं:

#region "private_static_members"
 /// <summary>
 /// cache for LauncherProxy
 /// </summary>
private static LauncherProxy _launcherProxy;
#endregion

#region "protected_const_properties"
protected LauncherProxy LauncherProxy{
  get{
    if(_launcherProxy==null) {
      if (!God.Iam.HasProxy(LauncherProxy.NAME)) {
        God.Iam.RegisterProxy(new LauncherProxy());
      }
      _launcherProxy=God.Iam.Proxy(LauncherProxy.NAME) as LauncherProxy;
    }
    return _launcherProxy;
  }
}
#endregion

कोड में और प्रत्येक भाग को बड़े करीने से उचित क्षेत्र में रखा गया है।

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

C # सीखने की शुरुआत में मैंने क्षेत्रों के उपयोग को एक साथ समानता रखने के लिए माना था, लेकिन यह एक हिट और मिस प्रस्ताव है क्योंकि इसका हर समय एक-से-एक संबंध नहीं है। जो दो क्षेत्रों में इस्तेमाल होने वाले सदस्य पर झल्लाहट करना चाहता है, या यहाँ तक कि उन शर्तों पर चीजों को तोड़ना शुरू कर देता है।

केवल अन्य प्रकार के पृथक्करण के तरीके हैं- मैं कमांड, फंक्शंस और हैंडलर में तरीकों को तोड़ दूंगा, इसलिए मेरे पास सार्वजनिक, निजी, आदि कमांड्स, आदि के लिए एक क्षेत्र होगा।

यह मुझे ग्रैन्युलैरिटी देता है, लेकिन यह सुसंगत, असमान ग्रैन्युलैरिटी है जिस पर मैं भरोसा कर सकता हूं।


-1 जैसे ही मुझे नीचा दिखाने के लिए 125 अंक मिलते हैं। आप कोड की अनावश्यक लाइनें जोड़ रहे हैं। तुम क्यों एक संपत्ति के आसपास एक क्षेत्र में डाल दिया जाएगा ... अगर (भगवान। ई। ए। मनोरंजक () == सच) myName = "मार्क"
डेडली कैमर्स

1
@DeadlyChambers इसका कारण दूसरे पैराग्राफ में बताया गया है - मैं फ़ाइल में कॉमन कोड पैटर्न इंजेक्ट करने के लिए एडिटर मैक्रोज़ का उपयोग कर रहा हूं, रीजन फाइल को स्ट्रक्चर्ड रखने में मदद करते हैं ताकि समान आइटम्स को ग्रुप किया जाए। मैं एक क्षेत्र को एक विलक्षण संपत्ति के आसपास नहीं डाल रहा हूं, लेकिन सभी गुण एक निर्दिष्ट क्षेत्र में उनके गुणों "रक्षित_संबंधी_प्रक्रिया" के आधार पर आते हैं। क्या आपने पोस्ट पढ़ी ??
मार्क

1
आप शायद इस बात का खंडन कर सकते हैं: संरक्षित लॉन्चरप्रॉक्सी लॉन्चरपॉक्सी => गॉड.आम.गेटऑरऑडप्रॉक्सी <लॉन्चरप्रॉक्सि> (रेफ _launcherProxy); और इस प्रकार अब आपको क्षेत्र की आवश्यकता नहीं है। इसके अलावा _launcherProxy का नाम बदलकर _launcherProxyCache किया जा सकता है ताकि आपको क्षेत्र की आवश्यकता न हो और न ही वहां टिप्पणी करें।
एरोसन

0

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


0

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

क्षेत्र ऑब्जेक्ट-ओरिएंटेड कोड, IMO के बजाय कार्यात्मक कोड में अधिक उद्देश्य रखते हैं, जहां आपके पास अनुक्रमिक डेटा के लंबे कार्य हैं जो इसे तोड़ने के लिए समझ में आता है, लेकिन कई बार मैं व्यक्तिगत रूप से उन्हें c # में उपयोग किया है, और वे लगभग हमेशा उस कोड पर ध्यान केंद्रित करें जिसे आपको देखने की जरूरत नहीं है / देखना चाहते हैं। मेरे लिए, ये आमतौर पर एनपीको या इसके वेरिएंट के लिए उपयोग किए जाने वाले कोड बेस में कच्चे एसक्यूएल स्ट्रिंग स्थिरांक थे। जब तक आप वास्तव में परवाह नहीं करते हैं कि डेटा आपके ORM के माध्यम से POCO ऑब्जेक्ट को कैसे भरने के लिए आता है, तो ये देखने के लिए पूरी तरह से व्यर्थ थे ... और अगर आपने देखभाल की, तो हे, बस क्षेत्र और BAM का विस्तार करें ! आपके देखने के आनंद के लिए कुछ जटिल SQL क्वेरी की 150+ लाइनें।

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