जैसे-जैसे आप प्रोग्रामिंग के बारे में अधिक गंभीर होते जाते हैं, आप अनिवार्य रूप से "कोड टू एन इंटरफ़ेस" वाक्यांश का सामना करते हैं, चाहे वह वीडियो, किताबें या लेख में हो। और यह मेरे लिए कभी भी समझ में नहीं आया। मैंने इंटरफ़ेस बनाने और फिर उसे लागू करने की आवश्यकता पर सवाल उठाया। मैं यह कैसे निर्धारित करूँ कि इन इंटरफ़ेस का उपयोग कब और कहाँ करना है?
जब भी मैं कोई ट्यूटोरियल देखता या कोई लेख पढ़ता, तो वे समझाते कि इंटरफ़ेस क्या है, "यह कार्यान्वयन के बिना एक क्लास है", और मैं कहता "एहम्म, धन्यवाद 😏"। मेरा मतलब है, मैं पहले से ही यह जानता था; मैं वास्तव में जानना चाहता था कि इसका उपयोग क्यों और कब करना है।
मुझे याद है कि एक दिन मैंने डिस्कॉर्ड समुदाय पर पूछा था, और एक वरिष्ठ ने बस इतना कहा था, "चिंता मत करो; यह अंततः आपके लिए क्लिक करेगा", और ऐसा हुआ, इसमें कुछ समय लगा, लेकिन यह हुआ। यदि आप ऐसा अनुभव कर रहे हैं, तो जान लें कि हम सभी वहां से गुजरे हैं; आइए आपको यह समझने में मदद करें कि आपको इंटरफ़ेस के लिए कोड करने की आवश्यकता क्यों है।
चूंकि AI का बोलबाला है और हर कोई इसके बारे में अपनी राय खो रहा है, इसलिए हम पार्टी में देर से नहीं पहुंचना चाहते। हम इसे अपनी वेबसाइट पर जोड़ना चाहते हैं, एक छोटा चैटबॉट जो हमारे उत्पाद के बारे में सवालों के जवाब देगा, वह ऐसा करेगा।
मैं अपने उदाहरण के लिए PHP का उपयोग करूँगा; आप जिस भी भाषा में सहज हों, उसका उपयोग करने के लिए स्वतंत्र हैं। जो बात मायने रखती है, वह है अवधारणा।
हमारा चैटबॉट इतना सरल हो सकता है:
<?php class ChatBot { public function ask(string $question): string { $client = new OpenAi(); $response = $client->ask($question); return $response; } }
इसमें एक एकल विधि ask()
है, जो उनके API से कनेक्ट करने के लिए OpenAI
SDK का उपयोग करती है, एक प्रश्न पूछती है, और फिर केवल प्रतिक्रिया लौटाती है।
अब हम अपने चैटबॉट का उपयोग शुरू कर सकते हैं
$bot = new ChatBot(); $response = $bot->ask('How much is product X'); // The product costs $200.
अब तक, कार्यान्वयन अच्छा लग रहा है, यह उम्मीद के मुताबिक काम कर रहा है, और परियोजना तैनात और उपयोग में है। लेकिन, हम इस बात से इनकार नहीं कर सकते कि हमारा चैटबॉट ओपन एआई एपीआई पर बहुत अधिक निर्भर है; मुझे यकीन है कि आप सहमत होंगे।
अब, आइए एक परिदृश्य पर विचार करें जहां ओपन एआई की कीमतें दोगुनी हो जाती हैं, और बढ़ती रहती हैं, हमारे पास क्या विकल्प हैं? हम या तो बस अपनी किस्मत को स्वीकार कर लेते हैं, या किसी अन्य API की तलाश करते हैं। पहला विकल्प आसान है, हम बस उन्हें भुगतान करते रहते हैं, और दूसरा विकल्प उतना आसान नहीं है जितना लगता है। नए प्रदाता के पास संभवतः अपना स्वयं का API और SDK होगा; हमें ओपन AI के लिए मूल रूप से डिज़ाइन किए गए सभी वर्गों, परीक्षणों और संबंधित घटकों को अपडेट करना होगा, यह बहुत काम है।
इससे चिंताएँ भी पैदा होती हैं; क्या होगा अगर नया API सटीकता के मामले में हमारी अपेक्षाओं को पूरा नहीं करता या डाउनटाइम बढ़ा देता है? क्या होगा अगर हम एक ही समय में अलग-अलग प्रदाताओं के साथ प्रयोग करना चाहते हैं? उदाहरण के लिए, अपने सब्सक्राइब्ड क्लाइंट को OpenAI क्लाइंट प्रदान करना जबकि गेस्ट के लिए एक सरल API का उपयोग करना? आप देख सकते हैं कि यह कितना जटिल हो सकता है, और आप जानते हैं क्यों? क्योंकि हमारा कोड खराब तरीके से डिज़ाइन किया गया था।
हमारे पास कोई विज़न नहीं था; हमने बस एक API चुना और पूरी तरह से उस पर और उसके कार्यान्वयन पर निर्भर थे। अब, "कोड टू इंटरफ़ेस" का सिद्धांत हमें इन सब से बचा सकता था। कैसे? आइए देखते हैं।
आइये एक इंटरफ़ेस बनाने से शुरुआत करें:
<?php interface AIProvider { public function ask(string $question): string; }
हमारे पास अपना इंटरफ़ेस है, या जैसा कि मैं इसे कहना पसंद करता हूँ, एक अनुबंध। आइए इसे लागू करें या इसके लिए कोड लिखें।
<?php class OpenAi implements AIProvider { public function ask(string $question): string { $openAiSdk = new OpenAiSDK(); $response = $openAiSdk->ask($question); return "Open AI says: " . $response; } } class RandomAi implements AIProvider { public function ask(string $question): string { $randomAiSdk = new RandomAiSDK(); $response = $randomAiSdk->send($question); return "Random AI replies: " . $response->getResponse(); } }
वास्तव में,
OpenAiSDK
औरRandomAiSDK
दोनों को कन्स्ट्रक्टर के माध्यम से इंजेक्ट किया जाएगा। इस तरह, हम जटिल इंस्टेंटिएशन लॉजिक को DI कंटेनर में सौंप देते हैं, एक अवधारणा जिसे नियंत्रण का व्युत्क्रम कहा जाता है। ऐसा इसलिए है क्योंकि प्रत्येक प्रदाता को आम तौर पर कुछ कॉन्फ़िगरेशन की आवश्यकता होती है।
अब हमारे पास दो प्रदाता हैं जिनका उपयोग हम प्रश्नों के उत्तर देने के लिए कर सकते हैं। उनके कार्यान्वयन के बावजूद, हमें विश्वास है कि जब कोई प्रश्न दिया जाएगा, तो वे अपने API से जुड़ेंगे और उसका उत्तर देंगे। उन्हें अनुबंध AIProvider
का पालन करना होगा।
अब, हमारे ChatBot
में, हम निम्नलिखित कार्य कर सकते हैं
class ChatBot { private AIProvider $client; // A dependency can be injected via the constructor public function __construct(AIProvider $client) { $this->client = $client; } // It can also be set via a setter method public function setClient(AIProvider $client): void { $this->client = $client; } public function ask(string $question): string { return $this->client->ask($question); } }
ध्यान दें कि उदाहरण का उद्देश्य कई तरीकों को प्रदर्शित करना है जिससे आप निर्भरता को इंजेक्ट कर सकते हैं, इस मामले में, एक
AIProvider
। आपको कंस्ट्रक्टर और सेटर्स दोनों का उपयोग करने की आवश्यकता नहीं है।
आप देख सकते हैं कि हमने कुछ बदलाव किए हैं; अब हम OpenAI पर निर्भर नहीं हैं, और आपको इसका कोई संदर्भ नहीं मिलेगा। इसके बजाय, हम अनुबंध/इंटरफ़ेस पर निर्भर हैं। और, किसी तरह, हम वास्तविक जीवन में इस उदाहरण से संबंधित हो सकते हैं; हम सभी कम से कम एक बार ChatBot
रहे हैं।
कल्पना करें कि आप सोलर पैनल सिस्टम खरीदते हैं। कंपनी इसे स्थापित करने के लिए तकनीशियन भेजने का वादा करती है, आपको आश्वासन देती है कि वे जो भी कर्मचारी भेजते हैं, काम पूरा हो जाएगा, और अंत में आपके पैनल स्थापित हो जाएंगे। इसलिए, आपको वास्तव में परवाह नहीं है कि वे जोश या जॉर्ज को भेजते हैं। वे अलग-अलग हो सकते हैं, एक दूसरे से बेहतर हो सकता है, लेकिन दोनों को पैनल स्थापित करने के लिए अनुबंधित किया जाता है।
वे ऐसा नहीं कहेंगे कि, आप जानते हैं कि मैं आपका टीवी ठीक कर रहा हूँ, बल्कि वे कंपनी द्वारा निर्दिष्ट कार्य करने के लिए बाध्य हैं। RandomAi
और OpenAi
दोनों ही AIProvider
के कर्मचारी के रूप में कार्य करते हैं; आप एक प्रश्न पूछते हैं, और वे उत्तर प्रदान करेंगे। जिस तरह से आपको इस बात की परवाह नहीं थी कि पैनल कौन स्थापित करता है, उसी तरह ChatBot
इस बात की बिल्कुल भी परवाह नहीं करनी चाहिए कि कौन काम करता है। उसे बस यह जानने की जरूरत है कि प्रदान किया गया कोई भी कार्यान्वयन इसे करेगा।
अब, आप स्वतंत्र रूप से एक या दूसरे का उपयोग कर सकते हैं।
$bot = new ChatBot(); // For subscribed users $bot = new ChatBot(new OpenAi()); $response = $bot->ask('How much is Product X'); // Open AI says: 200$ // For guests $bot->setClient(new RandomAi()); $response = $bot->ask('How much is Product X'); // Random AI replies: 200$
अब, आपके पास संपूर्ण API प्रदाता को बदलने की सुविधा है, और आपका कोड हमेशा एक जैसा व्यवहार करेगा। आपको इसके बारे में कुछ भी बदलने की ज़रूरत नहीं है क्योंकि आपने एक इंटरफ़ेस के लिए कोड किया है , इसलिए हमने पहले जो चिंताएँ उठाई थीं, उनमें से कोई भी समस्या नहीं होगी।
हमारे उदाहरण में, एक इंटरफेस को कोड करके, हमने SOLID के तीन सिद्धांतों का भी सम्मान किया है, बिना यह जाने कि हमने ऐसा किया है, मैं विस्तार से बताता हूँ।
मैं विस्तार से नहीं बताऊंगा; प्रत्येक सिद्धांत पर एक लंबा लेख लिखा जा सकता है। यह केवल एक संक्षिप्त विवरण है जो यह दर्शाता है कि इंटरफ़ेस कोडिंग करके हमें क्या हासिल हुआ।
पहला सिद्धांत जिसका हमने सम्मान किया वह है ओपन-क्लोज्ड सिद्धांत, जो कहता है कि कोड को विस्तार के लिए खुला होना चाहिए और संशोधन के लिए बंद होना चाहिए। यह सुनने में जितना चुनौतीपूर्ण लग सकता है, आपने इसे हासिल कर लिया है। इसके बारे में सोचें, ChatBot
अब संशोधन के लिए बंद है; हम कोड को फिर से नहीं छूएंगे। यह शुरू से ही हमारा लक्ष्य था।
लेकिन, यह विस्तार के लिए खुला है; अगर हम तीसरा, चौथा या पाँचवाँ प्रदाता भी जोड़ते हैं, तो हमें कोई रोक नहीं सकता। हम इंटरफ़ेस को लागू कर सकते हैं, और हमारा वर्ग इसे बॉक्स से बाहर उपयोग कर सकता है, किसी भी बदलाव की आवश्यकता नहीं है।
मैं आपको इसकी परिभाषा से बोर नहीं करूँगा, लेकिन मूल रूप से, यह बताता है कि आप कक्षाओं को उनके सभी उपवर्गों से प्रतिस्थापित कर सकते हैं और इसके विपरीत। तकनीकी रूप से, हमारे सभी AI प्रदाता are-a
AIProvider
हैं, और उनके कार्यान्वयन को एक दूसरे के लिए स्वैप किया जा सकता है, ChatBot
की शुद्धता को प्रभावित किए बिना, बाद वाले को यह भी नहीं पता है कि वह किस प्रदाता का उपयोग कर रहा है 😂, इसलिए हाँ, हमने सुश्री लिस्कोव का सम्मान किया।
मुझे स्वीकार करना चाहिए कि इस पर अलग से लेख लिखा जा सकता है। लेकिन सरल शब्दों में कहें तो सिद्धांत कहता है कि आपको ठोस चीज़ों के बजाय अमूर्त चीज़ों पर निर्भर रहना चाहिए, और हम यही कर रहे हैं। हम एक प्रदाता पर निर्भर हैं, ओपन एआई जैसे किसी विशिष्ट प्रदाता पर नहीं।
याद रखें, यह सब इसलिए है क्योंकि हमने एक इंटरफ़ेस के लिए कोड किया है।
जब भी आप किसी ऐसे क्लास को अपडेट करते हैं जिसके बारे में आपको पता है कि आपको अपडेट नहीं करना चाहिए, और आपका कोड if स्टेटमेंट के साथ हैक हो रहा है, तो आपको एक इंटरफ़ेस की आवश्यकता है। हमेशा अपने आप से पूछें, क्या इस क्लास को वास्तव में यह जानने की आवश्यकता है कि कैसे? क्या मैं हमेशा इस सेवा प्रदाता का उपयोग करूँगा? या डेटाबेस ड्राइवर? यदि नहीं, तो आप जानते हैं कि क्या करना है।
जैसा कि कहा जा रहा है, बस इसे कुछ समय दें, यह अंततः आपके लिए क्लिक करेगा ।