পার্শ্ব-প্রতিক্রিয়াযুক্ত ক্লোজারগুলি কি "কার্যকরী শৈলী" হিসাবে বিবেচিত হয়?


9

অনেক আধুনিক প্রোগ্রামিং ল্যাঙ্গুয়েজ ক্লোজারের কিছু ধারণাকে সমর্থন করে , অর্থাত্ কোডের একটি অংশ (একটি ব্লক বা কোনও ফাংশন) যা

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

এখানে স্কালায় লিখিত একটি বন্ধের উদাহরণ রয়েছে:

def filterList(xs: List[Int], lowerBound: Int): List[Int] =
  xs.filter(x => x >= lowerBound)

ফাংশন আক্ষরিকের x => x >= lowerBoundসাথে ফ্রি ভেরিয়েবল থাকে lowerBoundযা filterListএকই নামে ফাংশনের যুক্তির দ্বারা বন্ধ (আবদ্ধ) থাকে । বন্ধটি লাইব্রেরি পদ্ধতিতে পাস করা হয়েছে filter, যা এটি একটি সাধারণ ক্রিয়া হিসাবে বারবার প্রার্থনা করতে পারে।

আমি এই সাইটে প্রচুর প্রশ্ন এবং উত্তর পড়ছি এবং যতদূর আমি বুঝতে পারি, বন্ধ শব্দটি প্রায়শই স্বয়ংক্রিয়ভাবে ফাংশনাল প্রোগ্রামিং এবং কার্যকরী প্রোগ্রামিং শৈলীর সাথে যুক্ত হয় ।

উইকিপিডিয়ায় ফাংশন প্রোগ্রামিংয়ের সংজ্ঞাটি পড়ে:

কম্পিউটার সায়েন্সে, ফাংশনাল প্রোগ্রামিং হ'ল একটি প্রোগ্রামিং দৃষ্টান্ত যা গণনাটিকে গণিতের ফাংশনগুলির মূল্যায়ন হিসাবে গণ্য করে এবং রাষ্ট্র এবং পরিবর্তনীয় ডেটা এড়িয়ে চলে ids এটি অত্যাবশ্যক প্রোগ্রামিং শৈলীর বিপরীতে ফাংশনগুলির প্রয়োগের উপর জোর দেয়, যা রাষ্ট্রের পরিবর্তনের উপর জোর দেয়।

এবং আরও

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

অন্যদিকে, প্রোগ্রামিং ল্যাঙ্গুয়েজের সরবরাহিত অনেক ক্লোজার কনস্ট্রাক্টস একটি ক্লোজারকে অ-স্থানীয় ভেরিয়েবলগুলি ক্যাপচার করতে এবং ক্লোজারটি আহ্বান করা হলে তাদের পরিবর্তন করার অনুমতি দেয়, এইভাবে তারা যে পরিবেশে সংজ্ঞায়িত হয়েছিল তার উপর একটি পার্শ্ব প্রতিক্রিয়া তৈরি করে।

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

পার্শ্ব প্রতিক্রিয়াযুক্ত ক্লোজারগুলির এই ব্যবহারটি কি কার্যকরী শৈলী হিসাবে বিবেচিত হয় বা বন্ধগুলি আরও সাধারণ নির্মাণ হিসাবে বিবেচিত হয় যা কার্যকরী এবং অ-কার্যকরী প্রোগ্রামিং স্টাইল উভয়ের জন্য ব্যবহার করা যেতে পারে? এই বিষয়ে কোন সাহিত্য আছে?

গুরুত্বপূর্ণ তথ্য

আমি পার্শ্ব প্রতিক্রিয়াগুলির উপযোগিতা বা পার্শ্ব প্রতিক্রিয়াগুলির সাথে ক্লোজার হওয়ার বিষয়ে প্রশ্ন করছি না। এছাড়াও, আমি পার্শ্ব প্রতিক্রিয়াগুলি ছাড়াই বা ছাড়াই ক্লোজারগুলির সুবিধা / অসুবিধাগুলি সম্পর্কে আলোচনায় আগ্রহী নই।

আমি কেবল জানতে আগ্রহী যে এই ধরণের বন্ধগুলি ব্যবহার করা এখনও কার্যকরী প্রোগ্রামিংয়ের প্রবক্তার দ্বারা কার্যকরী শৈলী হিসাবে বিবেচিত হয় বা যদি বিপরীতে, কার্যকরী শৈলী ব্যবহার করার সময় তাদের ব্যবহারকে নিরুৎসাহিত করা হয়।


3
একটি সম্পূর্ণরূপে কার্যক্ষম শৈলীতে / ভাষায়, পার্শ্ব প্রতিক্রিয়া অসম্ভব ... সুতরাং আমি অনুমান করি এটি একটি বিষয় হতে পারে: কোনটি বিশুদ্ধতার স্তরে কোডকে কার্যক্ষম বলে বিবেচনা করে?
স্টিভেন ইভার্স

@ স্নোফারস: ১০০%?
জর্জিও

1
পার্শ্ব প্রতিক্রিয়াগুলি সম্পূর্ণরূপে কার্যকরী ভাষায় অসম্ভব, যাতে আপনার প্রশ্নের উত্তর দেওয়া উচিত।
স্টিভেন ইভার্স

@ এসএনআরফাস: অনেক ভাষায় ক্লোজারগুলি একটি কার্যকরী প্রোগ্রামিং কনস্ট্রাক্ট হিসাবে বিবেচিত হয়, তাই আমি কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম। আমার কাছে মনে হয় (1) তাদের ব্যবহার কেবল এফপি করার চেয়ে বেশি সাধারণ, এবং (2) ক্লোজারগুলি ব্যবহার করে কোনও স্বয়ংক্রিয়ভাবে কোনও কার্যকরী শৈলী ব্যবহার করছে কিনা তা গ্যারান্টি দেয় না।
জর্জিও

ডাউনওয়োটার কীভাবে এই প্রশ্নের উন্নতি করতে পারে তার একটি নোট রাখতে পারেন?
জর্জিও

উত্তর:


7

না; কার্যকরী দৃষ্টান্তের সংজ্ঞাটি রাষ্ট্রের অভাব এবং স্পষ্টত পার্শ্ব-প্রতিক্রিয়াগুলির অভাব সম্পর্কে। এটি হাই-অর্ডার ফাংশন, বন্ধকরণ, ভাষা সমর্থিত তালিকার ম্যানিপুলেশন বা অন্য ভাষার বৈশিষ্ট্যগুলি সম্পর্কে নয় ...

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

এটি অবশ্যই একটি খুব সরলীকৃত দৃশ্য।


3
উচ্চ-অর্ডার ফাংশনগুলির মিউটেবিলিটির সাথে একেবারে করার মতো কিছুই নেই, না প্রথম শ্রেণির ক্রিয়াকলাপ। আমি কোনও পরিবর্তনীয় অবস্থা বা পার্শ্ব প্রতিক্রিয়া ছাড়াই খুব সহজেই হাস্কেলে এগুলি থেকে অন্যান্য ক্রিয়াকলাপগুলি পাস করতে পারি এবং তাদের থেকে অন্য ফাংশনগুলি তৈরি করতে পারি।
tmadmers

@tdammers আমি সম্ভবত খুব স্পষ্টভাবে প্রকাশ করি নি; যখন আমি বলেছিলাম যে ফাংশনগুলি পরিবর্তনযোগ্য হয়ে উঠেছে আমি ডেটা পরিবর্তনের বিষয়টি উল্লেখ করিনি তবে একটি ফাংশনের আচরণ পরিবর্তন করা যেতে পারে (হাই-অর্ডার ফাংশন দ্বারা) to
m3th0dman

একটি উচ্চতর আদেশ ক্রিয়াকলাপ একটি বিদ্যমান ফাংশন পরিবর্তন করতে হবে না; বেশিরভাগ পাঠ্যপুস্তকের উদাহরণগুলি বিদ্যমান ফাংশনগুলিকে একেবারে কোনও সংশোধন না করে একত্রিত করে - mapউদাহরণস্বরূপ, যা কোনও ফাংশন নেয়, এটি একটি তালিকায় প্রয়োগ করে এবং ফলাফলগুলির একটি তালিকা ফেরত দেয়। mapএটির কোনও যুক্তি সংশোধন করে না, এটি তর্ক হিসাবে বিবেচিত ফাংশনটির আচরণকে পরিবর্তন করে না, তবে এটি অবশ্যই উচ্চতর অর্ডার ফাংশন - যদি আপনি এটি আংশিকভাবে প্রয়োগ করেন, কেবলমাত্র ফাংশন প্যারামিটার দিয়ে, আপনি একটি নির্মাণ করেছেন নতুন ফাংশন যা একটি তালিকায় কাজ করে তবে এখনও কোনও রূপান্তর ঘটেনি।
tmadmers

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

@Giorgio: সর্বোত্তম FP ভাষায় অধিকাংশ না পরিবর্তনশীলতা আছে; হাস্কেলই কেবলমাত্র আমি আমার মাথার উপরের অংশটি ভাবতে পারি যা কোনওভাবেই পরিবর্তনকে মঞ্জুরি দেয় না। তবুও, পরিবর্তনীয় অবস্থা এড়ানো এফপিতে একটি গুরুত্বপূর্ণ মান।
টিডামার্স

9

"ফাংশনাল স্টাইল" পার্শ্ব-প্রভাব-মুক্ত প্রোগ্রামিংকে বোঝায়।

কেন, এক্সটেনশন পদ্ধতি সম্পর্কে এরিক লিপার্টের ব্লগ এন্ট্রিটি দেখুনForEach<T> এবং কেন মাইক্রোসফ্ট লিনকের মতো সিকোয়েন্স পদ্ধতি অন্তর্ভুক্ত করলো না তা দেখুন :

আমি দার্শনিকভাবে দুটি কারণে এই জাতীয় পদ্ধতি সরবরাহের বিরোধী।

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

দ্বিতীয় কারণ হ'ল এটি করা ভাষাতে শূন্য নতুন প্রতিনিধিত্বমূলক শক্তি যোগ করে। এটি করার ফলে আপনি এটি পুরোপুরি পরিষ্কার কোডটি আবার লিখতে পারবেন:

foreach(Foo foo in foos){ statement involving foo; }

এই কোডে:

foos.ForEach((Foo foo)=>{ statement involving foo; });

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


1
যদিও, আমি তাঁর সাথে একমত ... তাঁর যুক্তি বিবেচনা করার সময় কিছুটা দুর্বল হয়ে যায় ParallelQuery<T>.ForAll(...)IEnumerable<T>.ForEach(...)ডিবেগিং ForAllস্টেটমেন্টগুলির জন্য এ জাতীয় বাস্তবায়ন অত্যন্ত কার্যকর (এর ForAllসাথে প্রতিস্থাপন করুন ForEachএবং মুছে ফেলুন AsParallel()এবং আপনি আরও সহজেই এটিকে ডিবাগ / ডিবাগের মাধ্যমে পদক্ষেপ নিতে পারেন)
স্টিভেন ইভার্স

স্পষ্টত জো ডাফির বিভিন্ন ধারণা রয়েছে। : ডি
রবার্ট হার্ভে

স্কালা হয় না খাঁটিতা প্রয়োগ করে: আপনি একটি উচ্চ-আদেশ ক্রিয়াকলাপে একটি খাঁটি বন্ধ বন্ধ করতে পারেন। আমার ধারণাটি হ'ল একটি বন্ধের ধারণাটি কার্যকরী প্রোগ্রামিংয়ের ক্ষেত্রে নির্দিষ্ট নয় তবে এটি আরও সাধারণ ধারণা idea
জর্জিও

5
@ জর্জিও: বন্ধকে এখনও বন্ধ বলে বিবেচনা করার জন্য খাঁটি হতে হবে না। তাদের খাঁটি হতে হবে, তবে "ফাংশনাল স্টাইল" হিসাবে বিবেচনা করতে হবে।
রবার্ট হার্ভে

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

0

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

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

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.