में डेटाबेस प्रकार इंटरफ़ेस क्यों नहीं हैं कोड को परीक्षण करने में आसान बनाने के लिए ठोस प्रकारों के बजाय इंटरफेस का उपयोग करने पर जोर दिया जाता है। मुझे आश्चर्य है कि यह वर्ग पैकेज जैसे डीबी या पंक्तियों के प्रकारों के लिए क्यों नहीं किया गया था। उन निर्भरताओं पर नकल करने के लिए मुझे अपने स्वयं के इंटरफेस बनाना पड़ा ताकि मैं यूनिट परीक्षण (एकीकरण परीक्षण नहीं) लिख सकूं। डीबी का सामना करने वाले कोड को इस तरह से परीक्षण नहीं किया जाना चाहिए?गो
गो
उत्तर
कंक्रीट प्रकारों के बजाय आपके सार्वजनिक एपीआई में इंटरफेस का खुलासा करते समय आप इंटरफ़ेस में विधियां जोड़ते समय अन्य लोगों के कोड को तोड़ने का जोखिम बढ़ाते हैं।
उदाहरण के लिए देखें os.File
। यदि os.File
एक इंटरफ़ेस था तो यह 17 सार्वजनिक तरीकों के साथ एक इंटरफ़ेस होगा। 18 वीं विधि जोड़ना उन सभी को तोड़ देगा जो अपने स्वयं के प्रकार परिभाषित करते हैं जो os.File
इंटरफेस को कार्यान्वित करते हैं। इसके विपरीत, वर्तमान os.File
संरचना में 18 वीं विधि जोड़ने से io.Reader
, io.Writer
या os.File
के तरीकों के उप-समूह को परिभाषित करने वाले किसी अन्य इंटरफ़ेस को कोई भी तरीका नहीं तोड़ देगा। यह टेस्ट कोड तोड़ नहीं देगा जो इन io.Reader
और io.Writer
इंटरफेस को झुकाता है।
तो यदि आप अन्य लोगों को अपने स्वयं के कार्यान्वयन को परिभाषित करना चाहते हैं तो अपने सार्वजनिक एपीआई में एक इंटरफ़ेस का पर्दाफाश करें। अन्यथा एक ठोस प्रकार का पर्दाफाश करें और लोगों को अपने कंक्रीट प्रकार द्वारा लागू किए गए अपने स्वयं के इंटरफेस को परिभाषित करने दें ताकि उन्हें केवल उन तरीकों के उप-समूह का उपयोग किया जा सके।
कोई भी गो में किसी भी प्रकार के लिए इंटरफेस बना सकता है। इसका मतलब है कि एक इंटरफ़ेस घोषित करने की शून्य आवश्यकता है जिसका आप उपयोग नहीं करते हैं। जैसा कि आपने देखा, तथ्य यह है कि कोई भी पूर्व-मौजूदा इंटरफ़ेस आपको इच्छित लोगों को बनाने से नहीं रोकता था। –
निश्चित रूप से, मुझे वह मिलता है। लेकिन मैं कई गोफरों में आया हूं जो इंटरफेस के उपयोग पर जोर देते हैं ताकि दूसरों को ठोस प्रकारों का नकल करना आसान हो सके। शायद मैं इस पर विचार कर रहा हूँ। धन्यवाद। –
@AmirKeibi: इंटरफेस बहुत आसान, मज़ेदार बनाते हैं, लेकिन इसका मतलब यह नहीं है कि पैकेज रखरखाव करने वाले पूरी तरह से इंटरफ़ेस-आधारित पैकेज बनाना चाहते हैं। वहां एक पैकेज है जो आपको 'डेटाबेस/एसक्यूएल' सामान को आसानी से नकल करने की अनुमति देता है: [go-sqlmock] (https://github.com/DATA-DOG/go-sqlmock), शायद उस पर एक नज़र डालें? –