সম্পূর্ণরূপে কার্যকরী ভাষাগুলি কীভাবে মডুলারিটি পরিচালনা করে?


23

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

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

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


1
আপনি কেন ভাবেন যে কার্যকরী বলতে ক্লাস বোঝায় না? - মূল নিয়ম বা ক্লাস কিছু পাতার মর্মর থেকে এসেছিলেন Clos clojure তাকান নামব্যবধান এবং ধরনের বা মডিউল এবং Haskell

আমি যে ফাংশনাল ভাষাগুলির ক্লাস নেই সেগুলি উল্লেখ করেছিলাম, আমি যে কয়েকটি করণীয় তা সম্পর্কে খুব ভালভাবে জানি
ইলেকট্রিক কফি

1
ক্যামেলের উদাহরণ হিসাবে এটির বোন ভাষা ওক্যামেল বস্তুগুলি যুক্ত করে, তবে ক্যামেল নিজেই সেগুলিতে নেই।
ইলেকট্রিক কফি

12
"বিশুদ্ধভাবে কার্যকরী" শব্দটি কার্যকরী ভাষাগুলিকে বোঝায় যা রেফারেনশিয়াল স্বচ্ছতা বজায় রাখে এবং ভাষার কোনও অবজেক্ট ওরিয়েন্টেড বৈশিষ্ট্য আছে কিনা তা সম্পর্কিত নয়।
sepp2k

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

উত্তর:


19

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

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

ওটিওএইচ, হাস্কেল এবং এমএল পরিবারের একটি সুস্পষ্ট মডিউল সিস্টেম রয়েছে।

অবজেক্ট ওরিয়েন্টেশন তথ্য বিমূর্তি সম্পর্কে। এটাই. পরিমিতি, উত্তরাধিকার, পলিমারফিজম, এমনকি পরিবর্তনীয় অবস্থাও অরথোগোনাল উদ্বেগ।


8
ওপ সম্পর্কিত কিছু বিষয় নিয়ে কীভাবে এই জিনিসগুলি কাজ করে তা আপনি ব্যাখ্যা করতে পারেন? পরিবর্তে ধারণাগুলি উপস্থিত রয়েছে তা উল্লেখ করার চেয়ে ...
বৈদ্যুতিন কফি

সিডিনোট - র‌্যাকেটে মডিউল এবং ইউনিট দুটি পৃথক গঠন - মডিউলগুলি নেমস্পেসের সাথে তুলনীয়, এবং ইউনিটগুলি নেমস্পেস এবং ওও ইন্টারফেসের মধ্যে অর্ধেকভাবে সাজানো। ডক্স পার্থক্য অনেক বেশী বিস্তারিত ঢোকা
জ্যাক

@ জ্যাক: আমি জানতাম না যে র্যাকেটেরও একটি ধারণা রয়েছে module। আমি মনে করি এটি দুর্ভাগ্যজনক যে র‌্যাকেটের এমন একটি ধারণা আছে moduleযা বলে একটি মডিউল নয়, এবং এমন একটি ধারণা যা মডিউল তবে ডাকা হয় না module। যাইহোক, আপনি লিখেছেন: "ইউনিটগুলি নেমস্পেস এবং ওও ইন্টারফেসের মধ্যে অর্ধেক ধরণের"। ভাল, একটি মডিউল কি সংজ্ঞা এর সাজানোর না?
Jörg W Mittag

মডিউল এবং ইউনিট দুটি মানের নামের সাথে আবদ্ধ groups মডিউলগুলির সাথে বাইন্ডিংয়ের অন্যান্য নির্দিষ্ট সেটগুলির উপর নির্ভরতা থাকতে পারে , অন্যদিকে ইউনিটগুলির কিছু সাধারণ সেট বাইন্ডিংয়ের উপর নির্ভরতা থাকতে পারে যা ইউনিট ব্যবহার করে এমন অন্য কোনও কোড সরবরাহ করতে পারে। ইউনিটগুলি বাইন্ডিংগুলির মাধ্যমে পরামিতি করা হয়, মডিউলগুলি হয় না। একটি বাঁধার উপর নির্ভরশীল একটি মডিউল mapএবং একটি বাঁধার উপর নির্ভরশীল একটি ইউনিট mapপৃথক যে মডিউলটি অবশ্যই নির্দিষ্ট নির্দিষ্ট mapবাইন্ডিংকে বোঝায় , যেমনটির একটি racket/base, অন্যদিকে ইউনিটের বিভিন্ন ব্যবহারকারী ইউনিটের বিভিন্ন সংজ্ঞা দিতে mapপারে।
জ্যাক

4

দেখে মনে হচ্ছে আপনি দুটি প্রশ্ন জিজ্ঞাসা করছেন: "আপনি কীভাবে কার্যকরী ভাষায় মডুলারিটি অর্জন করতে পারেন?" যা অন্যান্য উত্তরের সাথে মোকাবিলা করা হয়েছে এবং "আপনি কীভাবে কার্যকরী ভাষায় বিমূর্ততা তৈরি করতে পারেন?" যা আমি উত্তর দেব।

ওও ভাষাগুলিতে, আপনি বিশেষ্য, "একটি প্রাণী", "মেলসার্ভার", "তার বাগানের কাঁটা" ইত্যাদিতে মনোনিবেশ করার প্রবণতা ব্যবহারিক ভাষা, বিপরীতে, ক্রিয়াপদের উপর জোর দিয়ে, "চলতে", "মেল আনতে" , "টু প্রোড" ইত্যাদি

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

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

এটি বিমূর্ততার একটি উল্লেখযোগ্য সাধারণ ফর্ম, তবে এটি কেবল কার্যকরী ভাষায় উপলভ্য নয়।


4

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

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

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

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

নীচে হাস্কেল- এবং ওসিএএমএল-নির্দিষ্ট লিঙ্কগুলি এক্সপ্রেশন সমস্যাটিতে প্রসারিত হচ্ছে :


2
এই সংস্থানগুলি কী করে সে সম্পর্কে আরও ব্যাখ্যা করতে আপনি কি আপত্তি করবেন এবং কেন আপনি জিজ্ঞাসিত প্রশ্নের উত্তর হিসাবে এগুলি সুপারিশ করবেন? "লিঙ্ক কেবল-উত্তর" বেশ স্ট্যাক এক্সচেঞ্জ এ স্বাগত জানাই হয় না
মশা

2
আমি সম্পাদনা হিসাবে কেবল লিঙ্কগুলির পরিবর্তে একটি প্রকৃত উত্তর সরবরাহ করেছি।
lukstafi

0

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

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

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

আপনার Animalউদাহরণ নিন এবং একটি খাওয়ানো বৈশিষ্ট্য বাস্তবায়নের বিবেচনা করুন। সোজা ও ওওপি বাস্তবায়ন হ'ল Animalঅবজেক্টের সংগ্রহ বজায় রাখা এবং সেগুলির feedপ্রতিটিতে পদ্ধতিটি কল করে লুপ করা ।

যাইহোক, আপনি বিশদে নেমে গেলে জিনিসগুলি জটিল হয়ে ওঠে। কোনও Animalবস্তু স্বাভাবিকভাবেই জানে যে এটি কী ধরণের খাবার খায় এবং পূর্ণ বোধ করার জন্য এটি কতটা প্রয়োজন। এটি খাবারটি কোথায় রাখা হয়েছে এবং কতটা পাওয়া যায় তা স্বাভাবিকভাবেই জানে না , তাই কোনও FoodStoreবস্তু কেবলমাত্র বস্তুর Animalক্ষেত্র হিসাবে Animal, বা feedপদ্ধতির পরামিতি হিসাবে উত্তীর্ণ হয়ে প্রত্যেকটির নির্ভরতা হয়ে দাঁড়িয়েছে । পর্যায়ক্রমে, Animalক্লাসটিকে আরও সংযুক্ত রাখার জন্য আপনি অবজেক্টে চলে যেতে feed(animal)পারেন FoodStore, বা আপনি এমন কোনও শ্রেণীর একটি ঘৃণা তৈরি করতে পারেন যা একটি AnimalFeederবা এই জাতীয় কিছু বলে ।

এফপিতে, Animalসর্বদা একত্রে গোষ্ঠীবদ্ধ থাকার ক্ষেত্রগুলির জন্য কোনও ঝোঁক নেই , যা পুনরায় ব্যবহারযোগ্যতার জন্য কিছু আকর্ষণীয় বিষয় রয়েছে। আপনার একটি তালিকা আছে বলুন Animalরেকর্ড, ক্ষেত্র মতো name, species, location, food type, food amount, ইত্যাদি এছাড়াও আপনি একটি তালিকা আছে FoodStoreরেকর্ড মত ক্ষেত্রের সাথে location, food typeএবং food amount

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

আপনি [(Num A, Eq B)]পুনরায় ব্যবহারযোগ্য এবং মডিউলারের সাথে দরকারী স্টাফগুলি করে এমন একটি ফাংশনের সমাপ্তি শেষ করেছেন তবে সেগুলি কোথায় রাখবেন বা তাদেরকে একটি গ্রুপ হিসাবে কী ডাকা হবে তা নির্ধারণ করতে আপনার সমস্যা হয়। এর প্রভাবটি হ'ল এফপি মডিউলগুলি শ্রেণীবদ্ধ করা আরও কঠিন, তবে শ্রেণিবিন্যাস খুব কম গুরুত্বপূর্ণ।


-1

জনপ্রিয় সমাধানগুলির মধ্যে একটি হ'ল কোডটি মডিউলগুলিতে বিভক্ত করা, এটি জাভাস্ক্রিপ্টে এটি কীভাবে করা হচ্ছে তা এখানে:

    media.podcast = (function(name) {
    var fileExtension = 'mp3';        

     function determineFileExtension() {
         console.log('File extension is of type ' + fileExtension);
     }

     return {
         download: function(episode) {
            console.log('Downloading ' + episode + ' of ' + name);
            determineFileExtension();
        }
    }    
}('Astronomy podcast'));

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

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