দেখে মনে হচ্ছে এফ # কোড প্রায়শই ধরণের সাথে মেলে। অবশ্যই
match opt with
| Some val -> Something(val)
| None -> Different()
সাধারণ বলে মনে হচ্ছে
তবে ওওপি দৃষ্টিকোণ থেকে, এটি রানটাইম টাইপ চেকের উপর ভিত্তি করে নিয়ন্ত্রণ-প্রবাহের মতো একটি ভয়ঙ্কর দেখতে পাওয়া যায়, যা সাধারণত নষ্ট হয়ে যায়। এটি বানানটি বলতে, OOP এ আপনি সম্ভবত অতিরিক্ত লোডিং ব্যবহার করতে পছন্দ করবেন:
type T =
abstract member Route : unit -> unit
type Foo() =
interface T with
member this.Route() = printfn "Go left"
type Bar() =
interface T with
member this.Route() = printfn "Go right"
এটি অবশ্যই আরও কোড। ওও, আমার OOP-y মনে মনে কাঠামোগত সুবিধাগুলি আছে:
- একটি নতুন ফর্ম এক্সটেনশন
T
সহজ; - রুট-বেছে নেওয়া নিয়ন্ত্রণ প্রবাহের সদৃশ সন্ধানের জন্য আমাকে চিন্তার দরকার নেই; এবং
- রুট পছন্দ এই অর্থে অপরিবর্তনীয় যে একবার আমার
Foo
হাতে চলে গেলে ,Bar.Route()
এর বাস্তবায়ন সম্পর্কে আমার কখনই চিন্তা করার দরকার নেই
আমি যে ধরণেরগুলি দেখছি না তার বিপরীতে প্যাটার্ন-মিলের সুবিধা রয়েছে কি? এটিকে কী অহংকার হিসাবে বিবেচনা করা হয় বা এটি এমন একটি দক্ষতা যা সাধারণত ব্যবহৃত হয় না?
But from an OOP perspective, that looks an awful lot like control-flow based on a runtime type check, which would typically be frowned on.
- খুব কৌতূহলোদ্দীপক শোনায়। কখনও কখনও, আপনি আপনার ওপেনকে আপনার শ্রেণিবিন্যাস থেকে পৃথক করতে চান: সম্ভবত 1) আপনি ক্রমবিন্যাসের জন্য একটি বিকল্প যোগ করতে পারবেন না খ / সি আপনি যে স্তরক্রমের মালিক নন; 2) আপনি যে ক্লাসগুলি পছন্দ করতে চান তা আপনার শ্রেণিবিন্যাসের সাথে মেলে না; 3) আপনি আপনার শ্রেণিবিন্যাসে অপশন যুক্ত করতে পারেন, তবে খ / সি করতে চান না আপনি বেশিরভাগ ক্লায়েন্ট ব্যবহার করেন না এমন গুচ্ছ গুচ্ছ দিয়ে আপনার শ্রেণিবিন্যাসের API এলোমেলো করতে চান না।