क्या मुझे आज भी डीबग का उपयोग करना चाहिए।


23

मैं हाल ही में कुछ नए लिखित कोड के साथ आया था जो बहुत सारे डीबग के साथ इंटरसेप्ट किया गया था। ऐसटर (C #)।

क्या हमें सामान्य रूप से टीडीडी, बीडीडी और यूनिट परीक्षण के उपयोग के बावजूद इसका व्यापक रूप से उपयोग करना चाहिए?


9
मैं नहीं देख सकता कि कैसे एक दूसरे को बाहर करता है।
सुपर एमएन

2
@superM मैंने निश्चित रूप से आलसी डेवलपर्स को परीक्षण के रूप में जोर देते हुए देखा है क्योंकि इससे पहले कि वे अपने कोड को ऐसे लिखते थे कि निर्भरता का मजाक उड़ाना मुश्किल था। कहने की जरूरत नहीं है कि मैं यह सिफारिश नहीं करूंगा
jk

जवाबों:


23

मुझे ऐसा कोई कारण नहीं दिखाई देता है जिसके कारण आपको Assert का उपयोग नहीं करना चाहिए। ऐसा करके आप पहले से ही पहरेदार और आक्रमणकारियों की तरह गार्ड की आवश्यकता को स्वीकार कर चुके हैं, और अनुबंध द्वारा डिजाइन की ओर एक कदम बढ़ा रहे हैं । इसे प्राप्त करने का केवल एक ही तरीका है ...

// Precondition using Asert
void SomeMethod(Foo someParameter)
{
    Debug.Assert(someParameter != null)
}

// Precondition using If-Then-Throw
void SomeMethod(Foo someParameter)
{
    if (someParameter == null)
        throw new ArgumentNullException("someParameter");
}

// Precondition using Code Contracts
void SomeMethod(Foo someParameter)
{
    Contract.Requires(someParameter != null);
}

// Precondition using some custom library
void SomeMethod(Foo someParameter)
{
    Require.ArgumentNotNull(() => someParameter);
}

सभी एक ही चीज को प्राप्त करने के तरीके हैं: कोड में मजबूती। यह सिर्फ एक विकल्प चुनने के लिए नीचे आता है, जिसमें से Assert एक वैध विकल्प है।

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

[Test]
void SomeMethod_WhenGivenNull_ThrowsArgumentNullException()
{
    delegate call = () => someObject.SomeMethod(null);

    Assert.That(call).Throws<ArgumentNullException>();
}

यह एक पूरी तरह से अलग तरह की है ...

** ध्यान दें कि कुछ रूपरेखाओं में, एक अभिक्रिया विफलता के लिए यूनिट टेस्ट करना वास्तव में काफी कठिन है, क्योंकि एक विफलता विफलता पूरे रनटाइम को नीचे ला सकती है, इसलिए अन्य विकल्पों में से एक को प्राथमिकता दी जा सकती है ... *


10

मैं अपने टूलबॉक्स में दो अलग-अलग टूल होने के लिए ऐसर्ट और यूनिट टेस्ट पर विचार करता हूं। कुछ चीजें एक के लिए बेहतर होती हैं, और कुछ दूसरे के लिए बेहतर होती हैं।

एक उदाहरण के रूप में, इन दिनों मैं ज्यादातर गैर-सार्वजनिक तरीकों के लिए मापदंडों को मान्य करने के लिए दावा करता हूं।


5

मैं आजकल डिबग.एजर्स को समय से पहले अनुकूलन के रूप में देखता हूं। जब तक आपको वास्तव में प्रदर्शन की आवश्यकता न हो, तब तक एस्टर को रिलीज़ मोड में दबाने से कीड़े लंबे समय तक छिप सकते हैं।

MattDavey के रूप में बाहर अंक कोड ठेके एक बेहतर, स्थिर गतिशील जाँच के बजाय जाँच प्रदान किया जा सकता है, और अगर उपलब्ध नहीं मैं पसंद करेंगे Trace.Assert या एक सादे पुरानेif(x) throw SomeException;


4
यह ध्यान देने योग्य है कि रिलीज़ मोड में विजुअल स्टूडियो के साथ कोड उत्पन्न करने से Debugक्लास के तरीकों के सभी कॉल्स को संकलन से छोड़ दिया जाएगा ... इसलिए Assertकेवल प्रदर्शन के लिए कॉल को दबाने से केवल समय से पहले अनुकूलन नहीं होता है, यह एक सामान्य बकवास है।
कोनामिमन

@Konamiman वह बिंदु है, मैं लगभग हमेशा यही चाहता हूं कि वह रिलीज़ मोड में उसी तरह विफल हो:। डीबग.एजर्स का मेरे लिए 97% समय का कोई फायदा नहीं है
जे.के.

क्या है कि 3% तो, @jk? केवल विरासत कोड, या कुछ अन्य उदाहरण?
डग

@DougM प्रदर्शन क्रिटिकल कोड, इसका संदर्भ नथ उद्धरण के लिए है। मैं यह भी जोड़ता हूं कि मुझे लगता है कि हार्दिक बग प्रदर्शित करता है कि मेरा दृष्टिकोण सही है, जब तक कि आपके पास कोई अन्य विकल्प नहीं है, तब तक अपने रिलीज कोड
जेके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.