कभी-कभी मशीन के साथ सीधे इंटरफ़ेस करने के लिए निम्न-स्तरीय भाषाओं के स्थान पर OO भाषाओं का उपयोग किया जा सकता है। C ++ सुनिश्चित करने के लिए, लेकिन यहां तक कि C # के लिए भी एडेप्टर और ऐसे हैं। यद्यपि यांत्रिक भागों को नियंत्रित करने के लिए कोड लिखना और स्मृति पर मिनट नियंत्रण रखना सबसे अच्छा संभव के रूप में निम्न-स्तर के करीब रखा जाता है। लेकिन अगर यह प्रश्न वर्तमान ऑब्जेक्ट-ओरिएंटेड सॉफ़्टवेयर जैसे लाइन ऑफ़ बिज़नेस, वेब एप्लिकेशन, IOT, वेब सर्विसेज और बहुसंख्यक उपयोग किए गए अनुप्रयोगों से संबंधित है, तो ...
उत्तर, यदि लागू हो
पाठक एक सेवा-उन्मुख वास्तुकला (SOA) के साथ काम करने की कोशिश कर सकते हैं। यानी, DDD, N- लेयर्ड, N-Tiered, Hexagonal, जो भी हो। मैंने एक बड़े व्यावसायिक अनुप्रयोग को कुशलतापूर्वक "पारंपरिक" OO (सक्रिय-रिकॉर्ड या रिच-मॉडल) का उपयोग नहीं देखा है क्योंकि यह पिछले दशक में 70 और 80 के बहुत अधिक वर्णन किया गया था। (नोट 1 देखें)
गलती ओपी के साथ नहीं है, लेकिन सवाल के साथ कुछ समस्याएं हैं।
उदाहरण आप प्रदान करते हैं बस बहुरूपता प्रदर्शित करने के लिए, यह उत्पादन कोड नहीं है। कभी-कभी उदाहरण बिल्कुल वैसा ही होता है जैसा कि शब्दशः लिया जाता है।
FP और SOA में, डेटा को बिजनेस लॉजिक से अलग किया जाता है। यानी डेटा और लॉजिक एक साथ नहीं चलते। तर्क सेवाओं में चला जाता है, और डेटा (डोमेन मॉडल) में पॉलीमॉर्फिक व्यवहार नहीं होता है (नोट 2 देखें)।
सेवाएँ और कार्य बहुरूपी हो सकते हैं। एफपी में, आप अक्सर मानों के बजाय अन्य कार्यों के मापदंडों के रूप में कार्य करते हैं। आप OO भाषाओं में Callable या Func जैसे प्रकारों के साथ कर सकते हैं, लेकिन यह बड़े पैमाने पर नहीं चलता है (नोट 3 देखें)। FP और SOA में, आपके मॉडल केवल आपकी सेवाएँ / कार्य पॉलिमॉर्फिक नहीं हैं। (नोट 4 देखें)
उस उदाहरण में हार्डकोडिंग का एक बुरा मामला है। मैं न केवल लाल रंग के स्ट्रिंग "कुत्ते के छाल" के बारे में बात कर रहा हूं। मैं खुद CatModel और DogModel के बारे में भी बात कर रहा हूं। जब आप एक भेड़ जोड़ना चाहते हैं तो क्या होता है? आपको अपने कोड में जाना होगा और नया कोड बनाना होगा? क्यूं कर? उत्पादन कोड में, मैं इसके गुणों के साथ सिर्फ एक AnimalModel देखना चाहूंगा। सबसे कम, एक AmphibianModel और एक FowlModel अगर उनके गुण और हैंडलिंग अलग हैं।
यह वह है जो मैं एक "ओओ" भाषा में देखने की उम्मीद करूंगा:
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);
}
}
आप OO से कार्यात्मक प्रोग्रामिंग में कक्षाएं कैसे स्थानांतरित करते हैं? जैसा कि दूसरों ने कहा है; आप कर सकते हैं, लेकिन आप वास्तव में नहीं। उपर्युक्त बिंदु यह प्रदर्शित करना है कि आपको जावा और सी # करते समय भी कक्षाओं (दुनिया के पारंपरिक अर्थों में) का उपयोग नहीं करना चाहिए। एक बार जब आप सर्विस-ओरिएंटेड आर्किटेक्चर (DDD, लेयर्ड, टिएरेड, हेक्सागोनल, जो भी हो) में कोड लिखने के लिए तैयार हो जाते हैं, तो आप कार्यात्मक से एक कदम आगे होंगे क्योंकि आप अपने लॉजिकल फंक्शंस (सर्विसेज) से अपना डेटा (डोमेन मॉडल) अलग कर लेते हैं।
OO भाषा FP के करीब एक कदम है
आप इसे थोड़ा और आगे ले जा सकते हैं और अपनी SOA सेवाओं को दो प्रकारों में विभाजित कर सकते हैं।
वैकल्पिक कक्षा प्रकार 1 : प्रवेश बिंदुओं के लिए सामान्य इंटरफ़ेस-कार्यान्वयन सेवाएँ। ये एंट्री-पॉइंट "अशुद्ध" होंगे जो "शुद्ध" या "इंप्रूव" अन्य कार्यक्षमता में कॉल कर सकते हैं। यह आपके RESTful API से एंट्री पॉइंट हो सकता है।
वैकल्पिक क्लास टाइप 2 : प्योर बिजनेस लॉजिक सर्विसेज। ये स्टैटिक क्लास हैं जिनकी "शुद्ध" कार्यक्षमता है। एफपी में, "शुद्ध" का मतलब है कि कोई दुष्प्रभाव नहीं हैं। यह स्पष्ट रूप से राज्य या दृढ़ता को कहीं भी निर्धारित नहीं करता है। (नोट 5 देखें)
इसलिए जब आप ऑब्जेक्ट-ओरिएंटेड लैंग्वेजेज में क्लासेस के बारे में सोचते हैं, तो एक सर्विस-ओरिएंटेड आर्किटेक्चर में इस्तेमाल होने के कारण, यह न केवल आपके OO कोड को फायदा पहुंचाता है, यह फंक्शनल प्रोग्रामिंग को समझने में बहुत आसान लगता है।
टिप्पणियाँ
नोट 1 : मूल "रिच" या "एक्टिव-रिकॉर्ड" ऑब्जेक्ट-ओरिएंटेड डिज़ाइन अभी भी आसपास है। जब लोग एक दशक या उससे अधिक समय पहले "इसे सही कर रहे थे" तो उस समय की तरह बहुत सारी विरासत कोड थे। पिछली बार मैंने देखा था कि इस तरह का कोड (सही तरीके से किया गया) सी ++ में एक वीडियो गेम कोडबेस से था, जहां वे ठीक से मेमोरी को नियंत्रित कर रहे थे और बहुत सीमित स्थान था। एफपी और सर्विस-ओरिएंटेड आर्किटेक्चर जानवर नहीं हैं और हार्डवेयर पर विचार नहीं करना चाहिए। लेकिन वे लगातार परिवर्तन करने, बनाए रखने की क्षमता रखते हैं, चर डेटा आकार और अन्य पहलुओं को प्राथमिकता के रूप में रखते हैं। वीडियो गेम और मशीन एआई में, आप संकेतों और डेटा को बहुत सटीक रूप से नियंत्रित करते हैं।
नोट 2 : डोमेन मॉडल में पॉलीमॉर्फिक व्यवहार नहीं है, न ही उनके पास बाहरी निर्भरता है। वे "पृथक" हैं। इसका मतलब यह नहीं है कि उन्हें 100% एनीमिक होना चाहिए। उनके निर्माण और उत्परिवर्तनीय संपत्ति परिवर्तन से संबंधित बहुत सारे तर्क हो सकते हैं, अगर ऐसा लागू होता है। डीडीडी "मूल्य वस्तुओं" और एरिक इवांस और मार्क सीमन द्वारा एंटिटीज देखें।
नोट 3 : लिन्क और लैंबडा बहुत आम हैं। लेकिन जब कोई उपयोगकर्ता एक नया फ़ंक्शन बनाता है, तो वे शायद ही कभी फंक या कॉलेबल को मापदंडों के रूप में उपयोग करते हैं, जबकि एफपी में उस पैटर्न का पालन किए बिना कार्यों के बिना ऐप देखना अजीब होगा।
नोट 4 : वंशानुक्रम के साथ बहुरूपता को भ्रमित नहीं करना। एक कैटमॉडल एनिमलबेस को इनहेरिट करने के लिए निर्धारित कर सकती है कि कौन से गुण एक जानवर के पास हैं। लेकिन जैसा कि मैं दिखाता हूं, इस तरह के मॉडल एक कोड गंध हैं । यदि आप इस पैटर्न को देखते हैं, तो आप इसे तोड़ने और इसे डेटा में बदलने पर विचार कर सकते हैं।
नोट 5 : शुद्ध कार्य मापदंडों के रूप में कार्यों को स्वीकार कर सकते हैं (और कर सकते हैं)। आने वाला कार्य अशुद्ध हो सकता है, लेकिन शुद्ध हो सकता है। परीक्षण के प्रयोजनों के लिए, यह हमेशा शुद्ध होगा। लेकिन उत्पादन में, हालांकि इसे शुद्ध माना जाता है, लेकिन इसके दुष्प्रभाव हो सकते हैं। यह इस तथ्य को नहीं बदलता है कि शुद्ध कार्य शुद्ध है। हालांकि पैरामीटर फ़ंक्शन अशुद्ध हो सकता है। भ्रामक नहीं! : डी