यह कुछ लोगों द्वारा कहा जाता है कि यदि आप ठोस सिद्धांतों को उनके चरम पर ले जाते हैं, तो आप कार्यात्मक प्रोग्रामिंग पर समाप्त होते हैं । मैं इस लेख से सहमत हूं लेकिन मुझे लगता है कि कुछ शब्दार्थ इंटरफ़ेस / ऑब्जेक्ट से फ़ंक्शन / क्लोजर तक के संक्रमण में खो जाते हैं, और मैं जानना चाहता हूं कि कार्यात्मक प्रोग्रामिंग नुकसान को कैसे कम कर सकता है।
लेख से:
इसके अलावा, यदि आप इंटरफ़ेस अलगाव सिद्धांत (ISP) को कठोरता से लागू करते हैं, तो आप समझेंगे कि आपको हैडर इंटरफेस पर रोल इंटरफेसेस का पक्ष लेना चाहिए।
यदि आप अपने डिज़ाइन को छोटे और छोटे इंटरफेस की ओर चला रहे हैं, तो आप अंततः अंतिम भूमिका इंटरफ़ेस पर पहुँचेंगे: एकल विधि वाला इंटरफ़ेस। मेरे साथ ऐसा बहुत होता है। यहाँ एक उदाहरण है:
public interface IMessageQuery
{
string Read(int id);
}
अगर मैं एक पर निर्भरता लेता हूं IMessageQuery
, तो निहित अनुबंध का एक हिस्सा यह है कि कॉलिंग के Read(id)
लिए खोज करेंगे और दिए गए आईडी के साथ एक संदेश वापस करेंगे।
इसके समकक्ष कार्यात्मक हस्ताक्षर पर निर्भरता लेने के लिए इस की तुलना करें, int -> string
। बिना किसी अतिरिक्त संकेत के, यह कार्य एक सरल हो सकता है ToString()
। यदि आपने I के IMessageQuery.Read(int id)
साथ कार्यान्वित किया है ToString()
तो आप पर जानबूझकर विध्वंसक होने का आरोप लगा सकते हैं!
तो, कार्यात्मक प्रोग्रामर एक अच्छी तरह से नामित इंटरफ़ेस के शब्दार्थ को संरक्षित करने के लिए क्या कर सकते हैं? क्या यह पारंपरिक है, उदाहरण के लिए, एकल सदस्य के साथ रिकॉर्ड प्रकार बनाएं?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... शायद यह है कि प्रलेखन अनुबंध का हिस्सा क्यों है ?