ক্লাসের সাথে ওওপির তুলনায় কার্যকরী প্রোগ্রামিং


32

আমি ইদানীং কার্যকরী প্রোগ্রামিংয়ের কয়েকটি ধারণায় আগ্রহী। আমি কিছু সময়ের জন্য ওওপি ব্যবহার করেছি। আমি দেখতে পাচ্ছি কীভাবে আমি ওওপিতে মোটামুটি জটিল অ্যাপ তৈরি করব। প্রতিটি বস্তু জানতে পারে যে জিনিসগুলি কী করে তা কীভাবে করা যায়। বা এটির পিতামাতাদের ক্লাসে কিছু করা যায়। সুতরাং আমি কেবল Person().speak()ব্যক্তিটিকে কথা বলার জন্য বলতে পারি।

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

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

রেফারেন্সের জন্য, ওওপির সাথে আমার প্রাথমিক অভিজ্ঞতাটি পাইথন, পিএইচপি এবং কিছু সি #। আমি যে ভাষাগুলিতে দেখছি সেগুলির কার্যকরী বৈশিষ্ট্যগুলি হ'ল স্কেলা এবং হাস্কেল। যদিও আমি স্কেলার দিকে ঝুঁকছি।

বেসিক উদাহরণ (পাইথন):

Animal(object):
    def say(self, what):
        print(what)

Dog(Animal):
    def say(self, what):
        super().say('dog barks: {0}'.format(what))

Cat(Animal):
    def say(self, what):
        super().say('cat meows: {0}'.format(what))

dog = Dog()
cat = Cat()
dog.say('ruff')
cat.say('purr')

স্কালা OOP + FP হিসাবে ডিজাইন করা হয়েছে, সুতরাং আপনাকে বেছে নিতে হবে না
কার্তিক টি

1
হ্যাঁ আমি সচেতন, তবে আমি বৌদ্ধিক কারণেও জানতে চাইছি। ক্রিয়ামূলক ভাষাগুলিতে বস্তুর সমতুল্য আমি কিছুই খুঁজে পাচ্ছি না ala
ডিসি

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


উত্তর:


21

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

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

কার্যকরী ভাষা সাধারণভাবে বহুবর্ষ অর্জনের জন্য বিভিন্ন বিকল্প সরবরাহ করে:

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

উদাহরণস্বরূপ, এখানে বহুবিধ ব্যবহার করে আপনার সমস্যার ক্লোজার বাস্তবায়ন:

;; define a multimethod, that dispatched on the ":type" keyword
(defmulti say :type)  

;; define specific methods for each possible value of :type. You can add more later
(defmethod say :cat [animal what] (println (str "Car purrs: " what)))
(defmethod say :dog [animal what] (println (str "Dog barks: " what)))
(defmethod say :default [animal what] (println (str "Unknown noise: " what)))

(say {:type :dog} "ruff")
=> Dog barks: ruff

(say {:type :ape} "ook")
=> Unknown noise: ook

নোট করুন যে এই আচরণের জন্য কোনও স্পষ্ট ক্লাস সংজ্ঞায়িত করার প্রয়োজন নেই: নিয়মিত মানচিত্রগুলি ঠিকঠাক করে। প্রেরণ ফাংশন (: এই ক্ষেত্রে টাইপ করুন) আর্গুমেন্টের যেকোন স্বেচ্ছাসেবী কাজ হতে পারে।


100% পরিষ্কার নয়, তবে আপনি কোথায় যাচ্ছেন তা দেখার পক্ষে যথেষ্ট। আমি একটি প্রদত্ত ফাইলে এটি 'প্রাণী' কোড হিসাবে দেখতে পেতাম। এছাড়াও শাখা / কন্ডিশনের অংশটিও ভাল। আমি / অন্যথায় বিকল্প হিসাবে বিবেচনা ছিল না।
ডিসি

11

এটি সরাসরি উত্তর নয় বা প্রয়োজনীয়ভাবে 100% সঠিকও নয় কারণ আমি কোনও কার্যনির্বাহী ভাষা বিশেষজ্ঞ নই। তবে উভয় ক্ষেত্রেই আমি আপনাদের সাথে আমার অভিজ্ঞতা শেয়ার করব ...

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

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

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

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

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

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

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

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


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

দুর্দান্ত উত্তর। ফানকশনাল পুলের পাশে দাঁড়িয়ে প্রত্যেকের সাথে কথা বলুন তবে পানিতে তাদের পায়ের আঙ্গুলটি
ডুববে

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

8

হাস্কেলের কাছে আপনার নিকটতম স্থানটি "ক্লাস"। এই ক্লাসটি জাভা এবং সি ++ এর ক্লাসের মতো না হলেও এই ক্ষেত্রে আপনি যা চান তার জন্য কাজ করবে।

আপনার ক্ষেত্রে আপনার কোডটি কেমন দেখাচ্ছে।

বর্গ প্রাণী যেখানে 
say :: স্ট্রিং -> শব্দ 

তারপরে এই পদ্ধতিগুলিকে মানিয়ে নেওয়ার জন্য আপনার স্বতন্ত্র ডেটা থাকতে পারে।

উদাহরণ যেখানে পশু কুকুর
s = "ছাল" ++ গুলি বলুন 

সম্পাদনা: - আপনি কুকুরের জন্য বিশেষত বলতে পারার আগে আপনাকে সিস্টেমটি বলতে হবে যে কুকুরটি প্রাণী।

ডেটা কুকুর = \ - এখানে কিছু - \ (প্রাণী প্রাপ্ত)

সম্পাদনা: - উইলকের জন্য।
এখন আপনি যদি কোনও ফাংশনে বলুন foo বলুন ব্যবহার করতে চান তবে আপনাকে হেস্কেলকে বলতে হবে যে ফু কেবলমাত্র প্রাণীর সাথেই কাজ করতে পারে।

foo :: (প্রাণী ক) => ক -> স্ট্রিং -> স্ট্রিং
foo a str = বলুন একটি str 

এখন আপনি যদি কুকুরের সাথে foo কল করেন তবে এটি ছাঁটাই হয়ে যাবে, আপনি যদি বিড়ালের সাথে ডাকেন তবে তা বন্ধ হয়ে যাবে।

main = do 
আসুন d = কুকুর (\ - সিএসটি প্যারামিটার - \)
    গ = বিড়াল  
শোতে $ foo d "হ্যালো ওয়ার্ল্ড"

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


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

নাইটপিক এনিমেলকে মূলধন করা উচিত
ড্যানিয়েল গ্রেটজার

1
কীভাবে এই ফাংশনটি জানতে পারে যে আপনি যদি একটি স্ট্রিং নেন তবে আপনি এটি একটি কুকুরের উপর কল করেছেন? এবং কিছু বিল্ট-ইন ক্লাসের জন্য "ডেরাইভিং" না?
উইলকিউ

6

কার্যক্ষম ভাষাগুলি পলিমারফিজম অর্জনের জন্য 2 টি কনস্ট্রাক্ট ব্যবহার করে:

  • প্রথম অর্ডার ফাংশন
  • জেনেরিক্স

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

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


2
ওওপি হ'ল বহুত্ববাদ সম্পর্কে। যদি আপনি ভাবেন যে ওওপি আপনার ডেটার সাথে ফাংশন বাঁধতে চলেছে তবে আপনি ওওপি সম্পর্কে কিছুই জানেন না।
ইউফোরিক

4
পলিমারফিজম ওওপির একটি দিক, এবং আমি মনে করি না যে ওপি সত্যিই জিজ্ঞাসা করছে।
ডক ব্রাউন

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

1
@ এরিকরেপেন যদি "ইন্টারফেস প্রয়োগ করেন" প্রায়শই প্রয়োজন হয় না, তবে আপনি ওওপি করছেন না। এছাড়াও, হাস্কেলের মডিউলগুলিও রয়েছে।
ইউফোরিক

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

0

এটি সত্যিই নির্ভর করে আপনি কী অর্জন করতে চান তার উপর।

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

def bark(what):
    print "barks: {0}".format(what) 

def meow(what):
    print "meows: {0}".format(what)

def climb(how):
    print "climbs: {0}".format(how)

if __name__ == "__main__":
    animals = {'dog': {'say': bark},
               'cat': {'say': meow,
                       'climb': climb}}
    animals['dog']['say']("ruff")
    animals['cat']['say']("purr")
    animals['cat']['climb']("well")

তবে খেয়াল করুন, (ক) কুকুর বা বিড়ালের কোনও 'দৃষ্টান্ত' নেই এবং (খ) আপনাকে নিজের জিনিসগুলির 'টাইপ' নিজেকে রাখতে হবে।

উদাহরণস্বরূপ পছন্দ: pets = [['martin','dog','grrrh'], ['martha', 'cat', 'zzzz']]। তাহলে আপনি যেমন একটি তালিকা বোধগম্য করতে পারেন[animals[pet[1]]['say'](pet[2]) for pet in pets]


0

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

উত্তর, প্রযোজ্য হলে

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

দোষটি ওপি-তে হয় না, তবে প্রশ্নটি নিয়ে বেশ কয়েকটি সমস্যা রয়েছে।

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

  2. এফপি এবং এসওএতে ডেটা বিজনেস লজিক থেকে পৃথক করা হয়। অর্থাৎ ডেটা এবং লজিক একসাথে যায় না। লজিক পরিষেবাগুলিতে চলে যায় এবং ডেটা (ডোমেন মডেল) এর বহুবিধ আচরণ হয় না (নোট 2 দেখুন)।

  3. পরিষেবাদি এবং কার্যাদি বহুবিধ হতে পারে ym এফপিতে, আপনি ঘন ঘন মানগুলির পরিবর্তে অন্যান্য কার্যগুলিতে পরামিতি হিসাবে ফাংশনগুলি পাস করেন। আপনি কলযোগ্য বা ফানকের মতো প্রকারের ওও ভাষায়ও একই কাজ করতে পারেন তবে তা প্রচণ্ড চলমান হয় না (দেখুন দ্রষ্টব্য 3)। এফপি এবং এসওএতে, আপনার মডেলগুলি বহুবর্ষজীবী নয়, কেবল আপনার পরিষেবা / ক্রিয়াকলাপ। (নোট 4 দেখুন)

  4. সেই উদাহরণটিতে হার্ডকোডিংয়ের একটি খারাপ মামলা রয়েছে। আমি কেবল লাল রঙের স্ট্রিং "কুকুরের ছাল" সম্পর্কে কথা বলছি না। আমি নিজেরাই ক্যাটমোডেল এবং ডগমোডেলের কথা বলছি। আপনি যখন একটি মেষ যুক্ত করতে চান তখন কি হবে? আপনার কোডে intoুকে নতুন কোড তৈরি করতে হবে? কেন? প্রোডাকশন কোডে, আমি বরং এটির বৈশিষ্ট্যগুলির সাথে একটি অ্যানিমাল মডেল দেখতে চাই। সবচেয়ে খারাপভাবে, একটি এম্ফিবিয়ান মডেল এবং একটি ফাউলমডেল যদি তাদের সম্পত্তি এবং পরিচালন এত আলাদা হয় are

আমি একটি বর্তমান "ওও" ভাষায় এটি দেখতে প্রত্যাশা করব:

public class Animal
{
    public int AnimalID { get; set; }
    public int LegCount { get; set; }
    public string Name { get; set; }
    public string WhatISay { get; set; }
}

public class AnimalService : IManageAnimals
{
    private IPersistAnimals _animalRepo;
    public AnimalService(IPersistAnimals animalRepo) { _animalRepo = animalRepo; }

    public List<Animal> GetAnimals() => _animalRepo.GetAnimals();

    public string WhatDoISay(Animal animal)
    {
        if (!string.IsNullOrWhiteSpace(animal.WhatISay))
            return animal.WhatISay;

        return _animalRepo.GetAnimalNoise(animal.AnimalID);
    }
}

বেসিক ফ্লো

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

ওও ভাষা এফপির এক ধাপ কাছাকাছি

আপনি এটিকে আরও খানিকটা এগিয়ে নিয়ে যেতে পারেন এবং আপনার এসওএ পরিষেবাদিগুলিকে দুটি প্রকারে বিভক্ত করতে পারেন।

Alচ্ছিক শ্রেণীর ধরণ 1 : এন্ট্রি পয়েন্টগুলির জন্য সাধারণ ইন্টারফেস-প্রয়োগকারী পরিষেবাদি। এগুলি হবে "অপরিষ্কার" এন্ট্রি-পয়েন্টস যা "খাঁটি" বা "অপবিত্র" অন্যান্য কার্যকারিতাতে কল করতে পারে। এটি কোনও RESTful API থেকে আপনার এন্ট্রি পয়েন্ট হতে পারে।

Alচ্ছিক শ্রেণির ধরণ 2 : খাঁটি ব্যবসায় যুক্তিযুক্ত পরিষেবা। এগুলি স্ট্যাটিক ক্লাস যা "খাঁটি" কার্যকারিতা রয়েছে। এফপিতে, "খাঁটি" অর্থ কোনও পার্শ্ব প্রতিক্রিয়া নেই। এটি স্পষ্টভাবে কোথাও রাষ্ট্র বা দৃistence়তা সেট করে না। (নোট 5 দেখুন)

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

নোট

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

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

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

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

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


-2

আপনি এই মত কিছু করতে পারে .. পিএইচপি

    function say($whostosay)
    {
        if($whostosay == 'cat')
        {
             return 'purr';
        }elseif($whostosay == 'dog'){
             return 'bark';
        }else{
             //do something with errors....
        }
     }

     function speak($whostosay)
     {
          return $whostosay .'\'s '.say($whostosay);
     }
     echo speak('cat');
     >>>cat's purr
     echo speak('dog');
     >>>dogs's bark

1
আমি কোন নেতিবাচক ভোট দেয় নি। তবে আমার ধারণাটি হ'ল কারণ এটি এই দৃষ্টিভঙ্গিটি কার্যকর নয় বরং উদ্দেশ্য ভিত্তিক।
মনোজ আর

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