নীচের উত্তরটি ভুল, তবে আমি এটি অন্যদের থেকে শিখতে রাখব (নীচে দেখুন)
ইন ExampleA
, আপনি Config
একাধিক ক্লাস জুড়ে একই উদাহরণ ব্যবহার করতে পারেন । তবে, যদি Config
পুরো অ্যাপ্লিকেশনটির মধ্যে কেবল একটি উদাহরণ Config
থাকতে পারে তবে একাধিক উদাহরণ না এড়াতে সিঙ্গলটন প্যাটার্নটি প্রয়োগ করার বিষয়টি বিবেচনা করুন Config
। এবং যদি Config
একটি সিঙ্গলটন হয় তবে আপনি পরিবর্তে নিম্নলিখিতটি করতে পারেন:
class ExampleA
{
private $config;
public function __construct()
{
$this->config = Config->getInstance();
}
}
$exampleA = new ExampleA();
ইন ExampleB
, অপরপক্ষে, আপনি সবসময় একটি পৃথক উদাহরণস্বরূপ পাবেন Config
প্রতিটি নিদর্শনের জন্য ExampleB
।
আপনার কোন সংস্করণটি প্রয়োগ করা উচিত তা নির্ভর করে অ্যাপ্লিকেশন কীভাবে উদাহরণগুলি পরিচালনা করবে Config
:
- যদি প্রতিটি ঘটনার
ExampleX
পৃথক উদাহরণ থাকতে Config
পারে তবে সাথে যান ExampleB
;
- প্রতিটি উদাহরণ যদি
ExampleX
একটি (এবং শুধুমাত্র একটি) উদাহরণ ভাগ করে নিবে Config
, ব্যবহার করুন ExampleA with Config Singleton
;
- উদাহরণস্বরূপ যদি
ExampleX
বিভিন্ন দৃষ্টান্ত ব্যবহার করা যায় তবে এটি Config
আটকে দিন ExampleA
।
কেন সিঙ্গলটনে রূপান্তর Config
করা ভুল:
আমাকে অবশ্যই স্বীকার করতে হবে যে আমি গতকাল কেবলমাত্র সিঙ্গলটন প্যাটার্ন সম্পর্কে শিখেছি ( নকশার নিদর্শনগুলির প্রথম শিরোনাম বইটি পড়ছি )। নিঃসন্দেহে আমি এই উদাহরণটির জন্য গিয়েছিলাম এবং প্রয়োগ করেছি, তবে অনেকে উল্লেখ করেছেন যে, একটি উপায় অন্যটি (কিছু কিছু রহস্যজনক হয়েছে এবং কেবল বলেছে "আপনি এটি ভুল করছেন!"), এটি কোনও ভাল ধারণা নয়। সুতরাং, অন্যকে আমি যে ভুলটি করেছি তার থেকে বিরত রাখতে, এখানে সিঙ্গেলটন প্যাটার্ন কেন ক্ষতিকারক হতে পারে তার সংক্ষিপ্তসারটি অনুসরণ করে (মন্তব্যগুলির ভিত্তিতে এবং আমি এটি গুগলিং করে কী পেয়েছি):
যদি ExampleA
নিজস্ব রেফারেন্স আহরণ Config
উদাহরণস্বরূপ, ক্লাস শক্তভাবে মিলিত করা হবে না। (কিছু সাবক্লাস বলুন) ExampleA
এর আলাদা সংস্করণ ব্যবহার করার কোনও উদাহরণ থাকবে না Config
। এটি যদি ExampleA
কোনও মক-আপ উদাহরণ ব্যবহার করে পরীক্ষা করতে চান তবে Config
এটি সরবরাহ করার কোনও উপায় নেই বলেই এটি ভয়াবহ ExampleA
।
সেখানকার ভিত্তি একটি হবে এবং কেবলমাত্র একটি উদাহরণ Config
সম্ভবত এখন ধরে রেখেছে , তবে আপনি সবসময় নিশ্চিত হতে পারবেন না যে ভবিষ্যতে এটি একইরকম থাকবে । যদি পরে কোনও পর্যায়ে দেখা যায় যে একাধিক উদাহরণগুলি Config
কাম্য হবে, কোডটি পুনরায় লিখে না রেখে এটি অর্জনের কোনও উপায় নেই।
যদিও এক এবং একমাত্র এক উদাহরণ Config
সমস্ত চিরন্তন সত্য হতে পারে, এমনটি ঘটতে পারে যে আপনি কয়েকটি সাবক্লাস ব্যবহার করতে সক্ষম হতে চান Config
(এখনও কেবলমাত্র একটি উদাহরণ রয়েছে)। কিন্তু, যেহেতু কোড সরাসরি মাধ্যমে উদাহরণস্বরূপ পায় getInstance()
এর Config
একটি যা, static
পদ্ধতি, সেখানে উপশ্রেণী পেতে কোনও উপায় নেই। আবার কোড অবশ্যই নতুন করে লিখতে হবে।
কমপক্ষে কেবলমাত্র এপিআইটি দেখার সময় যে ExampleA
ব্যবহারগুলি ব্যবহার Config
করা হয় তা গোপন করা হবে ExampleA
। এটি খারাপ জিনিস হতে পারে বা নাও হতে পারে তবে ব্যক্তিগতভাবে আমি অনুভব করি যে এটি একটি অসুবিধার মতো বোধ করে; উদাহরণস্বরূপ, রক্ষণাবেক্ষণের সময়, Config
অন্যান্য ক্লাসের প্রয়োগের দিকে নজর না দিয়ে কোন ক্লাসগুলি পরিবর্তনের দ্বারা প্রভাবিত হবে তা সন্ধানের সহজ উপায় নেই ।
এমনকি যদি সিঙ্গলটনExampleA
ব্যবহার করে তবে এটি নিজের মধ্যে সমস্যা না হলেও এটি এখনও পরীক্ষার দৃষ্টিকোণ থেকে সমস্যা হয়ে উঠতে পারে। সিঙ্গেলটন অবজেক্টগুলি রাষ্ট্র বহন করবে যা অ্যাপ্লিকেশন শেষ হওয়া অবধি স্থায়ী থাকবে। ইউনিট পরীক্ষা চলাকালীন এটি একটি সমস্যা হতে পারে কারণ আপনি চান যে একটি পরীক্ষা অন্যের থেকে পৃথক হয়ে যায় (যেমন একটি পরীক্ষা চালানো অন্যের ফলাফলকে প্রভাবিত করে না)। এটি ঠিক করার জন্য, প্রতিটি পরীক্ষার রান (সম্ভাব্যভাবে পুরো অ্যাপ্লিকেশনটি পুনরায় চালু করতে হবে) এর মধ্যে সিঙ্গেলটন অবজেক্টটি ধ্বংস করতে হবে, যা সময় সাপেক্ষ হতে পারে (ক্লান্তিকর এবং বিরক্তিকরতার কথা উল্লেখ না করা)। Config
এটি বলার পরে, আমি খুশি যে আমি এখানে ভুল করেছি এবং বাস্তব প্রয়োগের বাস্তবায়নে নয়। প্রকৃতপক্ষে, আমি ক্লাসগুলির কয়েকটিতে সিঙ্গলটন প্যাটার্নটি ব্যবহার করতে আমার সর্বশেষ কোডটি পুনরায় লেখার বিষয়ে বিবেচনা করছি । যদিও আমি সহজেই পরিবর্তনগুলি ফিরিয়ে আনতে পারি (অবশ্যই একটি এসভিএন-এ সমস্ত কিছু সঞ্চিত আছে), তবে আমি এটি করতে সময় নষ্ট করতাম।