আমি ভাবছিলাম যে এটিই কী যা অন্যান্য অনুরূপ নির্মাণের সাথে তুলনা করার সময় আইট্রেটারকে বিশেষ করে তোলে এবং এটি গ্যাং অফ ফোরকে এটিকে নকশার ধরণ হিসাবে তালিকাভুক্ত করে।
ইলেক্টরটি পলিমারফিজম (একটি সাধারণ ইন্টারফেস সহ সংকলনের একটি শ্রেণিবিন্যাস) এবং উদ্বেগের বিভাজন (সংগ্রহগুলি নিয়ে পুনরুক্তি হওয়া তথ্যটি কাঠামোগত করার পদ্ধতি থেকে পৃথক হওয়া উচিত) উপর ভিত্তি করে is
তবে কী কী যদি আমরা সংগ্রহের শ্রেণিবিন্যাসের সাথে প্রতিস্থাপন করি, উদাহরণস্বরূপ, গাণিতিক অবজেক্টের একটি শ্রেণিবিন্যাস (পূর্ণসংখ্যা, ভাসা, জটিল, ম্যাট্রিক্স ইত্যাদি) এবং পুনরায় শ্রেনী দ্বারা এই বিষয়গুলিতে কিছু সম্পর্কিত ক্রিয়াকলাপ উপস্থাপন করে এমন একটি শ্রেণীর দ্বারা পুনরুদ্ধারের উদাহরণস্বরূপ শক্তি ফাংশন functions ক্লাস ডায়াগ্রাম একই হবে।
আমরা সম্ভবত আরও অনেক অনুরূপ উদাহরণ খুঁজে পেতে পারি যেমন রাইটার, পেইন্টার, এনকোডার এবং সম্ভবত আরও ভাল, একইভাবে কাজ করে। তবে আমি এগুলির কোনওটিকেই ডিজাইনের প্যাটার্ন বলা হয়ে ওঠেনি।
সুতরাং ইটাররেটরকে কী বিশেষ করে তোলে?
সংগ্রহের মধ্যে বর্তমান অবস্থানটি সংরক্ষণের জন্য এটির পরিবর্তনীয় রাষ্ট্রের প্রয়োজন হওয়ায় এটি আরও জটিল কারণ এটি কি সত্য? তবে তারপরে, পরিবর্তনীয় অবস্থা সাধারণত আকাঙ্ক্ষিত বলে বিবেচিত হয় না।
আমার বক্তব্য স্পষ্ট করতে, আমাকে আরও বিশদ উদাহরণ দিন।
আমাদের ডিজাইনের সমস্যাটি এখানে:
ধরা যাক আমাদের ক্লাসগুলির একটি শ্রেণিবিন্যাস রয়েছে এবং এই শ্রেণীর অবজেক্টগুলির উপর একটি ক্রিয়াকলাপ সংজ্ঞায়িত করা আছে। এই ক্রিয়াকলাপের ইন্টারফেস প্রতিটি শ্রেণীর জন্য একই, তবে বাস্তবায়ন সম্পূর্ণ আলাদা হতে পারে। এটিও ধরে নেওয়া হয় যে একই পদার্থে একাধিকবার অপারেশন প্রয়োগ করা বোধগম্য হয়, বিভিন্ন পরামিতি সহ বলে।
আমাদের ডিজাইন সমস্যার (বাস্তবিকভাবে পুনরাবৃত্তকরণের প্যাটার্নটির সাধারণীকরণ) একটি বুদ্ধিমান সমাধান এখানে দেওয়া হয়েছে:
উদ্বেগের পৃথকীকরণের জন্য, অপারেশনটির বাস্তবায়নগুলি মূল বর্গ স্তরক্রম (অপারেন্ড অবজেক্টস) হিসাবে ফাংশন হিসাবে যুক্ত করা উচিত নয়। যেহেতু আমরা একই অপরেন্ডে একাধিকবার অপারেশন প্রয়োগ করতে চাই, এটি কেবল কোনও ক্রিয়াকলাপ দ্বারা নয়, অপারেন্ডের রেফারেন্স ধারণ করে এমন কোনও বস্তুর দ্বারা প্রতিনিধিত্ব করা উচিত। সুতরাং অপারেন্ড অবজেক্টটি এমন একটি ফাংশন সরবরাহ করবে যা অপারেশনকে প্রতিনিধিত্ব করে returns এই অবজেক্টটি এমন একটি ফাংশন সরবরাহ করে যা প্রকৃত ক্রিয়াকলাপ সম্পাদন করে।
একটি উদাহরণ:
একটি বেস ক্লাস বা ইন্টারফেস রয়েছে MathObject
(বোকা নাম, আমি জানি, সম্ভবত কারওর থেকে আরও ভাল ধারণা থাকতে পারে)) উত্পন্ন ক্লাস MyInteger
এবং সহ MyMatrix
। প্রত্যেকের জন্য MathObject
একটি ক্রিয়াকলাপ Power
সংজ্ঞায়িত করা উচিত যা স্কোয়ার, কিউব এবং এরকম আরও কিছু গণনা করতে দেয়। সুতরাং আমরা (জাভাতে) লিখতে পারি:
MathObject i = new MyInteger(5);
Power powerOfFive = i.getPower();
MyInteger square = powerOfFive.calculate(2); // should return 25
MyInteger cube = powerOfFive.calculate(3); // should return 125