বৈষম্যমূলক ইউনিয়নগুলি কার্যকরী প্রোগ্রামিংয়ের সাথে যুক্ত কেন?


30

ওও প্রোগ্রামিংয়ের বহু বছরের মধ্যে আমি বুঝতে পেরেছি যে বৈষম্যমূলক ইউনিয়নগুলি কী, তবে আমি কখনই সেগুলি মিস করি না। আমি সম্প্রতি সি # তে কিছু কার্যকরী প্রোগ্রামিং করছি এবং এখন আমি দেখতে পেয়েছি যে আমি সেগুলি রাখি। এটি আমাকে বিস্মিত করছে কারণ এটির মুখোমুখি হয়ে, বৈষম্যমূলক ইউনিয়নগুলির ধারণাটি কার্যকরী / ওও দ্বৈতত্ত্বের থেকে বেশ স্বতন্ত্র বলে মনে হয়।

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


অভিব্যক্তি সমস্যা en.wikipedia.org/wiki/Expression_problem প্রাসঙ্গিক হতে পারে
xji

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

উত্তর:


45

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

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

মৌলিক পার্থক্য হ'ল ডেটা এবং আচরণ ফাংশনাল প্রোগ্রামিংয়ে পৃথক, যখন তথ্য এবং আচরণ ওওতে একত্রে আবদ্ধ হয়।

এটি historicalতিহাসিক কারণ। সি # এর মতো একটি ভাষা আরও বেশি করে ফাংশন বৈশিষ্ট্যগুলিকে অন্তর্ভুক্ত করে একটি ক্লাসিক ওও ভাষা থেকে বহু-দৃষ্টান্তের ভাষায় বিকাশ করছে।


6
একটি বৈষম্যমূলক ইউনিয়ন / সমষ্টি প্রকারের উত্তরাধিকার গাছ বা ইন্টারফেস প্রয়োগকারী একাধিক শ্রেণীর মতো নয়; এটি বিভিন্ন ধরণের মান সহ এক ধরণের। এগুলি এনক্যাপসুলেশন প্রতিরোধ করে না; ক্লায়েন্টের আপনার একাধিক ধরণের মান আছে তা জানতে হবে না। একটি লিঙ্কযুক্ত তালিকা বিবেচনা করুন, যা হয় খালি নোড, অথবা একটি মান এবং অন্য নোডের একটি রেফারেন্স হতে পারে। যোগফলের ধরণ ছাড়াই আপনি মান এবং রেফারেন্সের জন্য ভেরিয়েবল রেখে বৈষম্যমূলক ইউনিয়নকে একসাথে হ্যাকিংয়ের সমাপ্তি করে ফেলেছেন, তবে কোনও বস্তুকে শূন্য নোড হিসাবে নাল রেফারেন্সের সাথে চিকিত্সা করা এবং মান ভেরিয়েবলের অস্তিত্ব নেই।
ডোভাল

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

7
@ ডভাল একটি ইন্টারফেস / অ্যাবস্ট্রাক্ট বেস ক্লাসটি সামগ্রিকভাবে প্রতিনিধিত্ব করে এবং প্রকারের প্রতিটি ক্ষেত্রে একটি সাবক্লাস রেখে ক্লাসে বীজগণিত ডেটা টাইপের একটি "স্ট্যান্ডার্ড" এনকোডিং রয়েছে। প্যাটার্ন ম্যাচিং হ্যান্ডেল করার জন্য, আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা প্রতিটি ক্ষেত্রে ফাংশন গ্রহণ করে, সুতরাং শীর্ষস্থানীয় ইন্টারফেসে থাকা তালিকার জন্য, List<A>পদ্ধতিটি B Match<B>(B nil, Func<A,List<A>,B> cons)। উদাহরণস্বরূপ, স্মার্টটাকটি বুলিয়ানগুলির জন্য ঠিক একই ধরণের ব্যবহার করে। এটিও মূলত স্ক্যালাল এটিকে পরিচালনা করে। যে একাধিক ক্লাস ব্যবহৃত হয় তা বাস্তবায়নের বিশদ যা প্রকাশ করা দরকার না।
ডেরেক এলকিন্স

3
@ ডোভাল: নাল রেফারেন্সের জন্য স্পষ্টভাবে চেক করা সত্যই আইডেম্যাটিক ওও হিসাবে বিবেচিত হয় না।
জ্যাকবিবি

@ জ্যাকউসবি নাল চেকটি বাস্তবায়নের বিশদ। লিঙ্কযুক্ত তালিকার ক্লায়েন্টের জন্য সাধারণত একটি isEmptyপদ্ধতি থাকে যা পরের নোডের রেফারেন্সটি বাতিল হয় কিনা তা পরীক্ষা করে।
ডোভাল

35

ফাংশনাল প্রোগ্রামিং শেখার আগে পাস্কাল এবং অ্যাডায় প্রোগ্রাম করার পরে, আমি বৈষম্যমূলক ইউনিয়নগুলিকে কার্যকরী প্রোগ্রামিংয়ের সাথে যুক্ত করি না।

বৈষম্যমূলক ইউনিয়নগুলি কোনওভাবে উত্তরাধিকার দ্বৈত। প্রথমে নির্দিষ্ট ধরণের সেটগুলিতে সহজেই অপারেশন যুক্ত করার অনুমতি দেয় (ইউনিয়ন যারা) এবং উত্তরাধিকার নির্দিষ্ট অপারেশনগুলির একটি নির্দিষ্ট সেট সহ সহজেই প্রকারগুলি যুক্ত করতে দেয়। (কীভাবে উভয়কে সহজে যুক্ত করা যায় তাকে এক্সপ্রেশন সমস্যা বলা হয় ; এটি একটি স্ট্যাটিক টাইপ সিস্টেম সহ ভাষাগুলির জন্য বিশেষত একটি কঠিন সমস্যা))

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


7

ওও হিসাবে ব্যবহৃত প্রায়শই প্রোগ্রামিং কৌশলগুলি প্রায়শই দুটি ধরণের উপর নির্ভর করে:

  1. সফল বা ব্যতিক্রম নিক্ষেপ,
  2. null"কোনও মূল্য নেই" বা ব্যর্থতা নির্দেশ করতে ফিরে যান।

কার্যকরী দৃষ্টান্ত সাধারণত উভয়টি এড়িয়ে যায়, এমন যৌগিক প্রকারটি ফেরত দেওয়া পছন্দ করে যা সাফল্য / ব্যর্থতার কারণ বা মান / কোন মূল্যকে নির্দেশ করে।

বৈষম্যমূলক ইউনিয়নগুলি এই যৌগিক প্রকারের জন্য বিলটি ফিট করে। উদাহরণস্বরূপ, প্রথম উদাহরণে, আপনি ফিরে আসতে পারেন true, বা কিছু ডেটা স্ট্রাকচার যা ব্যর্থতা বর্ণনা করে। দ্বিতীয় ক্ষেত্রে, একটি ইউনিয়ন যার মধ্যে একটি মান, বা none, nilইত্যাদি রয়েছে The দ্বিতীয় ক্ষেত্রেটি এত সাধারণ, যে অনেকগুলি কার্যকরী ভাষায় "সম্ভবত" বা "বিকল্প" টাইপ অন্তর্নির্মিত থাকে সেই মান / কোনও ইউনিয়নকে উপস্থাপন করতে।

উদাহরণস্বরূপ, সি # দিয়ে কোনও কার্যকরী শৈলীতে স্যুইচ করার সময় আপনি দ্রুত এই যৌগিক প্রকারের জন্য প্রয়োজনীয়তা খুঁজে পাবেন। void/throwএবং nullঠিক এই জাতীয় কোড সহ সঠিক বোধ করবেন না। এবং বৈষম্যমূলক ইউনিয়নগুলি (Uাবি) বিলটি পুরোপুরি ফিট করে। এইভাবে আপনি আমাদের অনেকের মতোই নিজেকে সেগুলি চাওয়ার মতো দেখতে পেয়েছেন।

সুসংবাদটি হ'ল এখানে প্রচুর গ্রন্থাগার রয়েছে যা মডেল Dাবির উদাহরণস্বরূপ সি # (উদাহরণস্বরূপ আমার নিজের সুকসিন <টি> লাইব্রেরিতে দেখুন)।


2

মূলধারার ওও ভাষাগুলিতে যোগফলগুলি সাধারণত কম কার্যকর হবে কারণ তারা ওও সাব টাইপিংয়ের ক্ষেত্রে একই ধরণের সমস্যা সমাধান করছে। তাদের দেখার একটি উপায় হ'ল তারা উভয়ই সাব টাইপিং পরিচালনা করে তবে ওও হ'ল openএকজন প্যারেন্ট টাইপের মধ্যে স্বেচ্ছাসেবী সাব-টাইপ যুক্ত করতে পারে এবং যোগফলগুলি হ'ল একটি সাব-টাইপগুলি closedবৈধ কিনা তা সামনে নির্ধারণ করে।

এখন, অনেক ওও ভাষাগুলি সাব-টাইপগুলি অন্যান্য ধারণার সাথে যেমন উত্তরাধিকারসূত্রে প্রাপ্ত স্ট্রাইকস, পলিমারফিজম, রেফারেন্স টাইপিং ইত্যাদির সাথে একত্রিত করে সাধারণত এগুলিকে আরও কার্যকর করে তোলে। এর পরিণতি হ'ল তারা আরও কাজ করার ঝোঁক রাখে (ক্লাস এবং কন্সট্রাক্টর এবং হোয়াট নোট সহ) যাতে জেনেরিক টাইপিং সাধারণ না হওয়া অবধি Resultএস এবং Optionএস ইত্যাদির জন্য ব্যবহার না করা হয় ।

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

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


বিটিডাব্লু: স্কালার উত্তরাধিকার বন্ধ রয়েছে। sealedমানে "কেবল একই সংকলন ইউনিটে প্রসারিত হতে পারে", যা আপনাকে নকশাকালীন সময়ে সাবক্লাসগুলির সেটটি বন্ধ করতে দেয়।
Jörg ডব্লু মিটাগ

-3

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

সুতরাং "বৈষম্যমূলক ইউনিয়নগুলি কার্যকরী প্রোগ্রামিংয়ের সাথে জড়িত" এই ভিত্তিটি ভুল।

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