সি # তে কীভাবে 'গ্লোবাল' ভেরিয়েবলগুলি encapsulate করা যায়? /ভাল অভ্যাস


9

সি # তে আমার একাধিক পদ্ধতিতে ভেরিয়েবলগুলি এনক্যাপসুলেট করার জন্য সর্বোত্তম অনুশীলন কোনটি? এই দুটি পদ্ধতির উপরে কেবল আমার ক্লাসের শীর্ষে তাদের ঘোষণা করা কি ঠিক আছে?

এছাড়াও আমি যদি আমার কনফিগারেশন ফাইল থেকে অ্যাপ্লিকেশন সেটিংস ব্যবহার করছি তবে আমি কি একজন গেটার ব্যবহার করব? এটার মত...

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

সেরা অনুশীলন কি?


অতিরিক্ত (এবং সম্ভবত অপ্রয়োজনীয়) ইন্ডিরিশনের স্তর যুক্ত করা ছাড়া গেটারের উদ্দেশ্য কী হবে?
রবার্ট হার্ভে

4
একজন WebConfigurationManager.AppSettingsগ্রাহক একাধিক কল করার চেয়ে অনেক ভাল কারণ এটি পরে পরিবর্তন করা খুব সহজ
ড্যানিয়েল লিটল

@ লাভিনস্কি: অবশ্যই, আপনি যদি ভাবেন যে আপনি পরে কোনও অন্যটির জন্য ডেটা স্টোরটি সরিয়ে নিতে পারেন। অনুশীলনে, এটি খুব কমই ঘটে এবং অ্যাপসেটিংয়ের ক্ষেত্রে এটি হওয়ার সম্ভাবনা খুব কমই মনে হয়।
রবার্ট হার্ভে

10
"গেটার" এর সুবিধা রয়েছে যে এটি ইন্টেলিজেন্স কাজ করে - এবং আপনার কাছে "মাইসেটিং" কী স্ট্রিং রয়েছে (যা সংকলক দ্বারা এটি সঠিকভাবে লিখিত থাকলে চেক করা হয় না) কেবল এক জায়গায়।
ডক ব্রাউন

উত্তর:


5

এটা ঠিক আছে না। ক্লিন কোড বই অনুসারে এটি আসলে খুব ভাল অনুশীলন, এবং আঙ্কেল বব সত্যই এটি উত্সাহিত করে। অনেক পদ্ধতি দ্বারা ব্যবহৃত একটি পরিবর্তনশীল পদ্ধতিগুলির মধ্যে একটি উচ্চ ডিগ্রি সংহতি প্রদর্শন করতে পারে। তদুপরি, একটি উচ্চ ডিগ্রি অবজেক্ট ভেরিয়েবলগুলিও ইঙ্গিত দিতে পারে যে ক্লাসটি দুটি বিভক্ত হওয়া উচিত যাতে বস্তু ভেরিয়েবলগুলি আপনাকে গোপন শ্রেণীর প্রার্থী খুঁজে বের করতে সহায়তা করে as

অবজেক্ট লেভেল ভেরিয়েবলগুলি গ্লোবাল ভেরিয়েবল নয়, তাই তাদের যদি বিভিন্ন পদ্ধতিতে ভাগ করে নেওয়া উচিত তবে সেগুলি ব্যবহার করতে ভয় পাবেন না।


আপনার সহায়তার জন্য ধন্যবাদ, যদিও আমি মনে করি আপনি যখন সংহতি বলেছিলেন আপনি সত্যই মিলনকে বোঝাচ্ছেন।
ব্যবহারকারী 1944367

না, আমি সংহতি বোঝাতে চাইছি। সফটওয়্যার ইঞ্জিনিয়ারিং ক্লাসেও আমি উচ্চ সংহতির জন্য আকাঙ্ক্ষা বুঝতে খুব কঠিন সময় কাটিয়েছি। সাধারণত আমরা কম সংশ্লেষ এবং উচ্চ মিলনের পরে কামনা করি। কাপলিং একটি শারীরিক জিনিস যা আমরা আমাদের নিজস্ব পদ্ধতিতে দেখতে পারি। যদি কোনও শ্রেণি অন্য শ্রেণি ব্যবহার করে তবে তার সাথে এটি মিলিত। যদি এটি প্রকৃতপক্ষে তাত্পর্যপূর্ণ হয় এবং বলেন শ্রেণীর আপত্তি করে, তবে এটির সাথে এটি বেশ দম্পতি। যাইহোক, সংহতি একটি লজিকাল জিনিস। একটি শ্রেণিতে উচ্চ সংহতির অর্থ হল যে এর পদ্ধতিগুলি একটি খুব অনুরূপ ডোমেনের অন্তর্গত, এমনকি যদি তারা তাদের মধ্যে কোনও পরিবর্তনশীল ভাগ না করে।
উরি

কোনও অবজেক্ট ভেরিয়েবল ব্যবহার করে বিভিন্ন পদ্ধতির অর্থ এই নয় যে তারা একত্রে মিলিত হয়েছে। আমার পাসওয়ার্ড ভেরিয়েবলের সাথে একটি এনক্রিপ্টর ক্লাস থাকতে পারে এবং এনক্রিপ্ট (স্ট্রিং টেক্সট) থাকতে পারে; এবং ডিক্রিপ্ট (স্ট্রিং টেক্সট); এটির ভিতরে পদ্ধতিগুলি। উভয়েই একই পাসওয়ার্ড ভেরিয়েবল ব্যবহার করে তবে তাদের মধ্যে কোনও আপত্তিজনক মিল নেই। তবে আপনি লক্ষ্য করতে পারেন যে তারা একই ডোমেন নিয়ে কাজ করে এবং তা হ'ল পাঠ্য এনক্রিপশন। আমি যতদূর জানি, তাদের মধ্যে একত্রীকরণের উচ্চ ডিগ্রি রয়েছে, যদিও বলেছিলেন শ্রেণি দুটি বিভক্ত হতে পারে। যে কেউ তর্ক করতে পারে যে এনক্রিপশনটি ডিক্রিপশন ডোমেনের সাথে সম্পর্কিত নয়।
উরি

4

আপনার সেটিংসকে একটি ধ্রুবক পদ্ধতিতে আবদ্ধ করা একটি দুর্দান্ত ধারণা is

আমি যা করি সেটি সেটিংস ক্লাস তৈরি করা হয় হয় একটি স্থিতিশীল গ্লোবাল এক বা একাধিক উদাহরণ ক্লাস যা আমি তারপরে নির্ভরতা ইনজেকশন দিয়ে পরিচালনা করব। তারপরে আমি কনফিগারেশন থেকে সমস্ত সেটিংস শুরুতে ক্লাসে লোড করি।

আমি একটি ছোট লাইব্রেরিও লিখেছি যা এটি আরও সহজ করে তুলতে প্রতিবিম্বটি ব্যবহার করে।

একবার আমার সেটিংস আমার কনফিগার ফাইলে আসে

<?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] );

এর জন্য সমস্ত কোড https://github.com/Enexure/Enexure.Fire.Configration এ গিটহাবে রয়েছে

এমনকি একটি নুগেট প্যাকেজ রয়েছে:

প্রধানমন্ত্রী> ইনস্টল-প্যাকেজ সংযোজন.ফায়ার. কনফিগারেশন

রেফারেন্সের জন্য কোড:

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 );
                    }
                }
            }
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.