ऐसा लगता है कि एफ # कोड अक्सर पैटर्न के खिलाफ मेल खाता है। निश्चित रूप से
match opt with
| Some val -> Something(val)
| None -> Different()
आम लगता है।
लेकिन एक OOP के नजरिए से, यह रनटाइम प्रकार की जांच के आधार पर नियंत्रण-प्रवाह जैसा एक भयानक रूप दिखता है, जो आम तौर पर विफल हो जाएगा। इसे समाप्त करने के लिए, 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"
यह निश्चित रूप से अधिक कोड है। OTOH, यह संरचनात्मक लाभ के लिए मेरे 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) आप पदानुक्रम b / c में एक ऑप को नहीं जोड़ सकते हैं; 2) जिन वर्गों को आप चाहते हैं, वे आपके पदानुक्रम से मेल नहीं खाते हैं; 3) आप अपने पदानुक्रम में ऑप जोड़ सकते हैं, लेकिन आप अपने पदानुक्रम के API को अव्यवस्था के एक समूह के साथ अव्यवस्थित नहीं करना चाहते हैं, जिसे ज्यादातर ग्राहक उपयोग नहीं करते हैं।