C # में 'ग्लोबल' वेरिएबल को कैसे एनकैप्सुलेट किया जाए? /सर्वश्रेष्ठ प्रणालियां


9

C # में कई विधियों में उपयोग किए जाने वाले वैरिएबल के लिए सबसे अच्छा अभ्यास क्या है? क्या केवल दो तरीकों से मेरी कक्षा के शीर्ष पर उन्हें घोषित करना ठीक है?

अगर मैं अपनी कॉन्फिग फाइल से ऐप सेटिंग्स का इस्तेमाल कर रहा हूं तो क्या मुझे गेट्टर का इस्तेमाल करना चाहिए? इस तरह...

private string mySetting{ get { return WebConfigurationManager.AppSettings["mySetting"]; } }

सबसे अच्छा अभ्यास क्या है?


अप्रत्यक्ष की एक अतिरिक्त (और शायद अनावश्यक) परत को जोड़ने के अलावा, एक गेट्टर का उद्देश्य क्या होगा?
रॉबर्ट हार्वे

4
एक कॉलटर कई कॉल्स की तुलना में बहुत बेहतर है WebConfigurationManager.AppSettingsक्योंकि बाद में बदलने के लिए यह बहुत आसान है
डैनियल लिटिल

@Lavinski: यकीन है, अगर आपको लगता है कि आप बाद में एक अलग के लिए डेटा स्टोर स्वैप कर सकते हैं। व्यवहार में, शायद ही कभी ऐसा होता है, और AppSettings के लिए यह हो सकता है कि संभावना गायब हो छोटा लगता है।
रॉबर्ट हार्वे

10
एक "गेट्टर" का यह फायदा है कि यह अंतर्मुखी काम करता है - और आपके पास कुंजी स्ट्रिंग "माइसेटिंग" है (जिसे कंपाइलर द्वारा चेक नहीं किया गया है यदि इसके सही ढंग से लिखा गया है) केवल एक ही स्थान पर है।
डॉक ब्राउन

जवाबों:


5

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

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


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

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

ऑब्जेक्ट चर का उपयोग करने वाले विभिन्न तरीकों का मतलब यह नहीं है कि वे एक साथ युग्मित हैं। मैं एक चर [] पासवर्ड चर के साथ एक Encrypter वर्ग हो सकता है, और Encrypt (स्ट्रिंग पाठ) है; और डिक्रिप्ट (स्ट्रिंग पाठ); इसके अंदर के तरीके। वे दोनों एक ही पासवर्ड चर का उपयोग करते हैं, लेकिन उनके बीच कोई स्पष्ट युग्मन नहीं है। हालाँकि, आप देख सकते हैं कि वे एक ही डोमेन के साथ काम करते हैं, और वह है, टेक्स्ट एन्क्रिप्शन। जहां तक ​​मुझे पता है, उनके पास उच्च स्तर का सामंजस्य है, हालांकि कहा गया है कि कक्षा दो में विभाजित की जा सकती है। कोई तर्क दे सकता है कि एन्क्रिप्शन डिक्रिप्शन के डोमेन से संबंधित नहीं है।
उरी

4

अपनी सेटिंग्स को लगातार तरीके से एनकैप्सुलेट करना एक बेहतरीन विचार है।

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

मैंने एक छोटी सी लाइब्रेरी भी लिखी है जो प्रतिबिंब का उपयोग इसे और भी आसान बनाने के लिए करती है।

एक बार मेरी सेटिंग्स मेरी कॉन्फिग फ़ाइल में हैं

<?xml version="1.0" encoding="utf-8" ?>
<configuration>   
    <appSettings>
        <add key="Domain" value="example.com" />
        <add key="PagingSize" value="30" />
        <add key="Invalid.C#.Identifier" value="test" />
    </appSettings>
</configuration>

मैं अपनी आवश्यकताओं के आधार पर एक स्थिर या उदाहरण वर्ग बनाता हूं। केवल कुछ सेटिंग्स के साथ सरल अनुप्रयोगों के लिए एक स्थिर वर्ग ठीक है।

private static class Settings
{
    public string Domain { get; set; }

    public int PagingSize { get; set; }

    [Named("Invalid.C#.Identifier")]
    public string ICID { get; set; }

}

फिर Inflate.Staticया तो मेरे पुस्तकालय कॉल का उपयोग कर या Inflate.Instanceशांत बात यह है कि मैं किसी भी महत्वपूर्ण मूल्य स्रोत का उपयोग कर सकता हूं।

using Fire.Configuration;

Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );

इसके लिए सभी कोड GitHub में https://github.com/Enexure/Enexure.Fire.Configuration पर है

यहां तक ​​कि एक नगेट पैकेज भी है:

PM> इंस्टॉल-पैकेज Enexure.Fire.Configuration

संदर्भ के लिए कोड:

using System;
using System.Linq;
using System.Reflection;
using Fire.Extensions;

namespace Fire.Configuration
{
    public static class Inflate
    {
        public static void Static( Type type, Func<string, string> dictionary )
        {
            Fill( null, type, dictionary );
        }

        public static void Instance( object instance, Func<string, string> dictionary )
        {
            Fill( instance, instance.GetType(), dictionary );
        }


        private static void Fill( object instance, Type type, Func<string, string> dictionary ) 
        {

            PropertyInfo[] properties;
            if (instance == null) {

                // Static
                properties = type.GetProperties( BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly );
            } else {

                // Instance
                properties = type.GetProperties( BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly );
            }

            // Get app settings and convert
            foreach (PropertyInfo property in properties) {
                var attributes = property.GetCustomAttributes( true );
                if (!attributes.Any( x => x is Ignore )) {

                    var named = attributes.FirstOrDefault( x => x is Named ) as Named;

                    var value = dictionary((named != null)? named.Name : property.Name);

                    object result;
                    if (ExtendConversion.ConvertTo(value, property.PropertyType, out result)) {
                        property.SetValue( instance, result, null );
                    }
                }
            }
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.