প্রথম শ্রেণির ফাংশনগুলি কৌশল প্যাটার্নের বিকল্প কি?


15

স্ট্র্যাটেজি নকশা প্যাটার্ন প্রায়ই ভাষা তাদের অভাব মধ্যে প্রথম শ্রেণীর কাজগুলির জন্য একটি বিকল্প হিসেবে গণ্য করা হয়।

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

তবে আমি এটি সম্পর্কে ভাবছিলাম এবং সিদ্ধান্ত নিয়েছি যে কৌশল সম্ভবত একটি স্পষ্ট বেনাম কর্মের চেয়ে বেশি প্রস্তাব দেয়।

এর কারণ এটি যখন কোনও পদ্ধতি চালিত হয় তখন রাষ্ট্রটি ধরে রাখতে পারে যা পদ্ধতি চালিত হয় of তবে নিজেই একটি বেনামি ফাংশন কেবলমাত্র সেই রাষ্ট্রকে ধরে রাখতে পারে যা ফাংশনটি সম্পাদন শেষ করার মুহুর্তে উপস্থিতি বন্ধ করে দেয়।

প্রথম শ্রেণীর ফাংশনগুলিকে সমর্থন করে এমন একটি অবজেক্ট-ভিত্তিক ভাষায়, কৌশল পদ্ধতিতে কার্যকারিতা ব্যবহারের ক্ষেত্রে কোনও সুবিধা আছে কি?


10
"তবে কোনও অজ্ঞাত ক্রিয়াকলাপ কেবল তখনই সেই রাষ্ট্রকে ধরে রাখতে পারে যা এই ফাংশনটি সম্পাদনের কাজ শেষ করার মুহুর্তে বন্ধ হয়ে যায়" ": এটি সত্য নয়: একটি সমাপ্তি এমন রাষ্ট্রকে ধরে রাখতে পারে যা বিভিন্ন আহবান জুড়ে থাকে।
জর্জিও

"তবে নিজেই একটি বেনামি ফাংশন কেবলমাত্র সেই অবস্থা ধরে রাখতে পারে যা কার্য সম্পাদন শেষ হওয়ার মুহুর্তে উপস্থিতি বন্ধ করে দেয়" " : খুব কম সময়ে গ্লোবাল ভেরিয়েবল এবং স্থির ভেরিয়েবলগুলি ভুলে যাবেন না।
gbjbaanb

উত্তর:


13

ভাষা যখন ফাংশনটির রেফারেন্সগুলিকে সমর্থন করে ( জাভা 8 এর পরে সংস্করণ করে ) তখন কৌশলগুলির জন্য এগুলি প্রায়শই ভাল বিকল্প হয়, কারণ তারা সাধারণত একই জিনিসটি কম বাক্য গঠন সহ প্রকাশ করে। যাইহোক, কিছু ক্ষেত্রে রয়েছে যেখানে সত্যিকারের বস্তুটি কার্যকর হতে পারে।

কৌশল ইন্টারফেসে একাধিক পদ্ধতি থাকতে পারে। RouteFindingStragegyউদাহরণস্বরূপ একটি ইন্টারফেস গ্রহণ করা যাক , যা বিভিন্ন রুট সন্ধানের অ্যালগরিদমগুলিকে আবদ্ধ করে। এটি যেমন পদ্ধতি ঘোষণা করতে পারে

  • Route findShortestRoute(Node start, Node destination)
  • boolean doesRouteExist(Node start, Node destination)
  • Route[] findAllPossibleRoutes(Node start, Node destination)
  • Route findShortestRouteToClosestDestination(Node start, Node[] destinations)
  • Route findTravelingSalesmanRoute(Node[] stations)

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

আর একটি ক্ষেত্রে যখন কৌশলটির অভ্যন্তরীণ অবস্থা থাকে। অবশ্যই, কিছু ভাষায় বন্ধের অভ্যন্তরীণ অবস্থা থাকতে পারে, তবে যখন এই অভ্যন্তরীণ অবস্থাটি খুব জটিল হয়ে ওঠে, তখন প্রায়শই একটি পূর্ণাঙ্গ শ্রেণীর বন্ধকে প্রচার করার জন্য আরও মার্জিত হয়ে ওঠে।


2
"যখন এই অভ্যন্তরীণ অবস্থাটি খুব জটিল হয়ে যায়, প্রায়শই এটি একটি পূর্ণাঙ্গ শ্রেণীর ক্লোজারকে প্রচার করতে কার্যকর হয়": কেন? যদি অভ্যন্তরীণ অবস্থা জটিল হয়ে যায় তবে আপনি এটিকে ক্লোজেন্টের ভিতরে সংরক্ষণ করা কোনও অবজেক্ট / রেকর্ডেও রাখতে পারেন।
জর্জিও

1
@ জর্জিও কিন্তু তারপরে আপনার দুটি সিনট্যাক্স সত্ত্বা থাকবে - ক্লোজার এবং ক্লাস যা এর অভ্যন্তরীণ অবস্থা পরিচালনা করে। সুতরাং কোডটি ক্লাসে বন্ধ করে সরানো যায়। এটি আরও ভাল হতে পারে বা এটি নাও হতে পারে, যা সঠিক ব্যবহারের ক্ষেত্রে, প্রোগ্রামিংয়ের ভাষা এবং ব্যক্তিগত পছন্দের উপর নির্ভর করে।
ফিলিপ

এটা আমার কাছে যুক্তিসঙ্গত মতামত বলে মনে হচ্ছে।
জর্জিও 14

5

এটি সত্য নয় যে কোনও বেনামে ফাংশন কেবল তখনই স্থিতি রাখতে পারে যা ফাংশনটি সম্পাদনের কাজ শেষ করে exist

কমন লিস্পে নিম্নলিখিত উদাহরণটি ধরুন:

(defun number-strings (ss)
  (let ((counter 0))
    (mapcar #'(lambda (s) (format nil "~a: ~a" (incf counter) s)) ss)))

এই ফাংশনটি স্ট্রিংয়ের একটি তালিকা নেয় এবং তালিকার প্রতিটি উপাদানকে একটি কাউন্টারের জন্য প্রস্তুত করে। সুতরাং, উদাহরণস্বরূপ, চাওয়া

(number-strings '("a" "b" "c"))

দেয়

("1: a" "2: b" "3: c")

ফাংশনটি number-stringsঅভ্যন্তরীণভাবে একটি ভেরিয়েবলের সাথে একটি বেনামি ফাংশন counterব্যবহার করে যা রাষ্ট্রকে ধরে রাখে (কাউন্টারটির বর্তমান মান) যা প্রতিবার ফাংশনটি শুরু করার সময় পুনরায় ব্যবহৃত হয়।

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

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


সুতরাং এমন একটি ভাষায় যা ক্লোজার হিসাবে প্রথম শ্রেণির ফাংশনগুলিকে সমর্থন করে, আপনি কি এখনও 'ক্লাসিক' কৌশল ব্যবহার করবেন?
আভিভ কোহন

1
আমি ফিলিপের সাথে একমত হতে চাই: এটি ভাষা এবং ব্যক্তিগত পছন্দগুলির উপর নির্ভর করে। আমি সর্বদা এমন পদ্ধতিকে বেছে নেব যা স্বরলিপিটি যতটা সম্ভব সহজ করে তুলবে। উদাহরণস্বরূপ, লিস্পে আমি আমার রাষ্ট্রকে একটি এর মাধ্যমে ভেরিয়েবলের তালিকা হিসাবে সংজ্ঞায়িত করতে পারি letএবং তারপরে এটি আমার বন্ধের সংজ্ঞা দিতে পারি। মূলত, আমি ফ্লাইয়ের একটি পদ্ধতি সহ একটি বস্তুকে সংজ্ঞায়িত করতাম। অন্য একটি ভাষায় (যেমন জাভা) রাষ্ট্রকে ধরে রাখার জন্য কোনও উপযুক্ত অবজেক্টের সংজ্ঞা দেওয়া আরও সুবিধাজনক (সিনট্যাক্টিক্যালি সরল) হতে পারে। সুতরাং, আমি কেস থেকে কেস স্থির করব।
জর্জিও

1

কেবল দুটি ডিজাইন একই সমস্যার সমাধান করতে পারে তার অর্থ এই নয় যে তারা একে অপরের জন্য প্রত্যক্ষ বিকল্প।

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

আপনার আর্কিটেকচারটি দেখতে অন্যরকম দেখাবে, তবে আপনি একই লক্ষ্যটি অর্জন করবেন। একটি দৃষ্টান্তের নিদর্শনগুলি সরাসরি অন্যটিতে জোর করার চেষ্টা করবেন না।


"যদি আপনাকে কোনও কার্যকরী প্রোগ্রামে রাষ্ট্রের সন্ধান করতে হয় তবে ভাষাটি অনুমতি দেয় এমনকী আপনি একটি বদ্ধ পরিবর্তনশীলকে পরিবর্তিত করবেন না don't": আমি খাঁটিভাবে কার্যকরী শৈলীর একজন ভক্ত এবং আমি আপনার পরামর্শের সাথে একমত। অন্যদিকে, ক্লোজারগুলি কেবল একটি কার্যকরী নির্মাণ নয়, খাঁটি কার্যকরভাবেই চলুন। লেজিকাল প্রসঙ্গ থেকে ভেরিয়েবলগুলি বন্ধ করার ধারণাটি রেফারেন্সিয়াল স্বচ্ছতা / অপরিবর্তনীয়তার জন্য অরথোগোনাল।
জর্জিও

দুঃখিত, তবে আমি আপনার যুক্তিটি অনুসরণ করতে পারি না। খাঁটি ক্রিয়ামূলক প্রোগ্রামিংয়ে রাষ্ট্র পরিচালনার হাতের প্রশ্নটির সাথে কী সম্পর্ক আছে?
ফিলিপ

1
মুল বক্তব্যটি হ'ল আপনি যদি প্রথম শ্রেণীর ফাংশনের মতো একটি কার্যকরী দৃষ্টান্তের একটি অংশ ব্যবহার করেন তবে এটি সহজেই কাজ করার জন্য আপনাকে যদি দৃষ্টান্তের অন্যান্য অংশে টানতে হয় তবে অবাক হবেন না।
কার্ল বিলেফেল্ট

1

কৌশল হ'ল একটি ধারণা , একটি নির্দিষ্ট, পুনরাবৃত্তি সমস্যা সমাধানের জন্য একটি দরকারী রেসিপি। এটি কোনও ভাষা নির্মাণ নয়, এটি বাস্তবায়নের কোনও এক রূপই নয় । এক ক্লোজার একদিন কৌশল প্রয়োগ করতে এবং পরের দিন পর্যবেক্ষক ব্যবহার করা যেতে পারে।

মেয়াদ স্ট্র্যাটেজি বেশিরভাগই অন্য প্রোগ্রামারদের সাথে কথোপকথন সংক্ষেপে আপনার অভিপ্রায় প্রকাশ করার ক্ষেত্রে এটি সুবিধাজনক। এটি সম্পর্কে যাদুকর কিছুই নেই।


2
প্রশ্নটিতে সুনির্দিষ্টভাবে কৌশল নকশার প্যাটার্ন উল্লেখ করা হয়েছে যা একটি নির্দিষ্ট শ্রেণি কাঠামো রয়েছে। একটি নির্দিষ্ট লক্ষ্য অর্জনের উদ্দেশ্যে করা কর্ম পরিকল্পনা হিসাবে "কৌশল" এর অন্য অর্থ এই প্রসঙ্গে ভুল।

আমি @ স্নোম্যানের সাথে একমত হতে আগ্রহী। আপনি কি নিশ্চিত যে আপনি কৌশল নিদর্শন সম্পর্কে কথা বলছেন ?
রোয়ান ফ্রিম্যান

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