একক দৃষ্টান্ত এবং সিঙ্গলটন ডিজাইন প্যাটার্নের মধ্যে পার্থক্য করা এখানে গুরুত্বপূর্ণ ।
একক উদাহরণগুলি কেবল একটি বাস্তবতা। বেশিরভাগ অ্যাপ্লিকেশনগুলি কেবলমাত্র একবারে একটি কনফিগারেশন, একবারে একটি ইউআই, একসাথে একটি ফাইল সিস্টেম ইত্যাদির সাথে কাজ করার জন্য ডিজাইন করা হয়। যদি অনেকগুলি স্টেট বা ডেটা বজায় রাখতে হয় তবে অবশ্যই আপনার কেবল একটি উদাহরণ থাকতে হবে এবং যতক্ষণ সম্ভব এটি জীবন্ত রাখতে চান।
সিঙ্গেলটন ডিজাইনের প্যাটার্নটি খুব নির্দিষ্ট ধরণের একক উদাহরণ, বিশেষত একটি:
- বিশ্বব্যাপী, স্থির উদাহরণ ক্ষেত্রের মাধ্যমে অ্যাক্সেসযোগ্য;
- হয় প্রোগ্রাম সূচনা বা প্রথম অ্যাক্সেস উপর তৈরি;
- কোনও পাবলিক কনস্ট্রাক্টর (সরাসরি ইনস্ট্যান্ট করতে পারে না);
- কখনই স্পষ্টভাবে মুক্তি দেওয়া হয়নি (প্রোগ্রাম সমাপ্তির ক্ষেত্রে স্পষ্টতই মুক্তি দেওয়া)।
এই নির্দিষ্ট নকশার পছন্দের কারণেই প্যাটার্নটি বেশ কয়েকটি সম্ভাব্য দীর্ঘমেয়াদী সমস্যার পরিচয় দেয়:
- বিমূর্ত বা ইন্টারফেস ক্লাস ব্যবহারে অক্ষমতা;
- সাবক্লাসে অক্ষমতা;
- অ্যাপ্লিকেশন জুড়ে উচ্চ সংযুক্তকরণ (সংশোধন করা কঠিন);
- পরীক্ষা করা কঠিন (ইউনিট পরীক্ষায় জাল / উপহাস করতে পারবেন না);
- পরিবর্তনীয় অবস্থার ক্ষেত্রে সমান্তরাল হওয়া কঠিন (ব্যাপক লকিং প্রয়োজন);
- ইত্যাদি।
এই লক্ষণগুলির কোনওটিই কেবল একক দৃষ্টান্তের জন্য স্থানীয় নয়, কেবলমাত্র সিঙ্গলটন প্যাটার্ন।
পরিবর্তে আপনি কি করতে পারেন? কেবল সিঙ্গলটন প্যাটার্ন ব্যবহার করবেন না।
প্রশ্ন থেকে উদ্ধৃতি:
অ্যাপ্লিকেশনটিতে এই এক জায়গা থাকার ধারণা ছিল যা ডেটা সংরক্ষণ এবং সিঙ্ক করে রাখে এবং তারপরে যে কোনও নতুন স্ক্রিন খোলা থাকে সেগুলি সার্ভার থেকে বিভিন্ন সহায়ক ডেটার জন্য পুনরাবৃত্তি অনুরোধ না করে সেখান থেকে প্রয়োজনীয় তাদের বেশিরভাগটিকেই জিজ্ঞাসা করতে পারে। সার্ভারের কাছে ক্রমাগত অনুরোধ করা খুব বেশি ব্যান্ডউইদথ নিতে পারে - এবং আমি প্রতি সপ্তাহে কয়েক হাজার ডলার অতিরিক্ত ইন্টারনেট বিলের কথা বলছি, তাই এটি অগ্রহণযোগ্য ছিল।
এই ধারণার একটি নাম রয়েছে, আপনি যেমন ইঙ্গিত সাজান তেমন তবে অনিশ্চিত sound একে ক্যাশে বলা হয় । আপনি অভিনবতা পেতে চাইলে এটিকে একটি "অফলাইন ক্যাশে" বা দূরবর্তী ডেটার কেবল একটি অফলাইন অনুলিপি বলতে পারেন।
একটি ক্যাশে সিঙ্গলটন হওয়ার দরকার নেই। এটা তোলে পারে একটি একক উদাহরণস্বরূপ হতে হবে যদি আপনি একাধিক ক্যাশে দৃষ্টান্ত জন্য একই ডেটা আনার এড়াতে চান; তবে এর অর্থ এই নয় যে আপনাকে আসলে সকলের কাছে প্রকাশ করতে হবে ।
আমি প্রথমে যা করব তা হ'ল ক্যাশের বিভিন্ন কার্যকরী অঞ্চলকে আলাদা ইন্টারফেসে আলাদা করা separate উদাহরণস্বরূপ, ধরা যাক আপনি মাইক্রোসফ্ট অ্যাক্সেসের ভিত্তিতে বিশ্বের সবচেয়ে খারাপ ইউটিউব ক্লোন তৈরি করছিলেন:
MSAccessCache
▲
|
+ + ----------------- + + ----------------- + +
| | |
IMediaCache IProfileCache IPageCache
| | |
| | |
ভিডিওপেজ মাই অ্যাকাউন্টসপেজ মোস্টপোপুলারপেজ
মিডিয়া, ব্যবহারকারী প্রোফাইল এবং স্ট্যাটিক পৃষ্ঠাগুলিতে (প্রথম পৃষ্ঠার মতো) - নির্দিষ্ট শ্রেণীর ডেটা নির্দিষ্ট ধরণের ডেটা বর্ণনা করার জন্য এখানে আপনার কয়েকটি ইন্টারফেস রয়েছে । এগুলি সমস্তই একটি মেগা-ক্যাশে দ্বারা কার্যকর করা হয়, তবে আপনি পরিবর্তে ইন্টারফেসগুলি গ্রহণ করার জন্য আপনার পৃথক শ্রেণীর নকশা তৈরি করেন, তাই তাদের কী ধরণের উদাহরণ রয়েছে সেগুলি তারা পাত্তা দেয় না। আপনি একবার শারীরিক দৃষ্টিকোণটি আরম্ভ করুন, যখন আপনার প্রোগ্রামটি শুরু হয়, এবং তারপরে কেবল কনস্ট্রাক্টর এবং পাবলিক প্রোপার্টিগুলির মাধ্যমে দৃষ্টান্তগুলি (একটি নির্দিষ্ট ইন্টারফেসের ধরণের কাছে ফেলে দেওয়া) কাছাকাছি যেতে শুরু করুন।
একে বলা হয় নির্ভরতা ইনজেকশন , যাইহোক ; আপনি, ঠিক তাই যতদিন আপনার সাধারণ বর্গ নকশা স্প্রিং বা কোনো বিশেষ আইওসি ধারক ব্যবহার করতে প্রয়োজন হবে না আহ্বানকারী থেকে তার নির্ভরতা গ্রহণ পরিবর্তে তার নিজের উপর তাদেরকে শুরু করতে গিয়ে বা বৈশ্বিক রাষ্ট্র উল্লেখ ।
আপনার ইন্টারফেস ভিত্তিক নকশা কেন ব্যবহার করা উচিত? তিনটি কারণ:
কোডটি পড়া সহজ করে তোলে; নির্ভরযোগ্য ক্লাসগুলি কী ডেটা নির্ভর করে ঠিক সেই ইন্টারফেসগুলি থেকে আপনি স্পষ্টভাবে বুঝতে পারবেন ।
যদি এবং আপনি যখন বুঝতে পারেন যে মাইক্রোসফ্ট অ্যাক্সেস কোনও ডেটা ব্যাক-এন্ডের জন্য সেরা পছন্দ নয় তবে আপনি এটিকে আরও ভাল কিছু দিয়ে প্রতিস্থাপন করতে পারেন - আসুন এসকিউএল সার্ভার বলি।
যদি এবং আপনি যখন বুঝতে পারেন যে এসকিউএল সার্ভার বিশেষত মিডিয়াগুলির জন্য সেরা পছন্দ নয় , তবে আপনি সিস্টেমের অন্য কোনও অংশকে প্রভাবিত না করেই আপনার প্রয়োগটি ভেঙে ফেলতে পারেন । এখানেই বিমূর্তির আসল শক্তি আসে।
আপনি যদি আরও একধাপ এগিয়ে নিতে চান তবে আপনি স্প্রিং (জাভা) বা ইউনিটি (। নেট) এর মতো একটি আইওসি পাত্রে (ডিআই ফ্রেমওয়ার্ক) ব্যবহার করতে পারেন। প্রায় প্রতিটি ডিআই কাঠামো নিজস্ব জীবনকাল পরিচালনা করবে এবং নির্দিষ্টভাবে আপনাকে একটি নির্দিষ্ট পরিষেবাকে একক উদাহরণ হিসাবে সংজ্ঞায়িত করার অনুমতি দেবে (প্রায়শই এটি "সিঙ্গেলটন" বলে ডাকে তবে এটি কেবল পরিচিতির জন্য)। মূলত এই ফ্রেমওয়ার্কগুলি আপনাকে ম্যানুয়ালি দৃষ্টান্তগুলি অতিক্রম করার বেশিরভাগ বানরের কাজ বাঁচায় তবে এগুলি কঠোরভাবে প্রয়োজনীয় নয়। এই নকশাটি প্রয়োগ করতে আপনার কোনও বিশেষ সরঞ্জামের প্রয়োজন নেই।
সম্পূর্ণতার স্বার্থে, আমার উল্লেখ করা উচিত যে উপরের নকশাটি সত্যই আদর্শ নয়। আপনি যখন ক্যাশের সাথে ডিল করছেন (যেমন আপনি আছেন) আপনার আসলে একটি সম্পূর্ণ পৃথক স্তর থাকা উচিত । অন্য কথায়, এটির মতো একটি নকশা:
- IMediaRepository
|
ক্যাশে (জেনেরিক) --------------- + - আইফ্রোফিলারপোসিটোরি
▲ |
| - IPageRepository
+ + ----------------- + + ----------------- + +
| | |
IMediaCache IProfileCache IPageCache
| | |
| | |
ভিডিওপেজ মাই অ্যাকাউন্টসপেজ মোস্টপোপুলারপেজ
এর সুবিধাটি হ'ল আপনি Cache
যদি পুনরুদ্ধার করার সিদ্ধান্ত নেন তবে আপনার উদাহরণটি কখনও ভাঙতে হবে না ; আপনি কীভাবে মিডিয়াটিকে বিকল্প বিকল্প প্রয়োগ করে খাওয়ানোর মাধ্যমে তা সংরক্ষণ করা যায় তা আপনি পরিবর্তন করতে পারবেন IMediaRepository
। এটি কীভাবে একসাথে খাপ খায় সে সম্পর্কে আপনি যদি ভাবেন তবে আপনি দেখতে পাবেন এটি এখনও কেবলমাত্র ক্যাশের একটি শারীরিক উদাহরণ তৈরি করে, তাই আপনার কখনও কখনও একই ডেটা আনার দরকার নেই।
এর কোনওটিই বলার অপেক্ষা রাখে না যে বিশ্বের প্রতিটি সফ্টওয়্যারকে উচ্চ সংহতি এবং আলগা সংযোগের এই বহনকারী মানগুলির জন্য আর্কিটেক্ট করা দরকার; এটি প্রকল্পের আকার এবং স্কোপ, আপনার দল, আপনার বাজেট, সময়সীমা ইত্যাদির উপর নির্ভর করে তবে আপনি যদি সেরা ডিজাইনটি (সিঙ্গলটনের জায়গায় ব্যবহার করার জন্য) জিজ্ঞাসা করেন তবে এটি এটি।
পিএস যেমন অন্যেরা বলেছেন যে, নির্ভরশীল শ্রেণীর পক্ষে সচেতন হওয়া যে তারা ক্যাশে ব্যবহার করছেন এটি সম্ভবত সেরা ধারণা নয় - এটি এমন একটি বাস্তবায়ন বিশদ যা তাদের কখনই যত্ন নেওয়া উচিত নয়। বলা হচ্ছে, সামগ্রিক আর্কিটেকচারটি এখনও উপরে চিত্রযুক্তগুলির সাথে খুব মিল দেখায়, আপনি কেবল স্বতন্ত্র ইন্টারফেসগুলিকে ক্যাশ হিসাবে উল্লেখ করবেন না । পরিবর্তে আপনি তাদের নাম পরিষেবা বা অন্য কিছু অনুরূপ।