কোন কার্যকর বৈশিষ্ট্যগুলি এনেছে সেগুলির সুবিধার জন্য অল্প পরিমাণে ওওপি বিভ্রান্তির মূল্যবান?


13

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

এফপির সম্ভাব্য দিক:

  • অপরিবর্তনীয়তা
  • আংশিক প্রয়োগ এবং কারিরিং ing
  • প্রথম শ্রেণীর কার্যাদি (ফাংশন পয়েন্টার / কার্যকরী অবজেক্টস / কৌশল প্যাটার্ন)
  • অলস মূল্যায়ন (এবং মনডস)
  • খাঁটি ফাংশন (কোনও পার্শ্ব প্রতিক্রিয়া নেই)
  • এক্সপ্রেশন (বনাম বিবৃতি - কোডের প্রতিটি লাইন এর পরিবর্তে বা পার্শ্ব প্রতিক্রিয়া সৃষ্টি করার পাশাপাশি একটি মান উত্পাদন করে)
  • recursion
  • প্যাটার্ন ম্যাচিং

প্রোগ্রামিং ভাষা যে ভাষাটিকে সমর্থন করে তার সীমাবদ্ধতার জন্য আমরা যা কিছু করতে পারি সেখানে কি এটি নিখরচায়? নাকি এর চেয়ে ভাল গাইডলাইন আছে?


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

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

1
এই সময়ে, আপনি sicp পড়া উচিত । এটি বিনামূল্যে এবং ভাল লেখা। এটি দুটি দৃষ্টান্তগুলির মধ্যে একটি দুর্দান্ত তুলনা প্রস্তাব করে।
সাইমন বার্গোট

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

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

উত্তর:


13

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

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

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

শুভকামনা!


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

6

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

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

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

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


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

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

8
@ টেলাস্টিন: টর্স অপঠনযোগ্য হিসাবে একই নয়। এছাড়াও, স্ফীত বয়লারপ্লেটের বিশাল জনগণের অপঠনযোগ্য হওয়ার নিজস্ব উপায় রয়েছে।
মাইকেল শ

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

2
@ user949300: আপনি যদি সম্পূর্ণ ভিন্ন উদাহরণ চান তবে এই জাভা 8 উদাহরণটি সম্পর্কে কীভাবে ?: list.forEach(System.out::println);একটি FP দৃষ্টিকোণ থেকে printlnএকটি ফাংশন দুটি আর্গুমেন্ট, একটি লক্ষ্য PrintStreamএবং একটি মান গ্রহণ করে Objectতবে Collectionএর forEachপদ্ধতিটি কেবলমাত্র একটি যুক্তির সাথে ফাংশন প্রত্যাশা করে যা প্রতিটি উপাদান প্রয়োগ করা যেতে পারে। সুতরাং প্রথম যুক্তিটি System.outএকটি যুক্তি সহ একটি নতুন ফাংশনে উপার্জনের ক্ষেত্রে পাওয়া দৃষ্টান্তের সাথে আবদ্ধ । এটি এর চেয়ে সহজBiConsumer<…> c=PrintStream::println; PrintStream a1=System.out; list.forEach(a2 -> c.accept(a1, a2));
হোলগার

5

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

এফপি এবং ওওপি পারস্পরিক একচেটিয়া নয়। স্কালার দিকে তাকান। কেউ কেউ মনে করেন এটি সবচেয়ে খারাপ কারণ এটি অপরিষ্কার এফপি, তবে কেউ কেউ মনে করেন এটি একই কারণে এটি সেরা।

একে একে, এখানে কয়েকটি দিক যা ওওপি সহ দুর্দান্ত কাজ করে:

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

  • অপরিবর্তনীয়তা: স্ট্রিং তর্কযোগ্যভাবে সর্বাধিক ব্যবহৃত জাভা অবজেক্ট এবং এটি অপরিবর্তনীয়। আমি আমার ব্লগে অপরিবর্তনীয় জাভা অবজেক্টস এবং অপরিবর্তনীয় জাভা সংগ্রহগুলি কভার করি। এর কিছু আপনার জন্য প্রযোজ্য হতে পারে।

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

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

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

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

  • আংশিক প্রয়োগ এবং কারিরিং - প্রথম শ্রেণীর ফাংশন ছাড়া ব্যবহারিক নয়।

  • প্যাটার্ন ম্যাচিং - সাধারণত ওওপিতে নিরুৎসাহিত।

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


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

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

@ ব্রোনো জাভা 8-তে একটি জেনেরিক java.util.function.BiConsumer রয়েছে যা সি # তে কার্যকর হতে পারে: public interface BiConsumer<T, U> { public void accept(T t, U u); }java.util.function- এ অন্যান্য কার্যকর কার্যকরী ইন্টারফেস রয়েছে।
গ্লেনপিটারসন

@ ব্রোনো হেই আমি পেয়েছি, হাস্কেলের ব্যথা এটি। আপনি যখনই কেউ পড়েন বলুন "লিপিং এফপি আমাকে ওওপিতে আরও ভাল করেছে" এর অর্থ তারা রুবি বা এমন কিছু শিখেছে যা হাস্কেলের মতো খাঁটি এবং ঘোষিত নয়। হাস্কেল এটিকে পরিষ্কার করে দেয় যে ওওপি অকেজোভাবে নিম্ন স্তরের। আপনি যে সবচেয়ে বড় ব্যথাটি চালাচ্ছেন তা হ'ল যখন আপনি এইচএম টাইপ সিস্টেমে না থাকেন তখন সীমাবদ্ধতা ভিত্তিক টাইপ অনুমিতি অনস্বীকার্য, সুতরাং কোসেন্ট্রেন্ট-ভিত্তিক টাইপ অনুমান সম্পূর্ণভাবে সম্পন্ন হয় না: ব্লগস.এমএসএনএন
2012/03/09

1
Most OOP languages don't have the stack space for it সত্যি? ভারসাম্য বাইনারি গাছে কোটি কোটি নোড পরিচালনা করতে আপনার কেবল 30 স্তরের পুনরাবৃত্তি দরকার। আমি নিশ্চিত যে আমার স্ট্যাকের জায়গাটি এর চেয়ে আরও অনেক স্তরের জন্য উপযুক্ত।
রবার্ট হার্ভে

3

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

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


2

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

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

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


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

@ এসকে-লজিক, আমি আপনার রূপকটি পছন্দ করি
ত্রিশূল

@ এসকে-লজিক: অত্যাবশ্যক প্রোগ্রামিং শিখার মতো কী? নিজের পেটে নিজেকে টেনে নিয়ে যাচ্ছেন?
রবার্ট হার্ভে

@ রবার্টহারভে একটি মরিচা চামচ এবং পাঞ্চকার্ডের একটি ডেক দিয়ে ভূগর্ভস্থ মাটি ছোঁড়ার চেষ্টা করছেন।
জিমি হোফা

0

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

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

সংকলনের সময় পুনরাবৃত্তি সহ টেম্পলেটগুলি ব্যবহার করা আপনার প্রথম 3 পয়েন্টের উপর নির্ভর করে,

  • অপরিবর্তনীয়তা
  • recursion
  • প্যাটার্ন ম্যাচিং

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

অন্যান্য পয়েন্ট হিসাবে, ব্যবহার std::bindএবং std::functionআপনাকে আংশিক ফাংশন অ্যাপ্লিকেশন দেয় এবং ফাংশন পয়েন্টার ভাষা অন্তর্নির্মিত হয়। কলযোগ্য বস্তুগুলি হ'ল কার্যকরী বস্তু (পাশাপাশি আংশিক ফাংশন অ্যাপ্লিকেশন)। নোট করুন যে কলযোগ্য বস্তুর দ্বারা, আমি এর অর্থ যা তাদের সংজ্ঞায়িত করে operator ()

অলস মূল্যায়ন এবং খাঁটি ফাংশনগুলি কিছুটা কঠিন হবে; খাঁটি ফাংশনগুলির জন্য, আপনি ল্যাম্বদা ফাংশনগুলি ব্যবহার করতে পারেন যা কেবল মান অনুসারে ক্যাপচার করে তবে এটি আদর্শ নয়।

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

#include <iostream>
#include <functional>

//holds a compile-time index sequence
template<std::size_t ... >
struct index_seq
{};

//builds the index_seq<...> struct with the indices (boils down to compile-time indexing)
template<std::size_t N, std::size_t ... Seq>
struct gen_indices
  : gen_indices<N-1, N-1, Seq ... >
{};

template<std::size_t ... Seq>
struct gen_indices<0, Seq ... >
{
    typedef index_seq<Seq ... > type;
};


template <typename RType>
struct bind_to_fcn
{
    template <class Fcn, class ... Args>
    std::function<RType()> fcn_bind(Fcn fcn, std::tuple<Args...> params)
    {
        return bindFunc(typename gen_indices<sizeof...(Args)>::type(), fcn, params);
    }

    template<std::size_t ... Seq, class Fcn, class ... Args>
    std::function<RType()> bindFunc(index_seq<Seq...>, Fcn fcn, std::tuple<Args...> params)
    {
        return std::bind(fcn, std::get<Seq>(params) ...);
    }
};

//some arbitrary testing function to use
double foo(int x, float y, double z)
{
    return x + y + z;
}

int main(void)
{
    //some tuple of parameters to use in the function call
    std::tuple<int, float, double> t = std::make_tuple(1, 2.04, 0.1);                                                                                                                                                                                                      
    typedef double(*SumFcn)(int,float,double);

    bind_to_fcn<double> binder;
    auto other_fcn_obj = binder.fcn_bind<SumFcn>(foo, t);
    std::cout << other_fcn_obj() << std::endl;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.