আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি মনে করি আমার আরও একটি আকর্ষণীয় উদাহরণ রয়েছে যা আমি সম্প্রতি প্রয়োগ করেছি।
ডকুমেন্ট ডেলিভারি সিস্টেমে কৌশল প্যাটার্নটি ব্যবহার করার এটি একটি খুব ব্যবহারিক উদাহরণ।
আমার কাছে একটি পিডিএফ ডেলিভারি সিস্টেম ছিল যা প্রচুর নথি এবং কিছু মেটাডেটাযুক্ত একটি সংরক্ষণাগার পেয়েছিল। মেটাডাটার উপর ভিত্তি করে, সিদ্ধান্ত নিয়েছে যে দস্তাবেজটি কোথায় রাখা হবে; বলে, ডাটা উপর নির্ভর করে, আমি নথিতে সংরক্ষণ পারে A
, B
অথবা C
স্টোরেজ সিস্টেম বা তিনটি একটি মিশ্রণ।
বিভিন্ন গ্রাহকরা এই সিস্টেমটি ব্যবহার করেছেন, এবং ত্রুটির ক্ষেত্রে তাদের বিভিন্ন রোলব্যাক / ত্রুটি পরিচালনার প্রয়োজনীয়তা ছিল: একজন প্রথম ত্রুটিতে ডেলিভারি সিস্টেমটি থামাতে চেয়েছিল, ইতিমধ্যে সমস্ত স্টোরগুলিতে জমা দেওয়া সমস্ত নথি তাদের রেখে দেয়, তবে প্রক্রিয়াটি থামিয়ে দেয় এবং অন্য কিছু সরবরাহ না করে ; অন্য কেউ চান যে এটি B
সংরক্ষণ করার সময় ত্রুটির ক্ষেত্রে এটি থেকে রোলব্যাক করতে পারে C
তবে ইতিমধ্যে যা সরবরাহ করা হয়েছিল তা ছেড়ে দিন A
। এটি সহজেই অনুমেয় যে তৃতীয় বা চতুর্থ ব্যক্তিরও বিভিন্ন প্রয়োজন হবে।
সমস্যা সমাধানের জন্য, আমি একটি মৌলিক বিতরণ শ্রেণি তৈরি করেছি যাতে ডেলিভারি যুক্তি রয়েছে, এবং সমস্ত স্টোর থেকে স্টাফ ফিরে ঘুরিয়ে দেওয়ার জন্য পদ্ধতিগুলি। এই পদ্ধতিগুলি আসলে ত্রুটির ক্ষেত্রে ডেলিভারি সিস্টেম দ্বারা ডাকা হয় না। পরিবর্তে, ক্লাসটি "রোলব্যাক / ত্রুটি হ্যান্ডলিং কৌশল" শ্রেণি (সিস্টেমটি ব্যবহার করে গ্রাহকের উপর ভিত্তি করে) পাওয়ার জন্য ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে, যা ত্রুটির ক্ষেত্রে বলা হয়, যা কৌশলটির জন্য উপযুক্ত হলে রোলব্যাক পদ্ধতিগুলিকে কল করে calls
ডেলিভারি ক্লাস নিজেই কৌশল শ্রেণিতে কী ঘটছে তা রিপোর্ট করে (কোন স্টোরগুলিতে কী কী দলিল সরবরাহ করা হয়েছিল, এবং কোনটি ব্যর্থতা হয়েছিল) এবং যখনই কোনও ত্রুটি ঘটে, তখন কৌশলটি চালিয়ে যাওয়া উচিত কিনা তা জিজ্ঞাসা করে। কৌশলটি "এটি বন্ধ করুন" বললে, শ্রেণি কৌশলটির "ক্লিনআপ" পদ্ধতিটিকে কল করে, যা পূর্বে রিপোর্ট করা তথ্য ব্যবহার করে ডেলিভারি ক্লাস থেকে কোন রোলব্যাক পদ্ধতিতে কল করতে হবে বা কেবল কিছুই করেনি তা স্থির করে।
rollbackStrategy.reportSuccessA(...);
rollbackStrategy.reportFailureB(...);
if (rollbackStrategy.mustAbort()) {
rollbackStrategy.rollback();
return false;
}
সুতরাং আমার কাছে এখন দুটি ভিন্ন কৌশল রয়েছে: একটি হ'ল QuitterStrategy
(যা প্রথম ত্রুটি থেকে বেরিয়ে আসে এবং কিছুই পরিষ্কার করে না) এবং অন্যটি হ'ল MaximizeDeliveryToAStrategy
(যা প্রক্রিয়াটি বাতিল না করার জন্য যথাসাধ্য চেষ্টা করে এবং স্টোরেজে বিতরণ করা জিনিসটি কখনই না A
, তবে রোলব্যাকস স্টাফ B
যদি বিতরণে C
ব্যর্থ হয়))
আমার বুঝতে থেকে, এটি কৌশল প্যাটার্নের একটি উদাহরণ। যদি আপনি (হ্যাঁ, আপনি পড়া) মনে করেন আমি ভুল, দয়া করে নীচে মন্তব্য করুন এবং আমাকে জানান। আমি কৌশলগত প্যাটার্নটির "খাঁটি" ব্যবহারটি কীভাবে গঠন করব এবং আমার বাস্তবায়নের কোন দিকগুলি সংজ্ঞা লঙ্ঘন করেছে তা সম্পর্কে আমি আগ্রহী। আমি মনে করি এটি কিছুটা মজার দেখাচ্ছে কারণ কৌশল ইন্টারফেসটি কিছুটা চর্বিযুক্ত। আমি এখনও পর্যন্ত দেখা সমস্ত উদাহরণ কেবল একটি পদ্ধতি ব্যবহার করেছে তবে আমি এখনও মনে করি এটি একটি অ্যালগরিদমকে আবদ্ধ করে তোলে (যদি ব্যবসার যুক্তির একটি অংশকে একটি অ্যালগরিদম হিসাবে বিবেচনা করা যায়, যা আমি মনে করি এটি এটি করে)।
যেহেতু কৌশলটি বিতরণ সম্পাদনের সময় ইভেন্টগুলি সম্পর্কেও অবহিত করা হয়, তাই এটি পর্যবেক্ষক হিসাবেও বিবেচনা করা যেতে পারে তবে এটি অন্য গল্প।
একটু গবেষণা করে দেখে মনে হয় এটি অ্যাডভাইজার নামে পরিচিত এমন একটি "সম্মিলিত প্যাটার্ন" (এমভিসি এর মতো, এমন একটি প্যাটার্ন যা কোনও নির্দিষ্ট উপায়ে নীচে একাধিক ডিজাইনের ধরণ ব্যবহার করে) । এটি বিতরণ অব্যাহত রাখা উচিত কিনা সে বিষয়ে একটি পরামর্শদাতা, তবে এটি একটি সক্রিয় ত্রুটি হ্যান্ডলার কারণ এটি যখন জিজ্ঞাসা করা হয় তখন স্টাফগুলি রোলব্যাক করতে পারে।
যাইহোক, এটি একটি অত্যন্ত জটিল উদাহরণ যা আপনার অনুভূতিটি বোধ করতে পারে যে কৌশল প্যাটার্নের ব্যবহারগুলি খুব সহজ / নির্বোধ। এটি অন্যান্য জটিল নিদর্শনগুলির সাথে একত্রে ব্যবহৃত হলে এটি জটিল এবং আরও বেশি কার্যকর হতে পারে।