কোনও ফাইল থেকে সেটিংস লোড এবং স্টোর করবেন কোথায়?


9

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

  • যদি কোনও প্রোগ্রামের একটি সাধারণ settings.iniফাইল থাকে, তবে এর বিষয়বস্তুগুলি load()কোনও শ্রেণির কোনও পদ্ধতিতে লোড করা উচিত , বা সম্ভবত নির্মাতা?
  • মানগুলি public staticভেরিয়েবলগুলিতে সংরক্ষণ করা উচিত, বা staticসম্পত্তি পাওয়ার এবং সেট করার পদ্ধতিগুলি থাকা উচিত ?
  • ফাইলটি বিদ্যমান না থাকলে বা পাঠযোগ্য না হওয়ার ক্ষেত্রে কী ঘটতে হবে? আপনি কীভাবে প্রোগ্রামটির বাকি অংশগুলিকে জানাতে পারেন যে এটি এই বৈশিষ্ট্যগুলি পেতে পারে না?
  • প্রভৃতি

আমি আশা করছি আমি এখানে সঠিক জায়গায় এটি জিজ্ঞাসা করছি। আমি প্রশ্নটি যতটা সম্ভব ভাষা অজ্ঞানী হিসাবে তৈরি করতে চেয়েছিলাম, তবে আমি মূলত সেই ভাষাগুলিতে ফোকাস দিচ্ছি যেগুলির উত্তরাধিকারের মতো জিনিস রয়েছে - বিশেষত জাভা এবং সি #। নেট ET


1
.NET- র জন্য, App.config এবং System.Configration.ConfigrationManager ক্লাসটি সেটিংস পেতে ব্যবহার করা ভাল
গিবসন

@ গিবসন আমি শুধু। নেট শুরু করছি তাই আপনি কি আমাকে এই শ্রেণীর জন্য কোনও ভাল টিউটোরিয়ালের সাথে লিঙ্ক করতে পারেন?
অ্যান্ডি

স্ট্যাকওভারফ্লোতে এর প্রচুর উত্তর রয়েছে। দ্রুত অনুসন্ধান প্রকাশ করে: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১১৪৪২27/২ এবং স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১১৩০৩৩৩০০/… এখানে এমএসডিএন সম্পর্কে প্রচুর তথ্য থাকবে, এখানে শুরু করে এমএসডিএন.মাইক্রোসফটকম / en-us/library/ms228063(v = vs.100) .aspx এবং msdn.microsoft.com/en-us/library/ms184658(v=vs.110).aspx
গিবসন

@ গিবসন এই লিঙ্কগুলির জন্য আপনাকে ধন্যবাদ। তারা খুব দরকারী হবে।
অ্যান্ডি

উত্তর:


8

এটি আসলেই একটি গুরুত্বপূর্ণ প্রশ্ন এবং এটি প্রায়শই ভুলভাবে করা হয় কারণ এটি প্রতিটি প্রয়োগের মূল অংশ হলেও এটি যথেষ্ট গুরুত্ব দেওয়া হয় না। এখানে আমার গাইডলাইন রয়েছে:

আপনার কনফিগার ক্লাসে, যা সমস্ত সেটিংস ধারণ করে তা কেবল একটি সরল পুরাতন ডেটা টাইপ, স্ট্রাক্ট / শ্রেণি হওয়া উচিত:

class Config {
    int prop1;
    float prop2;
    SubConfig subConfig;
}

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

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

ক্ষেত্র হিসাবে সমস্ত সেটিংসে টাইপ করার ক্ষেত্রে আপনার কেবল অলস হওয়া উচিত নয়:

class Config {
    Dictionary<string, string> values;
};

এটি লোভনীয় কারণ এর অর্থ আপনি একটি সাধারণীকৃত সিরিয়ালাইজ ক্লাস লিখতে পারেন যা এটি কোন ক্ষেত্রগুলি নিয়ে কাজ করে তা জানা দরকার নেই তবে এটি ভুল এবং আমি কেন একটি মুহুর্তে ব্যাখ্যা করব।

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

struct Config {
   int opt;
} conf;
po::options_description desc("Allowed options");
desc.add_options()
    ("optimization", po::value<int>(&conf.opt)->default_value(10);

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

আপনার কিছুটা ফ্যাশনে কনফিগার ক্লাসটি কেবল পঠনযোগ্য করা উচিত - আপনি যখন এটি তৈরি করবেন তখন ক্লাসের বিষয়বস্তুগুলি সেট করে ফাইলে শুরু করুন। আপনার অ্যাপ্লিকেশনটিতে পরিবর্তনশীল সেইসাথে পরিবর্তিত কনস্টের দরকার থাকলে আপনার কনফিগার ক্লাসের বিটগুলি কেবল পঠনযোগ্য না হওয়ার পরিবর্তে ডায়নামিকগুলি পরিচালনা করার জন্য আপনার একটি পৃথক ক্লাস থাকা উচিত ।

আদর্শভাবে আপনি ফাইলটিতে আপনার প্রোগ্রামের এক জায়গায় পড়েন অর্থাৎ আপনার কাছে কেবলমাত্র একটি উদাহরণ রয়েছে " ConfigReader"। যাইহোক, আপনি যদি কনফিগারেশন উদাহরণটি আপনার প্রয়োজনের পাশ দিয়ে কাটাতে লড়াই করে যাচ্ছেন, তবে একটি বিশ্বব্যাপী কনফিগার চালু করার চেয়ে দ্বিতীয় কনফিগার রিডার রাখাই ভাল (যা আমি অনুমান করছি যে "স্থির দ্বারা ওপি মানে কী "), যা আমার পরের পয়েন্ট সম্পর্কে এনেছে:

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

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

int Prop1 { get; }
int Prop2 { get; }
int Prop3 { get { return Prop1*Prop2; }

যদি আপনার ভাষা মূলত সম্পত্তি আইডিয়মকে সমর্থন করে না, তবে একই প্রভাবটি অর্জনের জন্য এটির কাজ হতে পারে, বা আপনি কেবল একটি মোড়কের ক্লাস তৈরি করেন যা বোনাস সেটিংস সরবরাহ করে। আপনি অন্যথায় যদি সম্পত্তিগুলির সুবিধা প্রদান করতে না পারেন তবে অন্যথায় Oশ্বরকে সন্তুষ্ট করার উদ্দেশ্যে নিজে নিজে লেখার জন্য এবং গেটর / সেটটারগুলি ব্যবহার করা সময় নষ্ট করা। আপনি সরল পুরানো মাঠের সাথে আরও ভাল থাকবেন।

অগ্রাধিকারের ভিত্তিতে আপনার একত্রিত হতে এবং বিভিন্ন স্থান থেকে একাধিক কনফিগার নিতে সিস্টেমের প্রয়োজন হতে পারে। অগ্রাধিকারের ক্রমটি সমস্ত বিকাশকারী / ব্যবহারকারীর দ্বারা যথাযথভাবে সংজ্ঞায়িত করা এবং বোঝা উচিত eg উদাহরণস্বরূপ উইন্ডোজ রেজিস্ট্রি HKEY_CURRENT_USER / HKEY_LOCAL_MACHINE বিবেচনা করুন। আপনার এই কার্যকরী শৈলীটি করা উচিত যাতে আপনি আপনার কনফিগারগুলি কেবল পঠন রাখতে পারেন:

final_conf = merge(user_conf, machine_conf)

বরং:

conf.update(user_conf)

আমার অবশেষে অবশ্যই যুক্ত করা উচিত যদি আপনার নির্বাচিত কাঠামো / ভাষা তার নিজস্ব অন্তর্নির্মিত, সুপরিচিত কনফিগারেশন প্রক্রিয়া সরবরাহ করে তবে আপনার নিজের ঘূর্ণায়মানের পরিবর্তে এটি ব্যবহারের সুবিধাগুলি বিবেচনা করা উচিত।

So. অনেকগুলি দিক বিবেচনা করতে হবে - এটি সঠিকভাবে পান এবং এটি আপনার অ্যাপ্লিকেশন আর্কিটেকচারকে গভীরভাবে প্রভাবিত করবে, বাগগুলি হ্রাস করবে, জিনিসগুলি সহজেই পরীক্ষারযোগ্য করে তোলা হবে এবং সাজানোর জন্য আপনাকে অন্য কোথাও ভাল ডিজাইন ব্যবহার করতে বাধ্য করবে।


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

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

এখন আমি আরও কিছুটা ভাল করে বুঝেছি। সুতরাং মূলত আপনি বলছেন যে সমস্ত ক্ষেত্র / সেটিংসে একটি ক্লাস রয়েছে এবং ফাইল থেকে সেই শ্রেণিতে মান নির্ধারণের জন্য আরও একটি আছে? তারপরে, আমি অন্যান্য শ্রেণিতে প্রথম শ্রেণি থেকে মানগুলি কীভাবে পাব?
অ্যান্ডি

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

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

4

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

এছাড়াও, এটি প্রয়োগে "জিনিসগুলি ব্যর্থ হলে কী হয়" এর বোঝা চাপিয়ে দেয়, যারা ব্যর্থতার অর্থ কী তা কে ভাল জানেন।

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


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

@ এবং - নিশ্চিত, তবে মডিউলগুলি যদি কনফিগারেশনে সরাসরি অ্যাক্সেস করে তবে তারা কী প্রসঙ্গে কাজ করছেন তা তারা জানেন না, তাই তারা কনফিগারেশন সম্পর্কিত সমস্যাগুলি কীভাবে পরিচালনা করবেন তা নির্ধারণ করতে পারে না। যদি অ্যাপ্লিকেশনটি লোডিং করছে, এটি যে কোনও সমস্যা মোকাবেলা করতে পারে, কারণ এটি প্রসঙ্গটি জানে। কিছু অ্যাপ্লিকেশান ডিফল্ট মান ধরে ব্যর্থ করতে চাইতে পারেন, অন্যদের টি থামিয়ে দিতে চান ইত্যাদি
Telastyn

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

0

আপনি যদি ক্লাস প্রোগ্রামিংয়ের জন্য .NET ব্যবহার করে থাকেন তবে আপনার কাছে রিসোর্সস, ওয়েবকনফিগ, বা একটি কাস্টম ফাইলের মতো বিভিন্ন বিকল্প রয়েছে।

আপনি যদি রিসোর্স বা ওয়েব কোডফিগ ব্যবহার করেন তবে ডেটাটি এক্সএমএল ফাইলে আসলে সংরক্ষণ করা হয় তবে লোডিং দ্রুত হয়।

এই ফাইলগুলি থেকে ডেটা পুনরুদ্ধার করা এবং এগুলিকে অন্য স্থানে সংরক্ষণ করা মেমরির দ্বিগুণ ব্যবহারের মতো হবে কারণ এগুলি ডিফল্টরূপে মেমরিতে লোড হয়।

অন্য যে কোনও ফাইল বা প্রোগ্রামিং ভাষার জন্য, বেনিডিক্টের উপরের উত্তরগুলি কাজ করবে।


আপনার উত্তরের জন্য ধন্যবাদ এবং ধীর উত্তরের জন্য দুঃখিত। সংস্থানগুলি ব্যবহার করা একটি ভাল বিকল্প হবে তবে আমি ঠিক বুঝতে পেরেছি যে এটি সম্ভবত আমার পক্ষে অন্য ভাষায় একই প্রোগ্রামটি বিকাশের পরিকল্পনা করার মতো সেরা বিকল্প নয়, সুতরাং আমার কাছে এক্সএমএল বা জেএসওন ফাইল থাকলেও এটি আমার নিজের ক্লাসে পড়ুন যাতে একই ফাইলটি অন্যান্য প্রোগ্রামিং ভাষায়ও পড়তে পারে।
অ্যান্ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.