ক্রিয়ামূলক প্রোগ্রামিং সমস্যা এবং সমাধানের মধ্যে 'প্রতিনিধিত্বমূলক ফাঁক' বাড়ায়? [বন্ধ]


18

যেহেতু মেশিন ল্যাঙ্গুয়েজ (যেমন, 0110101000110101) কম্পিউটার ভাষাগুলি সাধারণত বিমূর্ততার উচ্চতর রূপগুলিতে বিকশিত হয়েছে, সাধারণত কোনও সমস্যায় প্রয়োগ করা হয় তখন কোড বোঝা সহজ করে তোলে। এসেম্ব্লার মেশিন কোডের উপরে বিমূর্ততা ছিল, সি ছিল এসেম্বলারের উপর বিমূর্ততা ইত্যাদি etc.

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

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

সমবর্তী প্রোগ্রামিংয়ের ক্ষেত্রে আমি এফপির সুবিধাগুলি বুঝতে পারি। তবে আমি কি কিছু মিস করছি, বা এফপি কি প্রতিনিধিত্বমূলক ফাঁক হ্রাস করার বিষয়ে নয় (সমাধানগুলি বোঝা সহজ করে)?

এটি জিজ্ঞাসা করার আরেকটি উপায়: একই বাস্তব-বিশ্ব সমস্যা সমাধানকারী 10 টি বিভিন্ন দলের এফপি কোডটিতে কি অনেক মিল রয়েছে?


অ্যাবস্ট্রাকশন (কম্পিউটার সায়েন্স) ( উইকিপিডিয়া খনি) এর উইকিপিডিয়া থেকে :

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

প্রতিনিধিত্বমূলক ব্যবধানটি সম্ভাব্যভাবে বাড়ানো যেতে পারে, কারণ [কিছু] রিয়েল-ওয়ার্ল্ড সমস্যাগুলি এ জাতীয় বিমূর্ততার সাথে সহজেই মডেল হয় না।


প্রতিনিধিত্বমূলক ব্যবধান হ্রাস হবার আরেকটি উপায় হ'ল সমাধানের উপাদানগুলিকে সমস্যার দিকে ফিরে পাওয়া। 0'S এবং 1মেশিন কোডে গুলি, ফিরে ট্রেস যেহেতু খুব কঠিন Studentবর্গ ফিরে ট্রেস করা সহজ। সমস্ত ওও ক্লাসগুলি সমস্যার জায়গাগুলিতে খুব সহজে ট্রেস করে না, তবে অনেকেই করেন।

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


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

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


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

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

  • বিদ্যমান কার্যকরী প্রোগ্রামগুলি এমন একটি স্কেল যা ডিজাইনের প্রয়োজন হয় না। অনেকগুলি কার্যকরী প্রোগ্রামগুলি ছোট, তবে অন্যান্য যেমন গ্লাসগো হাস্কেল সংকলক যথেষ্ট পরিমাণে।

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

  • কার্যকরী প্রোগ্রামগুলি বিকাশমান সিরিজের প্রোটোটাইপ হিসাবে নির্মিত।

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

কোনটি দৃষ্টান্তটি সফ্টওয়্যার বিকাশের জন্য সর্বোত্তম সমর্থন সরবরাহ করে সে সম্পর্কে দীর্ঘক্ষণ তর্ক করতে পারে তবে বাস্তবায়ন এবং বিতরণের মাধ্যমে সমস্যার বিবরণ থেকে একক দৃষ্টান্তের মধ্যে যখন কেউ থেকে যায় তখন সবচেয়ে প্রাকৃতিক, দক্ষ এবং কার্যকর বিকাশ প্যাকেজ অর্জন করে।

এখানে এফএডি দ্বারা প্রস্তাবিত চিত্রগুলির সেট রয়েছে:

  • ফাংশন নির্ভরতা ডায়াগ্রামগুলি যা এটি প্রয়োগের সাথে এটির সাথে একটি ফাংশন উপস্থাপন করে;
  • টাইপ নির্ভরতা চিত্র যা প্রকারের জন্য একই পরিষেবা সরবরাহ করে; এবং,
  • মডিউল নির্ভরতা ডায়াগ্রামগুলি যা সিস্টেমের মডিউল আর্কিটেকচারের মতামত উপস্থাপন করে।

এফএডি থিসিসের 5.1 বিভাগে একটি কেস স্টাডি রয়েছে, যা একটি ফুটবল (সকার) লীগের সাথে সম্পর্কিত ডেটা উত্পাদন স্বয়ংক্রিয় করার সিস্টেম to প্রয়োজনীয়তাগুলি 100% কার্যকরী, যেমন, ইনপুট ফুটবলের ফলাফল, লিগ টেবিল তৈরি করে, স্কোরিং টেবিলগুলি, উপস্থিতি টেবিলগুলি, দলের মধ্যে খেলোয়াড়দের স্থানান্তর করা, নতুন ফলাফলের পরে ডেটা আপডেট করা ইত্যাদি F , "নূন্যতম ব্যয়ে নতুন কার্যকারিতাটি মঞ্জুরি দেওয়া উচিত" উল্লেখ করা বাদ দিয়ে এমন কিছু যা পরীক্ষা করা প্রায় অসম্ভব।

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


1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
maple_shaft

উত্তর:


20

মৌলিক তথ্যগুলি বেশ কয়েকটি দৃষ্টান্তে একই কাঠামোযুক্ত। আপনার কাছে একটি Student, ক Courseইত্যাদি রয়েছে যা তা কোনও বস্তু, কাঠামো, রেকর্ড, বা যা কিছু হোক না কেন। ওওপির সাথে পার্থক্যটি কীভাবে ডেটা কাঠামোবদ্ধ হয় তা নয়, ফাংশনগুলি কীভাবে কাঠামোগত হয়।

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

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

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

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


5
@ বেনআরনসন আমার অভিজ্ঞতার সমস্যাটি হ'ল তারপরে কোনও শিক্ষার্থীর সাথে সম্পর্কিত যে কোনও ফাংশন ছাত্র শ্রেণিতে যুক্ত করা হয় এবং যতক্ষণ না আপনার StudentCourseFiltererজিনিসগুলিকে ব্যবস্থাপনার জন্য পরিচয় করানোর প্রয়োজন হয় ততক্ষণ তার দায়িত্বগুলি বৃদ্ধি ও বৃদ্ধি লাভ করে
অ্যালেক্সফক্সগিল

3
@ ডেন হাইব্রিড পদ্ধতির তাদের যোগ্যতা রয়েছে। তবে এটি সত্য নয় যে পার্থক্যটি কৃত্রিম। আপোস প্রচুর Scala হইয়া গলি এবং fp করার জন্য করতে হয়েছে আছে (কম শক্তিশালী টাইপ অনুমান এক জটিলতা অন্য হল: হ্যাঁ, একটি ভাষা যে দ্রবণ গলি এবং fp বেশি হতে থাকে। জটিল - "ব্যবহার করা কঠিন হিসাবে এবং বুঝতে "- দুটি চূড়ান্ত ক্ষেত্রে এর বিশুদ্ধ ভাইদের তুলনায়)।
অ্যান্ড্রেস এফ। 14

3
@ ডেন আরও দেখুন এরিক মাইজারের "'বেশিরভাগ কার্যকরী' প্রোগ্রামিং কাজ করে না" , যা হাইব্রিড পদ্ধতির বিরুদ্ধে এবং সম্পূর্ণ "মৌলবাদী" এফপি-র বিরুদ্ধে যুক্তি দেখায়
অ্যান্ড্রেস এফ। 14

4
@ দেন আপনি যে জনপ্রিয়তা বর্ণনা করেছেন তা হ'ল, আমি ভয় করি, ইতিহাসের দুর্ঘটনা। আমি কর্মক্ষেত্রে স্কালা ব্যবহার করি এবং এটি এফপি এবং ওওপি মিশ্রিত করার চেষ্টা করার কারণে এটি একটি জটিল জন্তু। হাস্কেলের মতো সত্যিকারের এফপি ভাষায় স্যুইচ করা টাটকা বাতাসের শ্বাসের মতো অনুভব করে - এবং আমিও একাডেমিক দৃষ্টিকোণ থেকে কথা বলছি না!
অ্যান্ড্রেস এফ 14

3
@ আমি জানি না যে এই ফাংশনগুলির মধ্যে কোনটি কী করে। তবে, আমি আপনাকে বলতে পারি যদি এফপিতে প্রথম ফাংশনটি বাছাই বা ফিল্টার হয় তবে এটির নামকরণ করা হবে ফিল্টার বা সাজানো , নয় func(ঠিক যেমন আপনি এর নামকরণ করেছেন IFilterইত্যাদি)। সাধারণভাবে, এফপিতে আপনি এটির নাম রাখবেন funcবা fযখন হয় sortবা filterবৈধ পছন্দ! উদাহরণস্বরূপ, উচ্চতর-ক্রম ফাংশনটি লেখার সময় funcযা পরামিতি হিসাবে নেয় ।
আন্দ্রেস এফ।

10

বছরখানেক আগে আমি যখন আমার জাভা ক্লাস নিয়েছিলাম, তখন আমরা সম্পূর্ণ ক্লাসে আমাদের সমাধানগুলি প্রত্যাশা করতাম, তাই আমি কীভাবে লোকেরা চিন্তা করি তা দেখতে পেলাম; তারা কীভাবে সমস্যাগুলি যুক্তিযুক্তভাবে সমাধান করে। আমি ক্লাস্টারের প্রায় তিন থেকে চারটি সাধারণ সমাধানগুলির সমাধানগুলি সম্পূর্ণরূপে আশা করেছিলাম। পরিবর্তে, আমি দেখেছি 30 জন 30 জন সম্পূর্ণ ভিন্ন উপায়ে সমস্যার সমাধান করেছেন।

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

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

রিয়েল-ওয়ার্ল্ড প্রোগ্রামিং সমস্যাগুলি সমাধান করার চেষ্টা করে ফাংশনাল প্রোগ্রামারদের জন্য এই ওরিয়েন্টেশনটির কয়েকটি গুরুত্বপূর্ণ পদক্ষেপ রয়েছে:

  1. ক্রিয়ামূলক প্রোগ্রামিং অপরিহার্যতার চেয়ে বেশি ঘোষিত; এটি প্রধানত কম্পিউটারকে কী করণীয় তা বলার সাথেই উদ্বেগ প্রকাশ করে , কীভাবে এটি করা যায় না।

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

  3. কার্যকরী প্রোগ্রামিংয়ের জটিল যুক্তিগুলির প্রোটোটাইপিং, জৈবিকভাবে পরিবর্তন এবং বিকশিত হতে পারে এমন নমনীয় প্রোগ্রামগুলি তৈরি এবং প্রাথমিক নকশাটি অস্পষ্ট যেখানে সফ্টওয়্যার তৈরির সুবিধা থাকতে পারে।

  4. অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামগুলি ব্যবসায়ের ডোমেনগুলির জন্য আরও উপযুক্ত হতে পারে কারণ ক্লাস, বস্তুর মধ্যে বার্তা এবং সফ্টওয়্যার নিদর্শনগুলি এমন একটি কাঠামো সরবরাহ করে যা ব্যবসায়ের ডোমেনে মানচিত্র দেয়, তার ব্যবসায়ের বুদ্ধি ক্যাপচার করে এবং এটি দলিল করে দেয়।

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

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

ইত্যাদি। কম্পিউটিংয়ের অনেক কিছুর মতোই, অবজেক্ট-ওরিয়েন্টেড ভাষা এবং কার্যকরী ভাষাগুলির বিভিন্ন ট্রেড অফ রয়েছে।

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


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

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

5
+1, তবে আমি পয়েন্ট 2 এবং 4 এ বিক্রি করি না I've আমি প্রচুর হাস্কেল টিউটোরিয়াল এবং ব্লগ পোস্ট দেখেছি যা শীর্ষ-ডাউন সমস্যার মোকাবেলা করে শুরু হয়, সমস্ত ধরণের এবং অপারেশনগুলি কীভাবে একসাথে ফিট হয় তা দেখার জন্য প্রতিটি মান এবং ফাংশন সংজ্ঞা অপরিবর্তিত রেখে (ভাল, একটি ব্যতিক্রম ছোঁড়ার সংজ্ঞায়িত)। আমার কাছে মনে হয়েছে যে হাস্কেল প্রোগ্রামাররা সমস্যাটিকে আরও নিখুঁতভাবে মডেল করার প্রবণতা দেখায় কারণ তারা শব্দার্থবিজ্ঞানের খাতিরে তুচ্ছ ধরনের যুক্ত করতে বেশি ঝোঁক রয়েছে - যেমন SafeStringএইচটিএমএল-পলায়নযুক্ত স্ট্রিংগুলি উপস্থাপন করার জন্য একটি প্রকার যুক্ত করা - এবং সাধারণত আরও ট্র্যাক রাখা প্রভাব.
ডোভাল

4
"কার্যকরী প্রোগ্রামিং ব্যবহার করে যে সমস্যাগুলি সমাধান করার জন্য সবচেয়ে উপযুক্ত এটি হ'ল মূলত গণিতের সমস্যা।" এটি সহজ নয়। মোনাডসের ধারণাটি বিভাগের তত্ত্ব থেকে আসে তার অর্থ এই নয় যে গাণিতিক কাজগুলি কার্যকরী ভাষার জন্য সবচেয়ে প্রাকৃতিক / ফিট ডোমেন। এর সমস্ত অর্থ হ'ল দৃ typ়ভাবে টাইপযুক্ত কার্যকরী ভাষায় রচিত কোডটি গণিতের ব্যবহার সম্পর্কে বর্ণনা, বিশ্লেষণ এবং যুক্তিযুক্ত হতে পারে। এটি একটি শক্তিশালী অতিরিক্ত বৈশিষ্ট্য, এমন কিছু নয় যা হাসকেলে আপনাকে "বার্বি হর্স অ্যাডভেঞ্চার" লিখতে বাধা দেয়।
ব্রুস 26'15

6
@itsbruce বার্বি হর্স অ্যাডভেঞ্চার হ'ল সর্বোচ্চ ক্যালিবারের একটি মারাত্মক গাণিতিক সিমুলেশন, এটি পিজিওনকে অতি-জটিল সংখ্যার অনুমানের মতো হ'ল ম্যাট্রিক হিসাবে বিভিন্ন সম্ভাব্য বাস্তব পরিবেশে বিভিন্ন জটিল পরিবেশে বার্বির চুলের শারীরিক ঝাঁকুনির বর্ণনা দেয় people এটিকে তাদের প্রতিদিনের ব্যবসায়ের সমস্যার কোডিংয়ের সাথে সম্পর্কিত না করে সম্পূর্ণভাবে বরখাস্ত করুন।
জিমি হোফা

7

আমি এমন একটি দিককে জোর দিয়ে বলতে চাই যা আমি গুরুত্বপূর্ণ মনে করি এবং এটি অন্যান্য উত্তরে অন্তর্ভুক্ত হয়নি।

প্রথমত, আমি মনে করি যে সমস্যা এবং সমাধানগুলির মধ্যে প্রতিনিধিত্বমূলক ফাঁক প্রোগ্রামারটির মনে, তাদের ব্যাকগ্রাউন্ড অনুযায়ী এবং যে ধারণাগুলিগুলির সাথে তারা আরও পরিচিত তা অনুযায়ী আরও বেশি হতে পারে।

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

একটি গুরুত্বপূর্ণ দিক যার সাথে তারা আলাদা হয় সেগুলি হল তারা আপনার সফ্টওয়্যারটি প্রসারিত করার অনুমতি দেয়।

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

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

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

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

সুতরাং, এই মাত্রা অনুসারে, ওওপি এবং এফপি আপনার কোডটি সংগঠিত করার জন্য কেবল দুটি বিশেষ পদ্ধতি। এসআইসিপি দেখুন , বিশেষত বিভাগ ২.৪.৩, সারণি ২.২২, এবং অনুচ্ছেদ বার্তা উত্তরণ

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


1
প্রকৃতপক্ষে, ভিজিটর প্যাটার্ন (ওওপিতে) আপনি এফপির জন্য বলেছিলেন তেমন শক্তি দেয়। এটি আরও শক্ততর ক্লাস যুক্ত করার সময় আপনাকে নতুন ক্রিয়াকলাপ যুক্ত করার অনুমতি দেয়। আমি ভাবছি আপনি এফপিতে একই কাজ করতে পারেন (যেমন operations অপারেশনের পরিবর্তে নতুন ফর্ম্যাট যুক্ত করা)।
ইউফোরিক

1
চিত্র প্রক্রিয়াকরণের দৃশ্যটি সেরা উদাহরণের মতো বলে মনে হচ্ছে না। অবশ্যই আপনি চিত্রগুলি কিছু অভ্যন্তরীণ ফর্ম্যাট এবং রূপান্তর করতে চান যে প্রতি চিত্রের ধরণের জন্য আপনার সমস্ত চিত্র প্রসেসিং স্টাফের পৃথক বাস্তবায়ন লেখার পরিবর্তে?
হে

1
@ জর্জিও সম্ভবত এই অংশটি থেকে উদ্দেশ্যটির অর্থ আমি পাচ্ছি না: "নতুন ফর্ম্যাট যুক্ত করা আরও জড়িত: আপনার ইতিমধ্যে কার্যকর করা সমস্ত ফাংশনগুলি আপনার পরিবর্তন করতে হবে।"
হে

2
@ হাই জর্জিও সম্ভবত তথাকথিত এক্সপ্রেশন সমস্যার কথা উল্লেখ করছেন । "নতুন ফর্ম্যাট যুক্ত করা" এর অর্থ "ডেটাটাইপে নতুন কনস্ট্রাক্টর (ওরফে 'কেস') যুক্ত করা"।
আন্দ্রেস এফ

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

5

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

হাসকেলে এই ধরণের সাথে আপনি যেভাবে কাজ করেন তা প্রায়শই ওও এর থেকে আলাদা হয়। হাসকেলে আমি বলি

  null xs
  length xs

এবং জাভাতে আপনি বলেন

  xs.isEmpty
  xs.length

টমেটো, টমেটো। হাস্কেল ফাংশনগুলি বস্তুর সাথে আবদ্ধ নয় তবে তারা এর ধরণের সাথে ঘনিষ্ঠভাবে জড়িত। Hএহ, তবে , say আপনি বলছেন, জাভাতে এটি কল করছে যা কোন দৈর্ঘ্যের পদ্ধতিটি সেই বস্তুর প্রকৃত শ্রেণির জন্য উপযুক্ত ¨ সারপ্রাইজ - Haskell, না পলিমরফিজম সাথেও টাইপ শ্রেণীর (এবং অন্যান্য জিনিস)।

হাসকেলে, যদি আমার কাছে হয় - পূর্ণসংখ্যার সংকলন - সংগ্রহটি একটি তালিকা বা সেট বা অ্যারে কিনা তা বিবেচনা করে না, এই কোড

  fmap (* 2) is

দ্বিগুণ সমস্ত উপাদান সহ একটি সংগ্রহ ফিরে আসবে। পলিমারফিজম বলতে বোঝায় যে নির্দিষ্ট ধরণের জন্য উপযুক্ত মানচিত্রের ফাংশনটি কল করা হবে।

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

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


প্রকৃতপক্ষে, আপনি জাভা / সি # তে টাইপ ক্লাস ব্যবহার করতে পারেন; আপনি কেবল স্পষ্টভাবে ফাংশনগুলির অভিধানটি পাস করার জন্য, সংকলকটির পরিবর্তে টাইপের উপর ভিত্তি করে সঠিকটি নির্ধারণ করতে পারেন।
ডোভাল

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

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

3
প্রবন্ধগুলি আবশ্যকীয় / ওওর তুলনায় ক্রিয়ামূলক ভাষায় আরও বিচিত্র জিনিসগুলির জন্য ব্যবহৃত হয় (প্রকারের সিস্টেমগুলি একটি জিনিসের জন্য আরও শক্তিশালী এবং ধারাবাহিক হতে থাকে)। প্রকার এবং তাদের ক্রিয়াকলাপগুলি কোড পাথগুলি আকার দেওয়ার জন্য ব্যবহৃত হয় (যার কারণে বেশ কয়েকটি কার্যকরী ভাষায় কেবল লুপগুলির কীওয়ার্ড থাকে না - প্রয়োজন হয় না), উদাহরণস্বরূপ।
ব্রুস 26'15

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

4

প্রতিনিধিত্বমূলক ব্যবধান হ্রাস করার জন্য এফপি সত্যই চেষ্টা করে:

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

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

* হ্যাঁ, অনেক ওওপি ভাষায় আপনি স্ট্যান্ডার্ড অপারেটরগুলিকে ওভাররাইড করতে পারেন, তবে হাসকেলে আপনি নতুনকে সংজ্ঞায়িত করতে পারেন!

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


ব্যবসায়ের উদ্বেগগুলি (গ্রাহকের কাছ থেকে) উচ্চতর ক্রমের ক্ষেত্রে খুব ঘন ঘন প্রকাশ করা হয় না। তবে কোনও গ্রাহক এক-লাইন ব্যবহারকারীর গল্প লিখতে পারেন এবং আপনাকে ব্যবসায়ের বিধিগুলি সরবরাহ করতে পারেন (বা আপনি সেগুলি গ্রাহক থেকে সরিয়ে নিতে পারেন)। আমি (টপ-ডাউন?) ডোমেন মডেলিং (সেই নিদর্শনগুলি থেকে) এর প্রতি আগ্রহী যা আমাদের মানচিত্রে প্রথম শ্রেণির ফাংশন ইত্যাদিতে সমস্যার বিমূর্ততায় পৌঁছতে দেয়? আপনি কিছু উল্লেখ উল্লেখ করতে পারেন? আপনি কি কোনও ডোমেন, বিমূর্ততা ইত্যাদির একটি দৃ concrete় উদাহরণ ব্যবহার করতে পারেন?
ফুহরম্যানেটর

3
@ ফুহরম্যানেটর আপনি ওওপি এবং এফপি ব্যবহার করেন না তা বিবেচনা না করেই কোনও গ্রাহক এখনও এক-লাইন ব্যবহারকারী গল্প এবং ব্যবসায়ের নিয়ম লিখতে পারেন । উত্তরাধিকার, রচনা বা ইন্টারফেসগুলি বুঝতে পেরে গ্রাহকরা উচ্চতর-ক্রিয়াকলাপগুলি আরও বেশি বুঝতে পারবেন বলে আমি আশা করি না।
আন্দ্রেস এফ।

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

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

@ ফুহরম্যানেটর এই চিন্তাভাবনা কার্যকরী সিরিজটিও রয়েছে
পল

3

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

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

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


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

if you know what input a function takes and what output it produces, why should it matter which data structure it belongs too?এটি অনেকটা সংহতির মতো শোনাচ্ছে, যা কোনও মডুলার সিস্টেমের জন্য গুরুত্বপূর্ণ। আমি যুক্তি দিয়েছি যে কোনও ফাংশনটি কোথায় খুঁজে পেতে হবে তা না জানলে কোনও সমাধান বোঝা শক্ত হয়ে যায়, এটি উচ্চ প্রতিনিধিত্বমূলক ব্যবস্থার কারণে। প্রচুর OO সিস্টেমে এই সমস্যা রয়েছে তবে এটি খারাপ ডিজাইনের (কম সংহতি) কারণে। আবার, নেমস্পেসের সমস্যাটি এফপিতে আমার দক্ষতার বাইরে, সুতরাং এটি সম্ভবত এটি শোনাতে খারাপ নয়।
ফুহরম্যানেটর

1
@Fuhrmanator কিন্তু আপনি কি জানেন কোথায় একটি ফাংশন খুঁজে। এবং এখানে কেবলমাত্র একটি ফাংশন রয়েছে, একই ডেটাযুক্ত একাধিক ফাংশন নয়, প্রতিটি ডেটাটাইপের জন্য সংজ্ঞায়িত (আবার, "এক্সপ্রেশন সমস্যা" দেখুন)। উদাহরণস্বরূপ, হাস্কেল লাইব্রেরি ফাংশনগুলির জন্য (যা আপনাকে চাকাটি পুনরায় আবিষ্কার করার পরিবর্তে বা উল্লিখিত ফাংশনগুলির কিছুটা কম দরকারী সংস্করণ তৈরি করার পরিবর্তে) ব্যবহার করার জন্য উত্সাহিত করেছে, আপনার কাছে হ'লগুর মতো দুর্দান্ত আবিষ্কার সরঞ্জাম রয়েছে যা এটি আপনাকে এত শক্তিশালী করে যে এটি অনুসন্ধান করতে দেয় স্বাক্ষর দ্বারা (এটি চেষ্টা করুন :) :)
এন্ড্রেস এফ।

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