मैं हाल ही में कुछ नए लिखित कोड के साथ आया था जो बहुत सारे डीबग के साथ इंटरसेप्ट किया गया था। ऐसटर (C #)।
क्या हमें सामान्य रूप से टीडीडी, बीडीडी और यूनिट परीक्षण के उपयोग के बावजूद इसका व्यापक रूप से उपयोग करना चाहिए?
मैं हाल ही में कुछ नए लिखित कोड के साथ आया था जो बहुत सारे डीबग के साथ इंटरसेप्ट किया गया था। ऐसटर (C #)।
क्या हमें सामान्य रूप से टीडीडी, बीडीडी और यूनिट परीक्षण के उपयोग के बावजूद इसका व्यापक रूप से उपयोग करना चाहिए?
जवाबों:
मुझे ऐसा कोई कारण नहीं दिखाई देता है जिसके कारण आपको 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>();
}
यह एक पूरी तरह से अलग तरह की है ...
** ध्यान दें कि कुछ रूपरेखाओं में, एक अभिक्रिया विफलता के लिए यूनिट टेस्ट करना वास्तव में काफी कठिन है, क्योंकि एक विफलता विफलता पूरे रनटाइम को नीचे ला सकती है, इसलिए अन्य विकल्पों में से एक को प्राथमिकता दी जा सकती है ... *
मैं अपने टूलबॉक्स में दो अलग-अलग टूल होने के लिए ऐसर्ट और यूनिट टेस्ट पर विचार करता हूं। कुछ चीजें एक के लिए बेहतर होती हैं, और कुछ दूसरे के लिए बेहतर होती हैं।
एक उदाहरण के रूप में, इन दिनों मैं ज्यादातर गैर-सार्वजनिक तरीकों के लिए मापदंडों को मान्य करने के लिए दावा करता हूं।
मैं आजकल डिबग.एजर्स को समय से पहले अनुकूलन के रूप में देखता हूं। जब तक आपको वास्तव में प्रदर्शन की आवश्यकता न हो, तब तक एस्टर को रिलीज़ मोड में दबाने से कीड़े लंबे समय तक छिप सकते हैं।
MattDavey के रूप में बाहर अंक कोड ठेके एक बेहतर, स्थिर गतिशील जाँच के बजाय जाँच प्रदान किया जा सकता है, और अगर उपलब्ध नहीं मैं पसंद करेंगे Trace.Assert या एक सादे पुरानेif(x) throw SomeException;
Debug
क्लास के तरीकों के सभी कॉल्स को संकलन से छोड़ दिया जाएगा ... इसलिए Assert
केवल प्रदर्शन के लिए कॉल को दबाने से केवल समय से पहले अनुकूलन नहीं होता है, यह एक सामान्य बकवास है।