আমার প্রোগ্রামটি ব্যবহার করে এমন একটি গ্রুপের ধ্রুবক সঞ্চয় করার সর্বোত্তম উপায় কী? [বন্ধ]


98

আমার কাছে বিভিন্ন ধ্রুবক রয়েছে যা আমার প্রোগ্রামটি ব্যবহার করে ... string' intগুলি, double' গুলি, ইত্যাদি ... এগুলি সংরক্ষণ করার সর্বোত্তম উপায় কী? আমি মনে করি না যে আমি একটি চাই Enumকারণ ডেটা সব একই ধরণের নয় এবং আমি প্রতিটি মান নিজেই সেট করতে চাই। আমি কি খালি ক্লাসে সেগুলি সব সঞ্চয় করতে পারি? নাকি এর চেয়ে ভাল উপায় আছে?


18
যেভাবেই আপনি এটি চান - এটি আপনার প্রয়োজন মতো।
সান জ্যাকিন্টো

উত্তর:


136

আপনি সম্ভবত স্ট্যাটিক ক্লাসে স্থির পাঠযোগ্য বৈশিষ্ট্য সহ তাদের থাকতে পারেন।

public static class Routes
{
    public static string SignUp => "signup";
}

23
+1, তবে আরও ভাল যদি আপনি এটিকে স্থানীয়করণের জন্য কোনও উত্স ফাইল থেকে টানতে পারেন।
জোয়েল কোহর্ন

17
কিছুটা শব্দময় মনে হচ্ছে - স্ট্যাটিক রিডনলি স্ট্রিংগুলি কেন নয়?
খালি সেট

6
কেন কেবল পঠনযোগ্য এবং কনস্ট্যান্ট নয়? আপনি রানটাইমের সময় মান নির্ধারণ করছেন না, সুতরাং সেগুলি কেবল পঠনযোগ্য হওয়ার দরকার নেই।
ফিলিপ ওয়ালেস

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

13
শয়তানের উকিল হিসাবে আমার অবশ্যই উল্লেখ করতে হবে যে কনস্টের সাথে সুবিধাটি হ'ল আপনি এটি স্যুইচ ক্ষেত্রে ব্যবহার করতে পারেন।
আরভিমান

27

ধ্রুবক পূর্ণ ক্লাস ব্যবহার করা আইএমও ধ্রুবকদের জন্য ঠিক। যদি সেগুলি মাঝেমধ্যে পরিবর্তিত হয় তবে আমি আপনার কনফিগারেশন এবং এর পরিবর্তে কনফিগারেশনম্যানেজার ক্লাসে অ্যাপসেটিংগুলি ব্যবহার করার পরামর্শ দিচ্ছি।

যখন আমার কাছে "ধ্রুবকগুলি" থাকে যা আসলে অ্যাপসেটিংস বা অনুরূপ থেকে টানা হয় আমার তখনও সবসময় একটি "ধ্রুবক" বর্গ থাকবে যা কনফিগারেশন ম্যানেজারের কাছ থেকে পাঠকে আবৃত করে। সেটিংস মানটি বলতে চাইলে যে কোনও জায়গায় Constants.SomeModule.Settingসরাসরি আশ্রয় নেওয়ার পরিবর্তে এটি সর্বদা আরও অর্থবহ ConfigurationManager.AppSettings["SomeModule/Setting"]হয়।

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


4
কেবল এটি যুক্ত করার জন্য: কারণটি হ'ল আপনি যখন নির্মাণ করেন তখন অন্যান্য সমাবেশ থেকে ব্যবহৃত কনস্ট্যান্ট আপডেট হয় না। এর অর্থ হ'ল আপনার যদি অ্যাসেম্বলএ এবং অ্যাসেম্বলবি থাকে এবং বি এ থেকে একটি ধ্রুবক ব্যবহার করে তবে মানটি অনুলিপি করা হয়, উল্লেখ করা হয় না, তাই পুনর্নির্মাণ এ বি আপডেট করে না This এটি অদ্ভুত বাগগুলি হতে পারে।
ক্যামিলো মার্টিন

4
@ ক্যামিলোমার্টিন এটিকে পরিচালনা করার জন্য প্রচুর উপায়ে আপনার "ধ্রুবক" এড়াতে কেবল অচল পাঠ্যপুস্তককেই দেখতে পারা যায়, বা আমি যেমন বলেছি তারা যদি কনফিগারেশন ম্যানেজারটি ব্যবহার করার জন্য নীল চাঁদে একাধিকবার পরিবর্তিত হয়।
ক্রিস মেরিসিক

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

সমস্যা হল আপনি অন্যান্য সমাহারগুলি থেকে সমাবেশ এই রেফারেন্স, আপনি তাদের কনফিগ ফাইলে মান কপি করতে হবে হয়
symbiont

@ সিম্বিওন্ট আপনি তৃতীয় পক্ষের উপাদান হিসাবে শ্যাবারেবলির জন্য কনফিগার ফাইলগুলি এম্বেড করতে পারেন এবং তার পরিবর্তে ম্যানিফেস্টের বাইরে পড়তে পারেন
ক্রিস মেরিসিক

19

আমি যা করতে চাই তা হ'ল নিম্নলিখিত (তবে সঠিক ধরণের ধ্রুবকটি ব্যবহার করতে শেষে পড়তে ভুলবেন না ):

internal static class ColumnKeys
{
    internal const string Date = "Date";
    internal const string Value = "Value";
    ...
}

এই পড়ুন কেন জানতে constনাও হতে পারে কি আপনি চান। সম্ভাব্য ধরণের ধ্রুবকগুলি হ'ল :

  • constক্ষেত্র ভবিষ্যতে যদি মান পরিবর্তন হতে পারে তবে অ্যাসেম্বলি জুড়ে ব্যবহার করবেন না ( publicবা protected) কারণ এই অন্যান্য অ্যাসেমব্লিতে সংকলন সময়ে মানটি হার্ডকোড করা হবে। আপনি যদি মানটি পরিবর্তন করেন তবে পুরাতন মানটি অন্য সংঘগুলি পুনরায় সংকলন না করা অবধি ব্যবহার করবে।
  • static readonly ক্ষেত্র
  • static সম্পত্তি ছাড়া set

4
একাধিক সমাবেশে যদি কেবলমাত্র পাঠ্যই ব্যবহৃত হয়?
ফিলিপ ওয়ালেস

স্থির পাঠ্য কেন কনস্টের চেয়ে একাধিক সমাবেশে আরও ভাল কাজ করে?
ম্যাথু

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


11

এটি সেরা উপায় আইএমও। বৈশিষ্ট্যের প্রয়োজন নেই, বা কেবল পাঠযোগ্য:

public static class Constants
{
   public const string SomeConstant = "Some value";
}

9
আপনি যদি কনস্ট ব্যবহার করতে চলেছেন তবে কেবল অভ্যন্তরীণ হিসাবে প্রকাশ করুন। কনস্টিটকে সর্বজনীন করবেন না (এমনকি যদি আপনি মনে করেন যে আপনার সমাবেশগুলি আপনার সংস্থার বাহ্যিকভাবে ব্যবহৃত হবে না)। এছাড়াও বৈশিষ্ট্যগুলি আপনাকে আপনার ইন্টারফেসটিকে নতুন করে সংজ্ঞায়িত না করে ভবিষ্যতের প্রসারণের জন্য প্রোগ্রামেটিক নমনীয়তা দেয়।
সিএফডুক

4

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

অতিরিক্ত হিসাবে কিছু কিছু ধ্রুবকগুলির জন্য, স্বরলিপিটি বিবেচনা করুন:

[Flags]
enum Foo
{
}

এটি পতাকাগুলির মতো মানগুলির চিকিত্সা করার অনুমতি দেয় ।


"বেশ কয়েকটি ক্লাস ব্যবহার করার কথা বিবেচনা করুন, যাতে আপনি সম্পর্কিত ধ্রুবকের ভাল গোষ্ঠীগুলির সাথে সমাপ্ত হন, এবং একটি দৈত্যাকার গ্লোবালস.সি. ফাইল নয়" " আমি বিশ্বাস করি এটি সেরা প্রস্তাবনা, এর আশেপাশে কিছু নকশার ধরণগুলি নেই? আমি নাম দিয়ে কাউকে চিনি না, তাই না?
গ্রেগ

3

ওয়েবকনফিগ বা অ্যাপকনফিগ ব্যবহারের জন্য আর একটি ভোট। কনফিগারেশন ফাইলগুলি সংযোগের স্ট্রিং ইত্যাদির মতো ধ্রুবকগুলির জন্য একটি ভাল জায়গা etc. একটি স্ট্যাটিক ক্লাস যা একটি কনফিগ ফাইল থেকে এই ধ্রুবকগুলি পড়তে পারে এটি একটি ভাল আপস হতে পারে, কারণ এটি আপনার অ্যাপ্লিকেশনটিকে এই সংস্থানগুলিতে অ্যাক্সেস করতে দেবে যেমন তারা কোডে সংজ্ঞায়িত হয়েছিল, তবে তবুও আপনাকে সেগুলিকে সহজেই দেখা / সম্পাদনযোগ্যতে রাখার নমনীয়তা দেয় স্থান।


4
একটি সংযোগ স্ট্রিং একটি ধ্রুবক নয়, এটি একটি সেটিংস। এটি হতে পারে যে ওপিটির সত্যিকার অর্থে ধরণের চেয়ে বরং সেটিংসের অর্থও, তবে আমি এর কোনও প্রমাণ দেখতে পাচ্ছি না।
জন স্কিটি

আমি আলাদা করতে অনুরোধ। স্ট্রিং আক্ষরিক সংজ্ঞা অনুসারে ধ্রুবক হয়। একটি কনফিগার ফাইলে স্ট্রিং পরিবর্তন করা কোড ও পুনরায় সংশোধন করার সমতুল্য; হায় যে এটি একটি ধ্রুবক না? আমি তাই মনে করি না.
ডিভে

4
@ ডেভিড - সত্য নয় একটি সংকলক আপনার কনফিগার ফাইলে আপনার কী মান রাখবে তা বিবেচনা করে না - এটি রানটাইম পড়বে।
ফিলিপ ওয়ালেস

@ ফিলিপডব্লু আমি এটি বুঝতে পারি। আমার বক্তব্যটি ছিল (জন স্কিটির মন্তব্যের প্রতিক্রিয়া হিসাবে) একটি নির্দিষ্ট সংযোগ স্ট্রিং একটি ধ্রুবক, যেমন সমস্ত স্ট্রিং আক্ষরিক হয়। "ধ্রুবক" পরিবর্তিত হতে পারে - এই বিষয়টি কনফিগারেশন ফাইলটি সংশোধন করে, এবং আপনার অ্যাপ্লিকেশনটিকে উল্লিখিত কনফিগারেশন ফাইল থেকে নতুন মান টানতে, বা কোডটিতে আক্ষরিক পরিবর্তনের মাধ্যমে যা পুনরায় সংযোজন / মোতায়েনের প্রয়োজন হবে - তা নয় এটি একটি "সেটিং" করুন। স্ট্রিং নিজেই তার ধারক নির্বিশেষে ধ্রুবক। আমি আপনার মতামতটি বুঝতে পারি এবং এর সাথে একমত - আমি যা বলছিলাম তা এটি ছিল না।
ডিভে

4
আমার অভিজ্ঞতায় অপ্রত্যাশিত ভবিষ্যতের এক পর্যায়ে আপনার "ধ্রুবক" মানটি পরিবর্তন করতে হবে এমনকি আপনি যদি ভাবেন যে এটি এক মিলিয়ন বছরে কখনও হবে না। আমি মনে করি উত্স কোড পরিবর্তন করার চেয়ে একটি। কনফিগ ফাইলে এটি করা অনেক সহজ। সবকিছু শেষ পর্যন্ত একটি সেটিং হয়ে শেষ হয়।
নিনজাবম্ব

1

হ্যাঁ, static classধ্রুবক সংরক্ষণের জন্য একটি নির্দিষ্ট ধরণের সাথে সম্পর্কিত ধ্রুবক ছাড়া কেবলমাত্র জরিমানা হবে।


আমি ঠিক তাই করার চেষ্টা করছি আমি চাই তারা যে ক্লাসের তারা তাদের সদস্য হিসাবে প্রদর্শিত হবে। তবে আমি তাদের ক্লাসগুলিতে যুক্ত করতে চাই না কারণ আমি যে কোম্পানির জন্য কাজ করছি তার উপর নির্ভর করে ধ্রুবকগুলি পরিবর্তিত হয়। এক্সটেনশন ধ্রুবক বা বৈশিষ্ট্য সম্পর্কে আমি এখনও কিছু পাইনি। কিন্তু আমি এই ধারণা পরিত্যাগ পারে কারণ আমি তাদের সদস্য হিসেবে প্রদর্শিত করতে যখন আমি এই শ্রেণীর ধারাবাহিকভাবে চাই না
symbiont

0

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

Properties.Settings.Default.ServiceRef

0

আমি স্থির পাঠ্য সহ স্ট্যাটিক ক্লাসের পরামর্শ দেব suggest নীচে কোড স্নিপেট খুঁজুন:

  public static class CachedKeysManager
    {
        public static readonly string DistributorList = "distributorList";
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.