2009-11-05 13 views
11

परीक्षण करने में आसान है क्या आप परीक्षण को आसान बनाने के लिए अपना कोड डिज़ाइन करना चाहिए? और यदि ऐसा है तो सी ++ कोड कैसे डिजाइन करें ताकि परीक्षण करना आसान हो।सी ++ कोड बनाने के लिए पैटर्न

  • आप सी ++ में निर्भरता-इंजेक्शन कैसे लागू करते हैं?
  • क्या मुझे नकली परीक्षण वस्तुओं के निर्माण को सरल बनाने के लिए आधार के रूप में शुद्ध इंटरफेस क्लास का उपयोग करके कक्षाओं को लागू करना चाहिए?
    • इससे मुझे वर्चुअल विधियों को बनाने में मजबूर होना पड़ेगा। क्या यह प्रदर्शन को प्रभावित करेगा?
  • सी ++ में टेस्टेबिलिटी के लिए डिजाइन करते समय मुझे और क्या सोचना चाहिए?
+0

वास्तव में परीक्षण योग्यता के लिए डिजाइन करना आवश्यक है। हालांकि आपको यह भी महसूस करना होगा कि स्टैंड-अलोन फैशन में केवल 'सीमा' का परीक्षण किया जाना चाहिए, आंतरिक घटकों के लिए यह एक दूसरे पर निर्भर होना उचित है और अलगाव में परीक्षण नहीं किया जाना चाहिए। –

+0

आपको इस [स्टैक-एक्सचेंज प्रस्ताव] में रुचि हो सकती है (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "कोड समीक्षा")। यह बीटा शुरू करने के लिए लगभग तैयार है, बस कुछ और की जरूरत है। – greatwolf

उत्तर

9

क्या मुझे नकली परीक्षण वस्तुओं के निर्माण को सरल बनाने के लिए आधार के रूप में शुद्ध इंटरफ़ेस वर्ग का उपयोग करके कक्षाओं को लागू करना चाहिए?

  • इससे मुझे कई वर्चुअल तरीकों को बनाने में मजबूर होना पड़ेगा। क्या यह प्रदर्शन को प्रभावित करेगा?

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

संपादित
ठीक है, एक सरल उदाहरण:

OOP और इंटरफेस के साथ, आप इस जैसे एक समारोह में लिख सकते हैं:

void Foo(IBar& someBar) { ... } 

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

लेकिन आप टेम्पलेट के साथ एक ही बात को प्राप्त कर सकते:

template <typename BarType> 
void Foo(BarType& someBar) { ... } 

... और बस इतना ही। Foo का शरीर काफी अपरिवर्तित हो सकता है। जब तक फ़ंक्शन में पारित प्रकार हमारे सदस्यों की आवश्यकता होती है, तब तक यह काम करेगा, बिना किसी इंटरफ़ेस क्लास से औपचारिक रूप से उत्तराधिकारी और बिना वर्चुअल फ़ंक्शंस और रनटाइम पॉलीमोर्फिज्म के ओवरहेड के।

+0

कक्षाओं को templatizing कैसे मैं और अधिक पढ़ सकते हैं? क्या इसका वर्णन करने वाला कोई पैटर्न है? –

+0

आप सब कुछ के लिए एक पैटर्न क्यों चाहते हैं ?? आधे ने आपको विरासत (आभासी/बहुरूपता) अकेले छोड़ने और सी ++ टेम्पलेट्स (जेनेरिक प्रोग्रामिंग) के बजाय उपयोग करने का विचार दिखाया है। जेनेरिक नकली (टेम्पलेट कोड) देने से "सभी" संभावित प्रकार शामिल होंगे जो आप कभी भी उपयोग करेंगे (एक फ़ंक्शन के साथ, कई "वर्चुअल विधियों")। – bua

+3

बेशक टेम्पलेट संकलन-समय निर्भरता को कठिन बना सकता है क्योंकि उनका कार्यान्वयन शीर्षलेख में जाता है। –

3

अधिकतम cohesion और न्यूनतम coupling

यह आपके जीवन को परीक्षण के साथ आसान बना देगा।

0

मुझे लगता है कि प्रमुख चिंता होना चाहिए ...

  1. हासिल करने कार्यात्मकताएं
  2. कोड Extensiblity
  3. कोड Resuablity
  4. कोड अनुरक्षणीयता
4

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

और पैटर्न के बारे में सोचने में बहुत अधिक समय नहीं बिताएं, यह बहुत सारे विज्ञान और छोटे नतीजे हैं, बस पहले एक परीक्षा लिखें और अपना कोड सरल रखें, फिर आश्चर्य की बात है कि आपको इसके लिए परीक्षण लिखने की आवश्यकता नहीं है, आपने इसे पहले ही कर लिया है। और आपका कोड काम करता है।

+1

"यदि आप कोई टिप्पणी लिखने जा रहे हैं, तो कोड को एक अच्छे नाम के साथ एक अलग समारोह में बेहतर नाम दें" यह बहुत अच्छी सलाह है। –

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