2011-01-13 22 views
6

क्या कोई कारण हैं कि आप व्यापार नियमों को लागू करने के लिए कोड अनुबंधों का उपयोग क्यों नहीं करेंगे?सुरक्षा के लिए कोड अनुबंधों का उपयोग किया जाना चाहिए?

कल्पना कीजिए कि आपके पास User कक्षा है जो एक सिस्टम के एक उपयोगकर्ता का प्रतिनिधित्व करती है और अन्य उपयोगकर्ताओं के खिलाफ किए जा सकने वाले कार्यों को परिभाषित करती है। आप एक ChangePassword विधि इस प्रकार लिख सकते ...

public void ChangePassword(User requestingUser, string newPassword) 
{ 
    Contract.Requires<ArgumentNullException>(requestingUser); 
    Contract.Requires<ArgumentNullException>(newPassword); 

    // Users can always change their own password, but they must be an 
    // administrator to change someone else's. 
    if (requestingUser.UserId != this.UserId && 
     !requestingUser.IsInRole("Administrator")) 
     throw new SecurityException("You don't have permission to do that."); 

    // Change the password. 
    ... 
} 

या आप Contract.Requires के साथ एक पूर्व शर्त के रूप सुरक्षा जांच को लागू कर सकते हैं ...

public void ChangePassword(User requestingUser, string newPassword) 
{ 
    Contract.Requires<ArgumentNullException>(requestingUser != null); 
    Contract.Requires<ArgumentNullException>(newPassword != null); 

    // Users can always change their own password, but they must be an 
    // administrator to change someone else's. 
    Contract.Requires<SecurityException>(
     requestingUser.UserId == this.UserId || 
     !requestingUser.IsInRole("Administrator"), 
     "You don't have permission to do that."); 

    // Change the password. 
    ... 
} 

फायदे और इन दोनों तरीकों का नुकसान क्या हैं ?

उत्तर

2

मुझे लगता है कि उत्तर नहीं है। कोड अनुबंध उन परिदृश्यों के लिए डिज़ाइन किए गए हैं जहां उनकी विफलता कोड में एक गंभीर बग इंगित करती है। उन्हें कुछ ऐसा होना चाहिए जो गलत उपयोगकर्ता इनपुट जैसे पुनर्प्राप्त किया जा सके।

Requires<T> केवल लाइब्रेरी के सार्वजनिक तरीकों पर उपयोग किया जाना है जो कोड अनुबंधों का उपयोग नहीं कर रहे लोगों द्वारा खाया जाएगा, या यदि आपके पास विरासत कोड है जो इसे अपवादों के संदर्भ में संगत रहने की आवश्यकता है।

नए कोड के लिए, आपको केवल Requires का उपयोग करना चाहिए, Requires<T> नहीं। सादा Requires आपको समस्या से निपटने के लिए मजबूर करने के लिए डिफ़ॉल्ट रूप से एक अनचाहे अपवाद फेंकता है।

इसके अलावा, अगर कोई कोड अनुबंध रनटाइम जांच अक्षम करता है, तो आपकी सभी सुरक्षा गायब हो जाएगी!

+0

कोई यह भी तर्क दे सकता है कि कुछ मामलों में, आपके द्वारा दिया गया उदाहरण * कोड में एक गंभीर बग है। उदाहरण के लिए, यदि आप जिस विधि को लिख रहे हैं उसे कई परतों को दफन कर दिया गया है और सभी सत्यापन आपके आवेदन की बाहरी परत पर होने के लिए हैं, तो इसे विधि के अनुबंध का हिस्सा माना जा सकता है। यह सब निर्भर करता है :) – porges

+0

अच्छा जवाब! मुझे 'अनुबंध अपवाद' की अनजान प्रकृति का एहसास नहीं हुआ था, लेकिन आपके उत्तर ने मुझे सही दिशा में इंगित किया: http://www.infoq.com/articles/code-contracts-csharp - धन्यवाद! :) –

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