ইটারকে কী ডিজাইনের প্যাটার্ন বানায়?


9

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

ইলেক্টরটি পলিমারফিজম (একটি সাধারণ ইন্টারফেস সহ সংকলনের একটি শ্রেণিবিন্যাস) এবং উদ্বেগের বিভাজন (সংগ্রহগুলি নিয়ে পুনরুক্তি হওয়া তথ্যটি কাঠামোগত করার পদ্ধতি থেকে পৃথক হওয়া উচিত) উপর ভিত্তি করে 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

5
"ক্লাস ডায়াগ্রাম একই হবে" - তাহলে কী? একটি নকশার প্যাটার্ন কোনও শ্রেণির চিত্র নয়। এটি একটি পুনরাবৃত্তি সমস্যার সমাধানের শ্রেণীর জন্য একটি উচ্চ স্তরের বিমূর্ততা।
ডক ব্রাউন

@ ডকব্রাউন: ঠিক আছে, তবে কি গাণিতিক ক্রিয়াকলাপ নয়, কোনও ফাইলের জন্য বস্তু লেখা, গ্রাফিকাল আউটপুট বা এনকোডিং ডেটা পুনরাবৃত্তির মতো সমস্যাগুলি, যেমন পুনরাবৃত্তি?
ফ্র্যাঙ্ক পাফার

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

@ ফ্র্যাঙ্কপুফার যদি আপনি কোনও ফাইলে অবজেক্ট লেখার জন্য একটি সাধারণ সমাধানের রূপরেখা নির্ধারণ করেন তবে আপনি নিজের সমাধানটি লিখে লিখতে পারেন এবং যদি এটি করা সহায়ক হয় তবে তাকে অবজেক্ট রাইটিং প্যাটার্ন বলতে পারেন।
ব্র্যান্ডিন

3
আপনি এই overth سوچ করছি। একটি ডিজাইনের প্যাটার্ন হ'ল একটি সাধারণ কম্পিউটিং সমস্যার একটি সুপরিচিত সমাধান এবং এটিই হ'ল। আপনি যে প্যাটার্নগুলি প্রদান করে তা স্বীকৃতি এবং প্রয়োগ করতে পারলে আপনি সেই প্যাটার্নটি ব্যবহার করেন।
রবার্ট হার্ভে

উত্তর:


9

জিওএফ বইয়ের বেশিরভাগ নিদর্শনগুলিতে নিম্নলিখিত জিনিসগুলি মিল রয়েছে:

  • তারা অবজেক্ট-ভিত্তিক উপায় ব্যবহার করে, বেসিক ডিজাইনের সমস্যাগুলি সমাধান করে
  • লোকেরা প্রায়শই ডোমেন বা ব্যবসায় থেকে নির্বিচারে ইচ্ছামত প্রোগ্রামগুলিতে এই জাতীয় সমস্যার মুখোমুখি হয়
  • কোডটি আরও পুনরায় ব্যবহারযোগ্য করে তোলার জন্য সেগুলি রেসিপি হয়, প্রায়শই এটি আরও সলিড তৈরি করে
  • তারা এই সমস্যার ক্যাননিক সমাধান উপস্থাপন করে

এই নিদর্শনগুলির দ্বারা সমাধান করা সমস্যাগুলি এতটাই মৌলিক যে অনেকগুলি বিকাশকারী তাদের মূলত প্রোগ্রামিং ভাষার বৈশিষ্ট্যগুলি অনুপস্থিত করার জন্য কার্যপ্রণালী হিসাবে বুঝতে পারে যা আইএমএইচও একটি বৈধ দৃষ্টিকোণ (নোট করুন যে জিওএফ বইটি 1995 সালের, যেখানে জাভা এবং সি ++ এতগুলি প্রস্তাব দেয় নি) আজকের মতো বৈশিষ্ট্যগুলি)।

পুনরাবৃত্তির প্যাটার্নটি এই বিবরণটির সাথে পুরোপুরি ফিট করে: এটি একটি মৌলিক সমস্যা সমাধান করে যা বেশিরভাগ ক্ষেত্রেই ঘটে থাকে কোনও নির্দিষ্ট ডোমেন থেকে স্বতন্ত্রভাবে এবং আপনি নিজেরাই লিখেছেন এটি "উদ্বেগের বিচ্ছেদ" এর জন্য একটি ভাল উদাহরণ। আপনি অবশ্যই জানেন যে, প্রত্যক্ষ পুনরাবৃত্তি সমর্থন এমন একটি জিনিস যা আপনি আজ প্রচুর সমসাময়িক প্রোগ্রামিং ভাষায় খুঁজে পান।

এখন আপনি যে সমস্যাগুলি বেছে নিয়েছেন তার সাথে এটি তুলনা করুন:

  • কোনও ফাইলে লেখা - এটি IMHO কেবল "বেসিক" পর্যাপ্ত নয়। এটি একটি খুব নির্দিষ্ট সমস্যা। তেমনি একটি ভাল, ক্যানোনিক সমাধান নেই - কোনও ফাইলকে কীভাবে লিখতে হয় তার অনেকগুলি ভিন্ন পদ্ধতি রয়েছে এবং কোনও পরিষ্কার "সেরা অনুশীলন" নেই।
  • চিত্রশিল্পী, এনকোডার: এটির সাথে আপনি যা মনে রাখবেন না কেন, এই সমস্যাগুলি আমার কাছে আরও কম বেসিক মনে হয়, এমনকি ডোমেনও স্বতন্ত্র নয়।
  • বিভিন্ন ধরণের অবজেক্টের জন্য "পাওয়ার" ফাংশন উপলভ্য: প্রথম নজরে এটি একটি প্যাটার্ন মৌমাছির উপযোগী হতে পারে, তবে আপনার প্রস্তাবিত সমাধানটি আমাকে বোঝায় না - এটি পাওয়ার ফাংশনটিকে আরও কিছু অনুরূপ হিসাবে জুতা দেওয়ার চেষ্টা বলে মনে হচ্ছে more পুনরাবৃত্তি প্যাটার্ন আমি ইঞ্জিনিয়ারিং গণনার সাথে প্রচুর কোড প্রয়োগ করেছি, তবে আমি এমন পরিস্থিতির কথা মনে করতে পারি না যেখানে আপনার পাওয়ার ফাংশন অবজেক্টের অনুরূপ কোনও পদ্ধতির সাহায্য করত (যদিও, পুনরুক্তিগুলি এমন একটি জিনিস যা আমাকে প্রতিদিন ভিত্তিতে মোকাবেলা করতে হয়)।

তদুপরি, আমি আপনার পাওয়ার ফাংশন উদাহরণে এমন কিছুই দেখতে পাচ্ছি না যা কৌশল প্যাটার্ন বা কমান্ড প্যাটার্নের প্রয়োগ হিসাবে ব্যাখ্যা করা যায়নি, যার অর্থ এই বেসিক অংশগুলি ইতিমধ্যে GoF বইয়ে রয়েছে are আরও ভাল সমাধানের মধ্যে অপারেটর ওভারলোডিং বা এক্সটেনশন পদ্ধতিগুলি থাকতে পারে তবে সেগুলি ভাষা বৈশিষ্ট্যের সাথে সম্পর্কিত এবং "গ্যাং" দ্বারা ব্যবহৃত "ওও মানে" সরবরাহ করতে পারেনি exactly


The problems solved by these patterns are so basic that many developers think their main purpose is to be workarounds for missing programming language featuresসফটওয়্যার বিকাশকারীরা নিয়মিতভাবে 20 বছরের পুরানো সফটওয়্যার ডিজাইনের ধরণগুলি ব্যবহার করেন এবং এখনও বিশ্বাস করেন যে তারা অত্যাধুনিক কোডটি লিখছেন The
রবার্ট হার্ভে

@ রবার্টহারভে: আমি মনে করি না অনেকগুলি ডিওএইও জিওএফ-র প্রস্তাবিত "ওও উপায়" অনুসারে পুনরাবৃত্তি প্যাটার্নটি আজ কার্যকর করবে। তারা ভাষা দ্বারা উপলব্ধ উপায়ে সাধারণত তা বাস্তবায়ন অথবা এটি (ব্যবহার করে C # উদাহরণস্বরূপ, মান lib এর IEnumerableএবং yield)। তবে অন্যান্য জিওএফ নিদর্শনগুলির জন্য, আপনি যা লিখেছেন তা সম্ভবত সত্য হতে পারে।
ডক ব্রাউন 21

1
workarounds for missing programming language features: Blog.plover.com/prog/johnson.html- এর
jrw32982 মনিকা

8

গ্যাং অফ ফোরের উদ্ধৃতি ক্রিস্টোফার আলেকজান্ডারের প্যাটার্ন সংজ্ঞা:

প্রতিটি প্যাটার্ন এমন সমস্যা বর্ণনা করে যা আমাদের পরিবেশে বারবার ঘটে এবং তারপরে সেই সমস্যার সমাধানের মূল বর্ণনা দেয় […]

পুনরাবৃত্তিকারীদের দ্বারা সমস্যাটি কী সমাধান করা হয়?

অভিপ্রায়: অন্তর্নিহিত উপস্থাপনাটি প্রকাশ না করে ক্রমান্বয়ে সামগ্রিক সামগ্রীর উপাদানগুলিকে অ্যাক্সেস করার একটি উপায় সরবরাহ করুন।

...

প্রযোজ্যতা: Iterator প্যাটার্ন ব্যবহার করুন

  • সামগ্রিক সামগ্রীর অভ্যন্তরীণ উপস্থাপনা প্রকাশ না করে সামগ্রীর সামগ্রীতে অ্যাক্সেস করতে
  • সামগ্রিক অবজেক্টের একাধিক ট্র্যাভারসালকে সমর্থন করতে
  • বিভিন্ন সমষ্টিগত কাঠামোকে ট্র্যাভার করার জন্য অভিন্ন ইন্টারফেস সরবরাহ করতে (যা বহুকোষী পুনরাবৃত্তি সমর্থন করে)।

সুতরাং যে কেউ তর্ক করতে পারে যে পুনরাবৃত্তি প্যাটার্ন সংজ্ঞা নির্দিষ্ট ডোমেন দ্বারা নির্দিষ্ট। এবং এটি পুরোপুরি ঠিক আছে। দোভাষী প্যাটার্নের মতো অন্যান্য নিদর্শনগুলি ডোমেন-নির্দিষ্ট-ভাষাগুলির জন্য ডোমেন-নির্দিষ্ট, কারখানার নিদর্শনগুলি তৈরির জন্য ডোমেন-নির্দিষ্ট… অবশ্যই এটি "ডোমেন-নির্দিষ্ট" এর একটি বরং বোকামি বোঝা। যতক্ষণ না এটি পুনরায় সমস্যা ur সমাধানের জোড়, ততক্ষণ আমরা এটিকে একটি প্যাটার্ন বলতে পারি।

এবং এটি ভাল যে ইটারেটর প্যাটার্ন বিদ্যমান। খারাপ জিনিস ঘটে যদি আপনি এটি ব্যবহার না করেন। আমার প্রিয় এন্টি-উদাহরণ পার্ল। এখানে প্রতিটি সংগ্রহ (অ্যারে বা হ্যাশ) সংগ্রহের অংশ হিসাবে পুনরাবৃত্তির রাজ্যকে অন্তর্ভুক্ত করে। কেন এই খারাপ? আমরা খুব সহজেই কিছুক্ষণের সাথে একটি হ্যাশ দিয়ে পুনরাবৃত্তি করতে পারি - প্রতিটি লুপ:

while (my ($key, $value) = each %$hash) {
  say "$key => $value";
}

কিন্তু যদি আমরা লুপের শরীরে কোনও ফাংশন বলি?

while (my ($key, $value) = each %$hash) {
  do_something_with($key, $value, $hash);
}

এই ফাংশনটি এখন যা খুশি তাই করতে পারে, ব্যতীত:

  • হ্যাশ এন্ট্রি যুক্ত বা মুছুন, যেহেতু এগুলি পুনরাবৃত্তির ক্রমটিকে অনাকল্পিতভাবে বদলে দেবে (সি ++ - তে কথা বলুন, এগুলি পুনরাবৃত্তকারীকে অবৈধ করে দেবে)।
  • কোনও অনুলিপি না করে একই হ্যাশ টেবিলটি পুনরাবৃত্তি করুন, যেহেতু এটি একই পুনরাবৃত্তির অবস্থা গ্রাস করবে। উফ।

যদি ডাকা ফাংশনটি পুনরুক্তি ব্যবহার করে তবে আমাদের লুপের আচরণটি সংজ্ঞায়িত হয়ে যায়। এটি একটি সমস্যা। এবং পুনরুক্তি প্যাটার্নটির একটি সমাধান রয়েছে: সমস্ত পুনরাবৃত্তি স্থিতি পৃথক বস্তুতে রাখুন যা প্রতি-পুনরাবৃত্তির জন্য তৈরি হয়।

হ্যাঁ, অবশ্যই পুনরাবৃত্তি প্যাটার্ন অন্যান্য নিদর্শনগুলির সাথে সম্পর্কিত। উদাহরণস্বরূপ, কীভাবে পুনরুক্তি করা হয় তাত্ক্ষণিক? জাভাতে, আমাদের একটি জেনেরিক Iterable<T>এবং Iterator<T>ইন্টারফেস রয়েছে। একটি কংক্রিট পুনরাবৃত্ত করার মতো ArrayList<T>একটি নির্দিষ্ট ধরণের পুনরুক্তি তৈরি করে, যেখানে HashSet<T>একটি সম্পূর্ণ ভিন্ন পুনরুক্তি টাইপ সরবরাহ করতে পারে। এটি আমাকে বিমূর্ত কারখানার প্যাটার্নের খুব স্মরণ করিয়ে দেয়, যেখানে Iterable<T>বিমূর্ত কারখানা এবং Iteratorএটি পণ্য।

একটি পলিমারফিক আইট্রেটর কৌশল কৌশল হিসাবে উদাহরণ হিসাবে ব্যাখ্যা করা যেতে পারে। যেমন একটি গাছ বিভিন্ন ধরণের পুনরাবৃত্তির প্রস্তাব দিতে পারে (প্রি-অর্ডার, ক্রম, অর্ডার, পোস্ট অর্ডার, ...)। বাহ্যিকভাবে, এগুলি একটি পুনরাবৃত্ত ইন্টারফেস এবং কিছু অনুক্রমের উপাদান উত্পাদন করে। ক্লায়েন্ট কোড কেবল পুনরুক্তি ইন্টারফেসের উপর নির্ভর করে, কোনও নির্দিষ্ট ট্রি ট্রভারসাল অ্যালগরিদমের উপর নির্ভর করে না।

একে অপরের থেকে স্বতন্ত্রভাবে বিচ্ছিন্নতায় প্যাটার্নগুলির অস্তিত্ব নেই। কিছু নিদর্শন একই সমস্যার বিভিন্ন সমাধান এবং কিছু নিদর্শন বিভিন্ন প্রসঙ্গে একই সমাধান বর্ণনা করে। কিছু নিদর্শন অন্যকে বোঝায়। এছাড়াও, আপনি যখন নকশা প্যাটার্নস বইয়ের শেষ পৃষ্ঠাটি ঘুরিয়েছেন তখন প্যাটার্ন স্পেসটি বন্ধ হবে না (আপনার আগের প্রশ্নটিও দেখুন গ্যাং অফ ফোর কী "প্যাটার্ন স্পেস" ভালভাবে আবিষ্কার করেছিল? )) ডিজাইন প্যাটার্নস বইতে বর্ণিত নিদর্শনগুলি অত্যন্ত নমনীয় এবং বিস্তৃত, অসীম প্রকরণের জন্য উন্মুক্ত এবং অস্তিত্বের একমাত্র নিদর্শন অবশ্যই এটি নয়।

আপনার তালিকাভুক্ত ধারণাগুলি (লিখন, চিত্রকলা, এনকোডিং) নিদর্শন নয় কারণ এগুলি কোনও সমস্যার সমাধান সমাধানের সংমিশ্রণটি বর্ণনা করে না। "আমাকে ডেটা লিখতে হবে" বা "আমার ডেটা এনকোড করা দরকার" এর মতো কাজটি আসলেই কোনও ডিজাইনের সমস্যা নয় এবং এর সমাধানও অন্তর্ভুক্ত নয়; একটি "সমাধান" যা কেবল "আমি জানি, আমি একটি লেখক শ্রেণি তৈরি করব" নিয়ে গঠিত অর্থহীন। তবে যদি আমাদের সমস্যা হয় "আমি চাই না যে অর্ধ-রেন্ডার করা গ্রাফিকগুলি পর্দায় আঁকা হোক", তবে একটি প্যাটার্ন উপস্থিত থাকতে পারে: "আমি জানি, আমি ডাবল-বাফার গ্রাফিক্স ব্যবহার করব!"


NIce উত্তর, ধন্যবাদ। তবুও পুরোপুরি নিশ্চিত নই যে আপনি শেষ অনুচ্ছেদে যা লিখেছেন তা এখানে প্রযোজ্য। আমি কী বলতে চাইছি তা বোঝাতে আমি আমার প্রশ্নটি সম্পাদনা করেছি।
ফ্রাঙ্ক পাফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.