2012-05-19 12 views
5

शीर्षक में प्रश्न देखें! क्या आप एक इंजेक्टर 'इंजेक्ट' या बल्कि 'नया' करेंगे? यदि तत्वों का क्रम विनिर्देशन में सेट किया गया है और संभवतः बदलने की संभावना नहीं है तो क्या आप इसे नया करेंगे?तुलनात्मक या नए इंजेक्शन योग्य वस्तुएं हैं?

+1

अच्छा सवाल! उत्तरों के बारे में विचारों की विस्तृत श्रृंखला बताती है कि इंजेक्शन मूल रूप से * के लिए * क्या है। –

उत्तर

3

प्रश्न "क्या मुझे इस निर्भरता को इंजेक्ट करना चाहिए?" वास्तव में "क्या इस निर्भरता की प्रकृति के बारे में संदर्भ वस्तु को जानना चाहिए?"। एर, केवल अस्वीकार कर दिया।

यदि आपकी कक्षा FastestPonyFinder है, और इसे List<Pony> गति से क्रमबद्ध करने की आवश्यकता है, तो मैं कहूंगा कि यह तुलनित्र के बारे में जानना चाहिए। तुलनित्र को गति से तुलना करने की आवश्यकता होती है, जो सूची के शीर्ष पर सबसे तेज क्रमबद्ध होती है; कोई अन्य तुलनित्र नौकरी के लिए उपयुक्त नहीं है। ऑब्जेक्ट को तुलनित्र बनाना चाहिए, जैसे कि यह List बनाया गया था।

यदि आपकी कक्षा BestPonyFinder है, तो संभवतः यह तुलनात्मक इंजेक्शन होना चाहिए, क्योंकि 'सर्वोत्तम' का परिभाषा परिभाषित करने से परिभाषित है कि टट्टू को कैसे मिलती है। यह आपके कोड को भविष्य में बदलने और बदलने में आसान बनाने जा रहा है।

+1

उत्तर के लिए धन्यवाद! विचार की इस ट्रेन के बाद, क्या आप तब फास्टेस्टोनीफाइंडर में टोडेपोनिफाइंडर को 'नया' करेंगे, जब आप जानते हैं कि आपका एप्लिकेशन हमेशा एक विशिष्ट दिन पर रेसिंग पर टोनियों पर काम करेगा? या आप अन्यथा चुनते हैं, यह देखते हुए कि TodaysPoniesFinder शायद तुलनात्मक से कुछ अधिक जटिल है? (कृपया इस तथ्य को अनदेखा करें, कि संभवतया तारीखों के परीक्षण क्षमता के मुद्दों पर विचार करने वाले 'TodaysPoniesFinder' जैसी कुछ नहीं करेंगे :))। धन्यवाद! – user1405469

+0

यदि 'TodaysPoniesFinder' का काम आज प्रतिस्पर्धा करने वाले सभी टट्टू की सूची बनाना है, तो मैं कहूंगा कि' FastestPonyFinder 'को यह जानने की आवश्यकता नहीं है कि यह क्या कर रहा है; यह केवल परवाह करता है कि यह टट्टू की एक सूची पैदा करता है। इसलिए, इसे इंजेक्शन दिया जाना चाहिए। इसे ठोस प्रकार की बजाय 'पोनीफाइंडर' जैसे कुछ प्रकार के पैरामीटर के रूप में इंजेक्शन दिया जाना चाहिए। –

+1

एक तरफ, 'TodaysPoniesFinder' पूरी तरह से टेस्टेबल होगा - जब तक आप इसमें' आज 'के मूल्य को इंजेक्ट करते हैं! यह एक [क्लासिक कदम मॉकिस्ट टीडीडी] है (http://www.mockobjects.com/2007/04/test-smell-i-need-to-mock-object-i-cant.html); आप आम तौर पर कुछ बहुत ही सरल 'क्लास क्लॉक {सार्वजनिक तिथि अब() {नई तारीख() लौटाते हैं; }} 'और उस वस्तु को इंजेक्ट करें जिसे समय जानने की जरूरत है। फिर आप परीक्षण के लिए एक नकली इंजेक्ट कर सकते हैं। –

1

तुलनाकर्ताओं के बारे में बात यह है कि वे सस्ते हैं। उनके पास अक्सर कोई फ़ील्ड नहीं होता है, और यदि वे करते हैं, तो उनके पास बहुत कुछ नहीं है।

वे इतने सस्ते हैं कि इससे कोई फर्क नहीं पड़ता। आप उन्हें इनलाइन बना सकते हैं, या उन्हें स्थिर अंतिम क्षेत्र से प्राप्त कर सकते हैं, या सिंगलटन इंजेक्शन प्राप्त कर सकते हैं - कौन परवाह करता है?

+0

एक यूनिट परीक्षण परिप्रेक्ष्य से, मूल रूप से आपकी कहानियां कि तुलनाकर्ता सस्ते हैं, जैसे गेटर/सेटर विधियों की तरह, है ना? तो, आप उनके लिए परीक्षण लिखने पर विचार नहीं करेंगे ... – user1405469

+1

निर्भर करता है। मैं निश्चित रूप से उन तरीकों का परीक्षण करता हूं जो उनका उपयोग करते हैं। –

0

इसके अतिरिक्त, यदि कोई राज्य नहीं है, तो आप हमेशा "पुन: उपयोग" कर सकते हैं। इस मामले में वे धागे सुरक्षित हैं और पिछले उपयोग से राज्य में नहीं आते हैं। तो अंत में यह वास्तव में इस बात पर निर्भर करता है कि आपने तुलनित्र को कैसे कार्यान्वित किया: राज्य या बिना।

0

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

संबंधित मुद्दे