কনফিগার ক্লাস / স্ট্রাক্ট: প্যাটার্ন বা অ্যান্টি-প্যাটার্ন? বিকল্প?


10

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

  1. আপনার প্রোগ্রামের এমন সমস্ত অংশে কনফিগারেশন সেটিংস পাস করুন যা স্পষ্টভাবে আদিম হিসাবে তাদের প্রয়োজন। এটি সর্বাধিক স্পষ্ট উপায় এবং উপায় যা জিনিসগুলিকে সর্বাধিক decouples করে। খারাপ দিকটি হ'ল এটি উভয় ভার্বোস এবং ভঙ্গুর।

  2. সর্বাধিক প্রায়শই ব্যবহৃত কনফিগারেশন সেটিংস গ্লোবাল / স্ট্যাটিক করুন। এটি সহজতম উপায় তবে দূরত্বে কর্মের প্রবর্তন করে, টেস্টিবিলিটি বাধা দেয় এবং ধরে নেয় যে কনফিগারেশনটি সত্যই বিশ্বব্যাপী (যে আপনি যে কোনও সময়ে কেবল একটি কনফিগারেশন চাইবেন)।

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

আপনি (3) একটি প্যাটার্ন বা একটি বিরোধী-প্যাটার্ন বিবেচনা করবেন? যদি এটি একটি অ্যান্টি-প্যাটার্ন হয় তবে আপনি এর পরিবর্তে কী করবেন?


3 এর পরিবর্তনের বিষয়ে কীভাবে - বেশ কয়েকটি কনফিগারেশন ক্লাস থাকা, উপযুক্ত যেখানে এটি প্রয়োজন সেখানে পাস করে?
ওডে

@ ওজেড: আমি বোঝাতে চেয়েছিলাম সম্ভাবনা হিসাবে। সম্পাদনা করা হয়েছে।
dsimcha

উত্তর:


4

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


4
+1 বলার জন্য যে কিছু তাত্ত্বিকভাবে আদর্শ ডিজাইন নয় তবে বাস্তবে ভাল হতে পারে যখন সরলতা এবং পরিবর্তনের সম্ভাবনা (বা এর অভাব) বিবেচনা করা হয়।
dsimcha

আমি সবেমাত্র চারটি যুক্তি ছুঁড়ে দিয়ে এটিকে একটি সেটিংস শ্রেণীর সাথে প্রতিস্থাপন করেছি। এটা ঠিক জিনিস মত অনুভূত।
মার্টিন উয়েডিং

আপনি যে 3 টি বিকল্পের পক্ষে কথা বলছেন তা আমি বুঝতে পারি না। আপনি দয়া করে নির্দিষ্ট করতে পারেন?
DBedrenko

1

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


আপনি নিজের সাথে দ্বন্দ্ব করেছেন: আপনি বিকল্প 1 ব্যবহার করতে বলেছিলেন, তবে তারপরে "এই ধরণের কনফিগারেশন সেটিংসকে বস্তুতে ইনজেকশনের জন্য নির্ভরতা ইনজেকশন কাঠামো ব্যবহার করে শব্দচক্র হ্রাস করুন" " যা অপশন 3: কনস্ট্রাক্টর ইনজেকশন।
DBedrenko

0

আপনার কনফিগারেশন ফাইলটি এক্সএমএলে লেখা হয়েছিল কিনা তা কল্পনা করুন। তারপরে আপনি এই প্রতিটি এক্সএমএলের টুকরোগুলি আপনার প্রতিটি উপাদানকে দিতে পারেন, যাতে তারা তাদের কনফিগারেশন ডেটা পান।

যদি আপনি .NET ব্যবহার করে থাকেন তবে আপনি ডেটা কন্ট্রাক্ট সহ এমন ক্লাস তৈরি করতে পারেন যা আপনি আপনার কনফিগারেশন এক্সএমএল থেকে কোনও বস্তু স্তরবিন্যাস তৈরি করতে এক্সএমএলসিরিয়ালাইজার ব্যবহার করতে পারেন এবং কনফিগারেশন হিসাবে এই বিষয়গুলি চারপাশে পাস করতে পারেন।

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

কোন অংশটি তা জানা, এবং এই ডেটা সেটিংসকে পৃথক করে রাখলে আপডেটগুলি ইনস্টল করা আরও সহজতর হবে (গ্রাহকদের সেটিংসটি ছাড়াই)


0

আমি ক্লাসটি # 3 বিকল্পে স্থির করব। পরিবর্তে তাই

//create SomeCl
Foo f = new Foo();
f.setConfigInst(cfg);
...
...
//Inside Foo
public void setConfig(MyAppConfig c) { localCfg = c; }
...
//somewhere else:
x = localCfg.getConfigForX();

আপনি ঠিক থাকতে পারেন:

//Inside Foo
x = MyAppConfig.getConfigForX();

শ্রেণিবদ্ধের মধ্যে কনফিগারেশন ডেটা লোডিং / সেভ করার বিশদটি ঘটুক MyAppConfig। এবং অবশ্যই আপনার আরও জটিল বিভিন্নতা থাকতে পারে, যেমন বিভিন্ন উদ্দেশ্যে বিভিন্ন ক্লাস।

কেবলমাত্র যদি এই পদ্ধতির সমস্যা দেখা দেয় তবেই যদি আপনার কোনও কারণে একই সাথে বিভিন্ন কনফিগারেশনের একাধিক উদাহরণে কাজ করা প্রয়োজন হয় , যদিও আমার এখনও এমন পরিস্থিতি দেখা যায়নি।


1
কিছু টেস্টিং ফ্রেমওয়ার্কে ইউনিট পরীক্ষা চালানোর সময় যা ঘটেছিল তা হ'ল ... তবে এমনকি সুস্পষ্টভাবে সমান্তরাল ইউনিট পরীক্ষা না করে, এটি ইউনিট পরীক্ষার বস্তুগুলির গাধাতে ব্যথা হতে চলেছে যা বিশ্বব্যাপী অবস্থার উপর নির্ভর করে।
প্যাটার তারেক

0

আমি এমন একটি প্রকল্পে কাজ করছি যেখানে আমরা "3 স্তর (ইন্টারফেস, ব্যবসায়িক যুক্তি, ডেটা অ্যাক্সেস)" পদ্ধতির ব্যবহার করছি। অ্যাপ্লিকেশনটি কোনও মাল্টিউজার ওয়েব সার্ভার বা ক্লায়েন্ট সার্ভার হতে পারে।

আমরা তিনটি আলাদা কনফিগারেশন নিয়ে কাজ করি, পিসির জন্য প্রথম নির্দিষ্ট, ব্যবহারকারী যেখানে কাজ করছেন তার জন্য specific বর্তমান ব্যবহারকারীর জন্য দ্বিতীয় নির্দিষ্ট এবং সমস্ত ব্যবহারকারী এবং ক্লায়েন্ট অ্যাপ্লিকেশনগুলির জন্য একটি তৃতীয় বৈশ্বিক কনফিগারেশন।

প্রতিটি কনফিগারেশন কোনও বস্তুর মাধ্যমে অ্যাপ্লিকেশনটির প্রতিটি ক্ষেত্রে প্রদর্শিত হয়।

এই পদ্ধতির সাহায্য আপনার প্রকল্পে সাহায্য করতে পারে।

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