ফাংশনাল প্রোগ্রামিংয়ের জন্য কোনও সফটওয়্যার-ইঞ্জিনিয়ারিং পদ্ধতি আছে? [বন্ধ]


203

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

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

  1. কার্যকরী প্রোগ্রামগুলি প্রায়শই উপরের নীচে নীচে বিকাশ করা হয় ('লিস্পে', পল গ্রাহাম)

  2. কার্যকরী প্রোগ্রামাররা মানচিত্র ব্যবহার করে যেখানে ওও-প্রোগ্রামাররা অবজেক্ট / ক্লাস ব্যবহার করে ('জাভা প্রোগ্রামারদের ক্লোজার', রিচ হিকলির আলাপ)।

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


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

4
১. পার্নাস যুক্তি দেখিয়েছেন যে বেশিরভাগ প্রোগ্রামগুলি নীচের অংশে থাকা উচিত এবং তারপরে টপ-ডাউনের মতো দেখতে নকল হওয়া উচিত, সুতরাং সেই পদ্ধতিগুলি মিশ্রিত করা উচিত, সঠিক কোনও উত্তর নেই।
গ্যাব্রিয়েল Ščerbák

2
২. অবজেক্টগুলি তাদের এনক্যাপসুলেটেড স্ট্রাকচার্ড স্টেটের উপর নির্ভর করে আচরণ প্রদান করে, এফপিতে আপনার সমস্ত রাজ্য এবং কাঠামো সুস্পষ্ট এবং আচরণ (ফাংশন) কাঠামো থেকে পৃথক করা হয়। সুতরাং ডেটা মডেলিংয়ের জন্য, আপনি অবজেক্টগুলির জন্য মানচিত্র ব্যবহার করেন, তবে অ্যাপ্লিকেশনগুলি ডিজাইন করার সময়, জিনিসগুলি ফাংশনগুলির সাথে প্রতিস্থাপন করা যায় না - এফপি পাইপলাইনগুলির মাধ্যমে উত্পন্ন এবং মূল্যায়ন করা একটি বৃহত প্রকাশ যা ওওপি মডেলটি তৈরি এবং অবজেক্টগুলির মধ্যে বার্তা প্রেরণ সম্পর্কে।
গ্যাব্রিয়েল Ščerbák

1
আমি কিছুক্ষণ আগে একটি সম্পর্কিত প্রশ্ন জিজ্ঞাসা করেছি: " ক্লোজারে রিলেশনাল ডাটাবেসগুলি থেকে কোনও মডেল ডেটা কীভাবে হয় ?" stackoverflow.com/questions/3067261/…
সন্দীপ

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

উত্তর:


165

Godশ্বরের ধন্যবাদ যে সফ্টওয়্যার-ইঞ্জিনিয়ারিংয়ের লোকেরা এখনও কার্যকরী প্রোগ্রামিং আবিষ্কার করতে পারেনি। এখানে কিছু সমান্তরাল রয়েছে:

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

    এই উচ্চ-আদেশ ক্রিয়াকলাপগুলি প্রায়শই প্রোগ্রামিংয়ের নির্দিষ্ট আইনগুলি হয়, যেমন "ফ্রি থিওরিম"।

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

    যেসব কার্যনির্বাহী প্রোগ্রামাররা প্রকারগুলি ব্যবহার করেন তারা সাধারণত মনে করেন যে "একবার আপনি টাইপগুলি সঠিকভাবে পেয়ে গেলে; কোডটি ব্যবহারিকভাবে নিজের লেখা হয়।"

    সমস্ত কার্যকরী ভাষাগুলি সুস্পষ্ট প্রকারের ব্যবহার করে না, তবে স্ক্রিন / লিস্প / ক্লোজার শিখার জন্য একটি দুর্দান্ত বই হাউ টু ডিজাইন প্রোগ্রামস বইটি "ডেটা বর্ণনার" উপর খুব বেশি নির্ভর করে, যা প্রকারের সাথে ঘনিষ্ঠভাবে সম্পর্কিত।

সুতরাং একটি কার্যকরী অ্যাপ্লিকেশন, যেমন লিস্প বা ক্লোজারে পদ্ধতিগত (মডেল-ভিত্তিক?) ডিজাইনের পদ্ধতি কী?

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

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

সাধারণ পদক্ষেপগুলি কী কী, আমি কোন শৈল্পিক ব্যবহার করি?

সাধারণ পদক্ষেপ:

  1. আপনার প্রোগ্রামের ডেটা এবং এটিতে অপারেশনগুলি সনাক্ত করুন এবং এই ডেটা উপস্থাপন করে এমন একটি বিমূর্ত ডেটা সংজ্ঞা দিন।

  2. গণনার সাধারণ ক্রিয়া বা নিদর্শনগুলি সনাক্ত করুন এবং তাদেরকে উচ্চ-অর্ডার ফাংশন বা ম্যাক্রো হিসাবে প্রকাশ করুন। রিফ্যাক্টরিংয়ের অংশ হিসাবে এই পদক্ষেপ গ্রহণের প্রত্যাশা করুন।

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


2
আইএমও দর্শনার্থী ভাঁজ হয় না - ভাঁজ দর্শকদের একটি উপসেট। একাধিক প্রেরণ (সরাসরি) ভাঁজ দ্বারা ক্যাপচার করা হয় না।
মাইকেল একস্ট্র্যান্ড

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

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

22
"1 Godশ্বরকে ধন্যবাদ যে সফ্টওয়্যার-ইঞ্জিনিয়ারিংয়ের লোকেরা এখনও কার্যকরী প্রোগ্রামিং আবিষ্কার করতে পারেনি।" ;)
আকি

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

46

ক্লোজারের জন্য, আমি ভাল পুরানো রিলেশনাল মডেলিংয়ে ফিরে যাওয়ার পরামর্শ দিই। তারপিটের বাইরে একটি অনুপ্রেরণামূলক পঠন।


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

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

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

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


38

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

আমার অভিজ্ঞতা সাম্প্রতিক বছরগুলিতে জাভা থেকে ক্লোজুরে সরানো থেকে আসে।

কিছু উদাহরণ:

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

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

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

  • প্রচার / পুনরাবৃত্তি - এফপির সাথে ঠিক একইভাবে কাজ করে। আপনি যদি বিল্ডিং সরঞ্জাম / ডিএসএল এবং আরপিএলে এগুলি ব্যবহার করতে খুব ভাল পান তবে আপনি ব্যবহারকারীদের সাথে সরাসরি প্রোটোটাইপ করতে সক্ষম হবেন।


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

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

2
পিএআইপি বইতে কিছু ইন্টারেস্টিং নীতিগত নকশা রয়েছে। norvig.com/paip.html
mathk

1
ফাংশনাল প্রোগ্রামিং প্যাটার্নগুলিও রয়েছে (পুনরাবৃত্তির পরিকল্পনাগুলি)
গ্যাব্রিয়েল Ščerbák

13

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

সুতরাং এটিতে বই এবং বই নেই, তবে এখানে একটি সুপ্রতিষ্ঠিত পন্থা রয়েছে যেমন বলা আছে যে, অসম্ভব মূল্যবোধকে উপস্থাপনযোগ্য করে তুলুন।

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

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

এখন আপনার একটি ডোমেন রয়েছে যার উপর আপনার ফাংশন রয়েছে যা ভাল আচরণিত আইন অনুসারে রচনা করে। একটি সাধারণ এম্বেডেড ডিএসএল!

ওহ, এবং প্রদত্ত বৈশিষ্ট্যগুলি, আপনি অবশ্যই সেগুলির স্বয়ংক্রিয়ভাবে এলোমেলোভাবে পরীক্ষাগুলি লিখতে পারেন (আলা কুইকচেক) .. এবং এটি কেবল শুরু।


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

@ জাক - ভাল, আপনি স্থিতিশীলভাবে পরীক্ষা করতে পারবেন না যে সেগুলি উপস্থাপনযোগ্য নয়, তবে আপনি যেভাবেই আপনার ডেটা কাঠামো তৈরি করতে পারেন।
sclv

7

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

তদুপরি, কার্যকরী প্রোগ্রামগুলি মডুলারিটি এবং অন্যান্য কাঠামো প্রদর্শন করে। আপনার বিস্তারিত ডিজাইনগুলি সেই কাঠামোর ধারণাগুলির ক্ষেত্রে প্রকাশ করতে হবে।


5

একটি পদ্ধতির পছন্দের কার্যকরী প্রোগ্রামিং ভাষার অভ্যন্তরীণ একটি ডিএসএল তৈরি করা। "মডেল" তখন ডিএসএলে প্রকাশিত ব্যবসায়িক নিয়মের একটি সেট।


1
আমি প্রথমে সমস্যা ডোমেনের দিকে ভাষা তৈরির পদ্ধতির বিষয়টি বুঝতে পারি যতক্ষণ না বিমূর্তির একটি স্তর পৌঁছে যায় যে কোডটিতে আর কোনও পুনরাবৃত্তিমূলক নমুনাগুলি ঘটে না, সেই বিমূর্ততাগুলির সাথে সমস্যার সমাধানের চেয়ে।
Thorsten

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

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

5

অন্য পোস্টে আমার উত্তর দেখুন:

কীভাবে ক্লোজুর উদ্বেগগুলি আলাদা করে?

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


3
আমি 90% পাইপলাইন এবং 10% ম্যাক্রো পদ্ধতির পছন্দ করি। অপরিবর্তনীয় ডেটাতে রূপান্তরগুলির পাইপলাইন হিসাবে কোনও কার্যকরী প্রোগ্রামটি ভাবা বেশ স্বাভাবিক বলে মনে হয়। আমি নিশ্চিত না যে "ডেটাগুলিতে সমস্ত বুদ্ধি, কোড নয়," দ্বারা আপনি কী বোঝাতে চেয়েছিলেন তা আমি বুঝতে পেরেছি, যেহেতু 1 ডেটা স্ট্রাকচারে 10 টি ফাংশন (10 ডাটাস্ট্রাকচারের চেয়ে 10 ফাংশনের পরিবর্তে) কাজ করার পদ্ধতির বোঝা যাচ্ছে বলে মনে হচ্ছে বিপরীত ওপিতে ডেটা স্ট্রাকচার কি এফপির চেয়ে বেশি বুদ্ধিমান নয়, যেহেতু তাদের নিজস্ব আচরণ তৈরি হয়েছে?
Thorsten

3

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

এখানে কয়েকটি লিঙ্ক:

http://www.northeastern.edu/magazine/0301/programming.html

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.86.8371


উত্তর-পূর্ব পৃষ্ঠার লিঙ্কটি মারা গেছে বলে মনে হচ্ছে।
জেমস কিংসবেরি

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

3

আমি সম্প্রতি এই বইটি পেয়েছি: কার্যকরী এবং প্রতিক্রিয়াশীল ডোমেন মডেলিং

আমি মনে করি আপনার প্রশ্নের সাথে সামঞ্জস্যপূর্ণ।

বইয়ের বিবরণ থেকে:

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


2

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

ব্যক্তিগতভাবে আমি যখন এওপি গ্রুপের উত্পাদিত কাজটি পছন্দ করি তখন আমার নিজের মতো ডিজাইনের অনুশীলন করার শৃঙ্খলা নেই। তবে এটি আমার অভাব, এবং প্রোগ্রামের গণনার একটি নয়।


2

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


ক্লোজুরে বিডিডি করতে আপনি কী কী সরঞ্জাম ব্যবহার করছেন?
মুর্তজা

আমি মিডজে পছন্দ করি এটি আপ টু ডেট এবং অত্যন্ত অভিব্যক্তিপূর্ণ। এটি দেখুন: github.com/marick/Midje
মার্ক

1

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

একটি ভাল উদাহরণ fmap হয়। এই ফাংশনটি একটি আর্গুমেন্ট হিসাবে একটি ফাংশন নেয় এবং এটি দ্বিতীয় আর্গুমেন্টের সমস্ত "উপাদানগুলিতে" প্রয়োগ করে। যেহেতু এটি ফান্টকার ধরণের শ্রেণীর অংশ, তাই কোনও ফান্টারের কোনও উদাহরণ (যেমন একটি তালিকা, গ্রাফ, ইত্যাদি ...) এই ফাংশনটির দ্বিতীয় যুক্তি হিসাবে পাস হতে পারে। এটি তার দ্বিতীয় তর্কটির প্রতিটি উপাদানকে একটি ফাংশন প্রয়োগ করার সাধারণ আচরণকে ক্যাপচার করে।


-7

আমরা হব,

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

তারা এখন আরও জনপ্রিয় হয়ে উঠছে যেহেতু ওওপি-র "স্টেট" এর কারণে "প্যারালিল প্রোগ্রামিং" নিয়ে সমস্যা রয়েছে Google এবং গুগল ম্যাপ্রেডস এর মতো কোনও সময় কার্যকরী শৈলী সমস্যার জন্য আরও ভাল।

আমি নিশ্চিত যে, ফান্টিওয়ানাল ছেলেরা যখন দেয়ালে আঘাত করবে [কোডের ১.০০.০০.০০ লাইনের চেয়ে বেশি সিস্টেমগুলি প্রয়োগ করার চেষ্টা করবে], তাদের মধ্যে কয়েকটি বাজে শব্দের সাথে নতুন সফ্টওয়্যার-ইঞ্জিনিয়ারিং পদ্ধতি নিয়ে আসবে :-)। তাদের পুরানো প্রশ্নের উত্তর দেওয়া উচিত: কীভাবে সিস্টেমকে টুকরো টুকরো করে ভাগ করা যায় যাতে আমরা প্রতিটি টুকরোগুলি একবারে "কাটা" পারি? ফাংশনাল স্টাইল ব্যবহার করে [কাজের পুনরাবৃত্তিমূলক, বিবর্তনমূলক পদ্ধতিতে কাজ করুন]।

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

কিন্তু কার্যকর প্রোগ্রামগুলি কি এত বড় সিস্টেমে ব্যবহার করা হবে? সেগুলি কি মূল স্রোতে পরিণত হবে? এটাই প্রশ্ন

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


কার্যকরী ভাষা নিয়ে এখন যথেষ্ট পরিমাণে সিস্টেম তৈরি করা হয়েছে। এমনকি না থাকলেও এটি মোটেই যুক্তি নয়।
সোভান্তে

ঠিক আছে, তাদের কিছু নাম? আমি খুব কম "এরলং" সিস্টেম জানি। [মাঝারি আকার] তবে হাস্কেল? Clojure? পাতার মর্মর?
হিপ্পিয়াস মাইনর

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

2
অ্যানালি "ওওপি" নয় এমন ভাষা সম্পর্কে মজার বিষয়টি হ'ল তারা আপনাকে প্রায়শই "নকশা পদ্ধতি পদ্ধতি" থেকে স্বাধীনতা দেয়, নিজের জন্য চিন্তা করে এবং আপনার প্রোগ্রামটিকে সবচেয়ে উপযুক্ত পদ্ধতিতে কাটানোর পরিবর্তে অন্ধভাবে কোনও সেট প্যাটার্ন অনুসরণ করে এবং এর সাথে জীবনযাপন করে না of আমলাতান্ত্রিক বয়লারপ্লেট। দুঃখিত, এখানে 10-পয়েন্ট 3-সপ্তাহের কোর্স নেই।
সোভান্তে

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