ফাংশনাল প্রোগ্রামিং বনাম ওওপি [বন্ধ]


93

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


27
একজন অন্যকে প্রত্যাখ্যান করে না।
এমবিকিউ

1
@ এমবিকিউ আমি বুঝতে পারি যে এগুলি পারস্পরিক একচেটিয়া নয়, তবে আমি কেবল দুটি পদ্ধতির পার্থক্য সম্পর্কে আরও ভাল বোঝার চেষ্টা করতে চেয়েছিলাম।
জিএসটি

দুর্দান্ত প্রশ্ন। আমি এটা সম্পর্কে ভাবছিলাম।
জনএফএক্স

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

4
আসল উত্তরটি হ'ল - তাদের মধ্যে কোনও "বনাম" নেই। পরীক্ষা করে দেখুন Stackoverflow এই প্রশ্ন
মিসিংফ্যাক্টর

উত্তর:


67

আমি বলব এটি ইম্পিरेटিভ প্রোগ্রামিং বনাম আরও কার্যকরী প্রোগ্রামিং

সবচেয়ে বড় পার্থক্য হ'ল ইমপিটেটিভ প্রোগ্রামিং কন্ট্রোল ফ্লো সম্পর্কে এবং ফাংশনাল প্রোগ্রামিং ডেটা ফ্লো সম্পর্কে । এটি বলার আর একটি উপায় হ'ল ফাংশনাল প্রোগ্রামিং কেবল এক্সপ্রেশন ব্যবহার করে যখন অপরিহার্য প্রোগ্রামিংয়ে ভাব এবং বিবৃতি উভয়ই ব্যবহৃত হয়।

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

একটি তালিকার যোগফল গণনা করার জন্য একটি ক্রিয়াকলাপের জন্য প্রয়োজনীয় সিউডো-কোড (যোগফলটি একটি চলকতে রাখা হয়):

int sumList(List<int> list) {
    int sum = 0;
    for(int n = 0; n < list.size(); n++) {
        sum = sum + list.get(n);
    }

    return sum;
}

একই ফাংশনের জন্য কার্যকরী সিউডো-কোড (যোগফলটি প্যারামিটার হিসাবে দেওয়া হয়):

fun sumList([], sum) = sum
 |  sumList(v::lst, sum) = sumList(lst, v+sum)

আমি উপস্থাপনা সুপারিশ কার্যকরী প্রোগ্রামিং সঙ্গে শ্রিউ এফেক্টস দ্বারা সাইমন Peyton-জোনস কার্মিক ধারণা একটি ভাল পরিচয়ের জন্য।


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

3
অপরিহার্য বনাম কার্যকরী সবচেয়ে গুরুত্বপূর্ণ দিকটি বর্ণনা করার জন্য +1: নিয়ন্ত্রণ প্রবাহ বনাম ডেটা প্রবাহ। একটা জিনিষ আমি যোগ করতে আছে কার্মিক দৃষ্টান্ত এবং OO যেমন পণ্য দৃষ্টান্ত হল না পারস্পরিক একচেটিয়া; আপনি কীভাবে অবজেক্ট (ডেটা) ইন্টারঅ্যাক্ট করে মডেল করতে ও ও সেই দৃষ্টিকোণটি ব্যবহার করতে পারেন এবং সেই বস্তুকে রূপান্তর করতে (হেরফের করা) কার্যকরী দৃষ্টান্ত ব্যবহার করতে পারেন।
মিথ্যা রায়ান

1
মজার বিষয় হল, আপনি আন্তঃমীমাংসিত হিসাবে ডেটা-হিসাবে-নিয়ন্ত্রণ এবং নিয়ন্ত্রণ-হিসাবে-ডেটাও মডেল করতে পারেন। এফপি চারপাশে নিয়ন্ত্রণ প্রবাহটি পাস করতে তীর এবং প্রথম অর্ডার ফাংশন ব্যবহার করতে পারে এবং এটি ডেটার মতো ম্যানিপুলেট করতে পারে। কন্ট্রোল প্রবাহকে পরিবর্তন করার জন্য ওওপি বিভিন্ন ডিজাইন নিদর্শন ব্যবহার করে patterns
কোডেক্সআরকানিয়াম

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

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

16

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

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

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

শুরু করার জন্য আপনি হাস্কেলের মতো খাঁটি কার্যকরী ভাষা ব্যবহার করতে বেছে নিতে পারেন বা আপনি এফ # এর মতো সংকর ব্যবহার করতে পারেন ।

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


ফাংশনাল প্রোগ্রামিং বনাম অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের কয়েকটি বড় পার্থক্য, পক্ষে-বিপক্ষে কী কী?

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

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


2
স্পষ্টতই, স্কিম কোনওভাবেই খাঁটি কার্যকরী ভাষা নয়।
জোনাথন স্টার্লিং

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

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

: আপনি এই প্রশ্নের উত্তর পড়া উচিত stackoverflow.com/questions/3949618/fp-and-oo-orthogonal/...
missingfaktor

এছাড়াও ফ্র্যাঙ্ক শিয়েরারের উত্তর এখানে দেখুন: প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জ
বিকিউশনস

8

(এই উত্তরটি স্ট্যাকওভারফ্লোতে একটি বদ্ধ প্রশ্নের উত্তর থেকে অভিযোজিত ))

ফাংশনাল প্রোগ্রামিং এবং অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের মধ্যে একটি বড় পার্থক্য হ'ল প্রত্যেকে বিভিন্ন ধরণের সফ্টওয়্যার বিবর্তনে আরও ভাল:

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

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

যখন বিবর্তনটি ভুল পথে যায়, আপনার সমস্যা আছে:

  • কোনও অবজেক্ট-ভিত্তিক প্রোগ্রামে একটি নতুন ক্রিয়াকলাপ যুক্ত করার জন্য একটি নতুন পদ্ধতি যুক্ত করতে অনেক শ্রেণীর সংজ্ঞা সম্পাদনা করতে হতে পারে।

  • একটি কার্যকরী প্রোগ্রামে একটি নতুন ধরণের জিনিস যুক্ত করতে একটি নতুন কেস যুক্ত করতে অনেক ফাংশন সংজ্ঞা সম্পাদনা করতে হতে পারে।

এই সমস্যাটি বহু বছর ধরে সুপরিচিত; 1998 সালে, ফিল ওয়েডলার এটিকে "এক্সপ্রেশন সমস্যা" হিসাবে অভিহিত করেছিলেন । যদিও কিছু গবেষক মনে করেন যে ভাবের সমস্যাটিকে মিশ্রিনের মতো ভাষার বৈশিষ্ট্যগুলির সাথেও সম্বোধন করা যেতে পারে, তবে একটি বহুল স্বীকৃত সমাধান এখনও মূলধারায় পৌঁছেছে।


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

4

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

এফপি ভাষার ব্যবহারকারীর গাণিতিক আইনের মাধ্যমে মডুলারিটি অর্জন করার ঝোঁক। এবং তাদের আইন মেনে চলার জন্য প্রমাণগুলি পছন্দ করুন।

অপরিহার্যভাবে ওওপি ব্যবহারকারীরা পরীক্ষার ক্ষেত্রে অবজেক্টের আচরণ ক্যাপচার করার ঝোঁক রাখেন, যা যদি বস্তুটি পরিবর্তিত হয় এবং এইভাবে মডুলারালিটি অর্জন করে তবে পুনরায় কাজ করা যেতে পারে।

এটি কেবল একটি ছোট দিক, তবে আমি মনে করি এটি উল্লেখযোগ্য।


2

একটি সাদৃশ্য:

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

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

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


সুন্দর উপমা, থেক্স !! আপনি কি আপত্তি করবেন (যদি সম্ভব হয়) এই দুটি পদ্ধতির মধ্যে ভাল এবং কনসের সাথে এই সাদৃশ্যটি প্রসারিত করুন।
রাহুল আগরওয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.