C# Language
कोड अनुबंध
खोज…
वाक्य - विन्यास
Contract.Requires (स्थिति, userMessage)
Contract.Requires (स्थिति, userMessage)
Contract.Result <टी>
Contract.Ensures ()
Contract.Invariants ()
टिप्पणियों
.NET अपने कॉन्ट्रैक्ट क्लास के माध्यम से System.iagnostics नामस्थान में पाई गई संविदा विचार द्वारा डिजाइन का समर्थन करता है और .NET 4.0 में प्रस्तुत किया जाता है। कोड कॉन्ट्रैक्ट्स एपीआई में कोड के स्थिर और रनटाइम चेक के लिए कक्षाएं शामिल हैं और आपको एक विधि के भीतर पूर्व शर्त, पोस्टकॉन्डिशन, और अपरिवर्तनों को परिभाषित करने की अनुमति देता है। पूर्वनिर्धारण उन शर्तों को निर्दिष्ट करते हैं जो किसी विधि को निष्पादित करने से पहले मापदंडों को पूरा करना चाहिए, एक विधि के पूरा होने पर सत्यापित किए जाने वाले पोस्टकॉन्डेंस, और अपरिवर्तनीय उन शर्तों को परिभाषित करते हैं जो किसी विधि के निष्पादन के दौरान नहीं बदलते हैं।
कोड अनुबंध की आवश्यकता क्यों है?
जब आपका एप्लिकेशन चल रहा हो, तो किसी एप्लिकेशन के ट्रैकिंग मुद्दों को सभी डेवलपर्स और प्रशासकों की सबसे महत्वपूर्ण चिंताओं में से एक है। ट्रैकिंग कई तरीकों से की जा सकती है। उदाहरण के लिए -
आप हमारे आवेदन पर अनुरेखण लागू कर सकते हैं और जब आवेदन चल रहा हो तो किसी आवेदन का विवरण प्राप्त कर सकते हैं
जब आप एप्लिकेशन चला रहे हों तो आप इवेंट लॉगिंग मैकेनिज्म का उपयोग कर सकते हैं। इवेंट व्यूअर का उपयोग करके संदेश देखे जा सकते हैं
आप एक विशिष्ट समय अंतराल के बाद प्रदर्शन निगरानी लागू कर सकते हैं और अपने आवेदन से लाइव डेटा लिख सकते हैं।
कोड अनुबंध किसी एप्लिकेशन के भीतर समस्याओं को ट्रैक करने और प्रबंधित करने के लिए एक अलग दृष्टिकोण का उपयोग करता है। एक विधि कॉल से लौटाए गए सभी चीज़ों को मान्य करने के बजाय, कोड पूर्वनिर्धारण, पोस्टकॉन्डिशन, और अपरिवर्तनों की मदद से कोड अनुबंध यह सुनिश्चित करते हैं कि आपके तरीकों को दर्ज करने और छोड़ने के लिए सब कुछ सही है।
पूर्व शर्त
namespace CodeContractsDemo
{
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
public class PaymentProcessor
{
private List<Payment> _payments = new List<Payment>();
public void Add(Payment payment)
{
Contract.Requires(payment != null);
Contract.Requires(!string.IsNullOrEmpty(payment.Name));
Contract.Requires(payment.Date <= DateTime.Now);
Contract.Requires(payment.Amount > 0);
this._payments.Add(payment);
}
}
}
Postconditions
public double GetPaymentsTotal(string name)
{
Contract.Ensures(Contract.Result<double>() >= 0);
double total = 0.0;
foreach (var payment in this._payments) {
if (string.Equals(payment.Name, name)) {
total += payment.Amount;
}
}
return total;
}
अपरिवर्तनशीलताओं
namespace CodeContractsDemo
{
using System;
using System.Diagnostics.Contracts;
public class Point
{
public int X { get; set; }
public int Y { get; set; }
public Point()
{
}
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
public void Set(int x, int y)
{
this.X = x;
this.Y = y;
}
public void Test(int x, int y)
{
for (int dx = -x; dx <= x; dx++) {
this.X = dx;
Console.WriteLine("Current X = {0}", this.X);
}
for (int dy = -y; dy <= y; dy++) {
this.Y = dy;
Console.WriteLine("Current Y = {0}", this.Y);
}
Console.WriteLine("X = {0}", this.X);
Console.WriteLine("Y = {0}", this.Y);
}
[ContractInvariantMethod]
private void ValidateCoordinates()
{
Contract.Invariant(this.X >= 0);
Contract.Invariant(this.Y >= 0);
}
}
}
इंटरफ़ेस पर संविदा को परिभाषित करना
[ContractClass(typeof(ValidationContract))]
interface IValidation
{
string CustomerID{get;set;}
string Password{get;set;}
}
[ContractClassFor(typeof(IValidation))]
sealed class ValidationContract:IValidation
{
string IValidation.CustomerID
{
[Pure]
get
{
return Contract.Result<string>();
}
set
{
Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(value), "Customer ID cannot be null!!");
}
}
string IValidation.Password
{
[Pure]
get
{
return Contract.Result<string>();
}
set
{
Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(value), "Password cannot be null!!");
}
}
}
class Validation:IValidation
{
public string GetCustomerPassword(string customerID)
{
Contract.Requires(!string.IsNullOrEmpty(customerID),"Customer ID cannot be Null");
Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(customerID), "Exception!!");
Contract.Ensures(Contract.Result<string>() != null);
string password="AAA@1234";
if (customerID!=null)
{
return password;
}
else
{
return null;
}
}
private string m_custID, m_PWD;
public string CustomerID
{
get
{
return m_custID;
}
set
{
m_custID = value;
}
}
public string Password
{
get
{
return m_PWD;
}
set
{
m_PWD = value;
}
}
}
उपरोक्त कोड में, हमने एक विशेषता [ContractClass]
IValidation
साथ IValidation
नामक एक इंटरफ़ेस को परिभाषित किया है। यह विशेषता उस वर्ग का पता लेती है जहाँ हमने एक इंटरफ़ेस के लिए एक अनुबंध लागू किया है। वर्ग ValidationContract
इंटरफ़ेस में परिभाषित गुणों का उपयोग करता है और Contract.Requires<T>
मानों का उपयोग करके शून्य मानों के लिए जाँच करता है। Contract.Requires<T>
T
एक अपवाद वर्ग है।
हमने एक विशेषता [Pure]
साथ [Pure]
को भी चिह्नित किया है। शुद्ध विशेषता यह सुनिश्चित करती है कि विधि या एक संपत्ति उस वर्ग की आवृत्ति स्थिति को नहीं बदलती है जिसमें IValidation
इंटरफ़ेस लागू किया गया है।