क्या कोई कारण हैं कि आप व्यापार नियमों को लागू करने के लिए कोड अनुबंधों का उपयोग क्यों नहीं करेंगे?सुरक्षा के लिए कोड अनुबंधों का उपयोग किया जाना चाहिए?
कल्पना कीजिए कि आपके पास 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.
...
}
फायदे और इन दोनों तरीकों का नुकसान क्या हैं ?
कोई यह भी तर्क दे सकता है कि कुछ मामलों में, आपके द्वारा दिया गया उदाहरण * कोड में एक गंभीर बग है। उदाहरण के लिए, यदि आप जिस विधि को लिख रहे हैं उसे कई परतों को दफन कर दिया गया है और सभी सत्यापन आपके आवेदन की बाहरी परत पर होने के लिए हैं, तो इसे विधि के अनुबंध का हिस्सा माना जा सकता है। यह सब निर्भर करता है :) – porges
अच्छा जवाब! मुझे 'अनुबंध अपवाद' की अनजान प्रकृति का एहसास नहीं हुआ था, लेकिन आपके उत्तर ने मुझे सही दिशा में इंगित किया: http://www.infoq.com/articles/code-contracts-csharp - धन्यवाद! :) –