मैंने कुछ स्प्रिंग-हाइबरनेट वेब एप्लिकेशन प्रोजेक्ट्स को काम/देखा है क्योंकि कई इंटरफेस हैं क्योंकि वास्तविक सेवा और दाओ कक्षाएं हैं।सेवा और दाओ परतों में हमेशा एक कार्यान्वयन इंटरफेस क्यों है?
मुझे हमेशा यही लगता है कि इन एकल कार्यान्वयन इंटरफेस होने के लिए मुख्य कारणों के रूप में इन दो:
स्प्रिंग किसी वर्ग (ढीला संयोजन) में निर्भरता के रूप में वास्तविक क्रियान्वयन तार कर सकते हैं
public class Person { @Autowired private Address address; @Autowired private AccountDetail accountDetail; public Person(Address address, AccountDetail accountDetail) { // constructor
यूनिट परीक्षण करते समय, मैं नकली कक्षाएं बना सकता हूं और अलगाव में एक वर्ग का परीक्षण कर सकता हूं।
Address mockedAddress = mock(Address); AccountDetail mockedAccountDetail = mock(AccountDetail); Person underTestPerson = new Person(mockedAddress, mockedAccountDetail); // unit test follows
लेकिन, देर से की, मुझे एहसास हुआ कि:
स्प्रिंग निर्भरता के रूप में ठोस कार्यान्वयन कक्षाएं तार कर सकते हैं:
public class Person {
@Autowired
private AddressImpl address;
@Autowired
private AccountDetailImpl accountDetail;
public Person(AddressImpl address, AccountDetailImpl accountDetail) {
// constructor
EasyMock की तरह नकली चौखटे ठोस वर्ग के साथ-साथ
नकली कर सकते हैंAddressImpl mockedAddress = mock(AddressImpl);
AccountDetailImpl mockedAccountDetail = mock(AccountDetailImpl);
Person underTestPerson = new Person(mockedAddress, mockedAccountDetail);
// unit test follows
इसके अलावा, this चर्चा के अनुसार, मुझे लगता है कि सारांश यह है कि एक ही ऐप के भीतर, इंटरफेस ज्यादातर सम्मेलन या आदत से बाहर हो जाते हैं। वे आम तौर पर उन मामलों में सबसे अच्छी समझ बनाते हैं जहां हम दूसरे एप्लिकेशन के साथ इंटरफेसिंग कर रहे हैं उदाहरण के लिए slf4j दुनिया भर के कई ऐप्स द्वारा उपयोग किया जाता है। एक ऐप के भीतर, एक वर्ग एक इंटरफ़ेस के रूप में लगभग एक अमूर्त है।
तो, मेरा सवाल यह है कि हमें अभी भी इंटरफेस की आवश्यकता क्यों है और उसके बाद * ServiceImpl और * DaoImpl कक्षाओं जैसे एकल कार्यान्वयन और अनावश्यक रूप से हमारे कोड आधार आकार को बढ़ाएं। कंक्रीट कक्षाओं का मज़ाक उड़ाते हुए कुछ मुद्दा है जो मुझे पता नहीं है।
जब भी मैंने अपने साथी-साथी के साथ इस पर चर्चा की है, केवल जवाब है कि मुझे यह पता चलता है कि इंटरफेस के आधार पर कार्यान्वयन सेवा और दाओ कक्षाएं सभी का अनुसरण करती हैं - वे वसंत सर्वोत्तम प्रथाओं, ओओपी, डीडीडी इत्यादि के बारे में उल्लेख करते हैं लेकिन मैं अभी भी एक अलग आवेदन के भीतर इतने सारे इंटरफेस रखने के पीछे एक व्यावहारिक कारण नहीं है।
आपके द्वारा प्राप्त उत्तरों के संबंध में - मैं यह देखने में असफल रहा कि प्रत्येक वस्तु के सामने एक इंटरफ़ेस फेंकने के कारण डीडीडी कैसे आ सकता है। डीडीडी के पास इसके साथ कुछ लेना देना नहीं है। यहां तक कि ओओपी एक गरीब औचित्य है। यदि आप एल, आई और डी की तरह चीजें लेते हैं, तो वे केवल निर्दिष्ट करते हैं कि आपको इंटरफेस जैसे अवशेषों को कैसे डिजाइन करना चाहिए और आपको उनका क्या उपयोग करना चाहिए, न कि * आपको उन्हें हर समय * उपयोग करना चाहिए। तो जैसे आपने कहा था कि मुझे लगता है कि यह सब "वसंत सर्वोत्तम अभ्यास" चीज़ या सिर्फ लोगों को आदत से बाहर कर देता है। – guillaume31