2010-04-21 9 views
6

आज मैं ऑब्जेक्ट प्रोग्रामिंग शैली, ठोस प्रकार या इंटरफेस के मौलिक विरोधाभास में आया था।रिटर्न प्रकारों के लिए कंक्रीट प्रकार या इंटरफेस?

क्या किसी विधि के रिटर्न प्रकार के लिए बेहतर चुनाव है: एक ठोस प्रकार या इंटरफ़ेस?

ज्यादातर मामलों में, मैं कंक्रीट प्रकारों का उपयोग तरीकों के लिए रिटर्न प्रकार के रूप में करता हूं। क्योंकि मेरा मानना ​​है कि आगे के उपयोग के लिए एक ठोस प्रकार अधिक लचीला है और अधिक कार्यक्षमता का खुलासा करता है।

इसका अंधेरा पक्ष: युग्मन। द एन्जिलिक वन: एक ठोस प्रकार में इंटरफ़ेस प्रति-इंटरफ़ेस होता है जिसे आप प्रारंभ में वापस करने के लिए और अतिरिक्त कार्यक्षमता वापस लेना चाहते हैं।

आपके अंगूठे का नियम क्या है?

क्या इसके लिए कोई प्रोग्रामिंग सिद्धांत है?


बोनस: यह मैं क्या मतलब अंगूठे का ReadOnlyCollection or IEnumerable for exposing member collections?

उत्तर

4

अंगूठे का मेरा नियम:

1) प्रारंभ में, मैं विधि, इंटरफ़ेस प्रकार वापसी यदि आवश्यक हो तो बाद में ठोस प्रकार में बदल करने के लिए अपनी हमेशा आसान है क्योंकि है। दूसरी तरफ वापस जाने के लिए मुश्किल है।
InterfaceType i = xyz.methodThatReturnsConcreteType();:

2) यहां तक ​​कि अगर विधि ठोस प्रकार वापस जाने के लिए घोषित किया जाता है, मैं इंटरफ़ेस प्रकार जब भी संभव हो उपयोग करने के लिए कॉल करने कोड होगा।

3) क्या मैं खुद बुला कोड) सार्वजनिक API बनाम भी (आंतरिक एक फर्क नहीं पड़ता:

  • अगर मैं कोड है कि प्रश्न में विधि (यानी आंतरिक API कॉल) के मालिक हैं, तो अधिक तैयार मैं ठोस प्रकार वापस करने के लिए हूँ।
  • यदि मैं इस विधि को कॉल करने वाले कोड को नियंत्रित नहीं करता (उदा। सार्वजनिक एपीआई), तो संभव है कि मैं इसके बजाय इंटरफ़ेस प्रकार वापस करूँ। कंक्रीट प्रकार लौटाना एक प्रतिबद्धता है और आम तौर पर बोलते हुए, जितना कम मैं वादा करता हूं, उतना ही आसान होता है।

अन्य विचार:

  • परीक्षण के बाद से मैं एक नकली वस्तु है कि इंटरफ़ेस को लागू करता है का उपयोग कर सकते इंटरफेस के साथ आसान हो सकता है।
  • वहाँ एक बाहर मौका है कि मैं वापस जाने के लिए चाहते थे एक proxy object (अब मैं वास्तव में बहाने के लिए पहुँच रहा हूँ)

सारांश में,

  • मैं आमतौर पर इंटरफ़ेस प्रकार वापसी क्योंकि मुझे लगता है कि ढीले-युग्मन के लाभ ठोस प्रकार तक पूर्ण पहुंच रखने की सुविधा से अधिक हैं।
  • हालांकि, मैं पर स्विच करने का विरोध नहीं कर रहा हूं, कंक्रीट प्रकार को मामले-दर-मामले आधार पर वापस लौटाएं जब भी सुविधा ढीली-युग्मन के लाभों से अधिक हो।
7

नियम, वापसी प्रकार में का एक उदाहरण है, संभव के रूप में एक के रूप में विशिष्ट हो, पैरामीटर प्रकार में संभव के रूप में unspecific हो। इंटरफेस को भी पसंद करते हैं, क्योंकि बाद में आप अपने एपीआई के ग्राहकों को बदलने के बिना, अपने कार्यान्वयन का आदान-प्रदान कर सकते हैं।

+0

आपकी राय के लिए धन्यवाद डोमिनिक +1 – SDReyes

+0

ए 'MyCustomExtendedArrayList'' सूची 'से अधिक विशिष्ट है। आप क्या वापस आएंगे – BalusC

+2

@ बालससी: निर्भर करता है कि क्या यह सूची का एक और कार्यान्वयन है या यह कुछ कस्टम तरीकों की पेशकश करता है। एक विशेष वर्ग को वापस करने के लिए क्या अर्थ होगा, अगर इसका उपयोग केवल कास्टिंग द्वारा किया जा सकता है? – Dominik

1

दिलचस्प सवाल। मेरा मानना ​​है कि आपको खुद से पूछना है कि रिटर्न डेटा का उपयोग कैसे किया जा सकता है। पुरानी कार अनुरूपता का उपयोग करना यदि आपके पास

public AccelerationResponse PressAccelerator(float force) {} 

संभावना है कि आप कक्षा के बजाय एक इंटरफ़ेस वापस करना चाहते हैं। आप कुछ शर्तों के आधार पर इस प्रतिक्रिया को अलग-अलग व्याख्या कर सकते हैं।

यदि आपको गारंटी है कि आपकी वापसी केवल ठोस कार्यान्वयन द्वारा अपेक्षित तरीके से उपयोग की जा सकती है तो उस वर्ग का उपयोग करके समझ में आता है। मुझे किसी व्यापक रूप से स्वीकार्य सिद्धांत के बारे में निश्चित नहीं है, लेकिन अंगूठे का मेरा नियम यह है कि अगर विभिन्न प्रकार के कार्यान्वयन में रिटर्न प्रकार का पुन: उपयोग किया जा सकता है तो एक इंटरफ़ेस अधिक समझ में आता है।

+0

धन्यवाद जेरेमी, विशेष रूप से "... यदि विभिन्न प्रकार के कार्यान्वयन में रिटर्न प्रकार का पुन: उपयोग किया जा सकता है तो एक इंटरफ़ेस अधिक समझ में आता है" भाग +1 – SDReyes