اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
یکی دیگر از روشهایی که جهت بهبود کیفیت کدها مورد استفاده قرار میگیرد، «طراحی با قراردادها» است؛ به این معنا که «بهتر است» متدهای تعریف شده پیش از استفاده از آرگومانهای خود، آنها را دقیقا بررسی کنند و به این نوع پیش شرطها، قرارداد هم گفته میشود.
نمونهای از آنرا در قسمت 9 مشاهده کردید که در آن اگر آرگومانهای متد AddRole، خالی یا نال باشند، یک استثناء صادر میشود. این نوع پیغامهای واضح و دقیق در مورد عدم اعتبار ورودیهای دریافتی، بهتر است از پیغامهای کلی و نامفهوم null reference exception که بدون بررسی stack trace و سایر ملاحظات، علت بروز آنها مشخص نمیشوند.
در دات نت 4، جهت سهولت این نوع بررسیها، مفهوم Code Contracts ارائه شده است. (این نام هم از این جهت بکارگرفته شده که Design by Contract نام تجاری شرکت ثبت شدهای در آمریکا است!)
یک مثال:
متد زیر را در نظر بگیرید. اگر divisor مساوی صفر باشد، استثنای کلی DivideByZeroException صادر میشود:
namespace Refactoring.Day10.DesignByContract.Before
{
public class MathMehods
{
public double Divide(int dividend, int divisor)
{
return dividend / divisor;
}
}
}
روش متداول «طراحی با قراردادها» جهت بهبود کیفیت کد فوق پیش از دات نت 4 به صورت زیر است:
using System;
namespace Refactoring.Day10.DesignByContract.After
{
public class MathMehods
{
public double Divide(int dividend, int divisor)
{
if (divisor == 0)
throw new ArgumentException("divisor cannot be zero", "divisor");
return dividend / divisor;
}
}
}
در اینجا پس از بررسی آرگومان divisor، قرارداد خود را به آن اعمال خواهیم کرد. همچنین در استثنای تعریف شده، پیغام واضحتری به همراه نام آرگومان مورد نظر، ذکر شده است که از هر لحاظ نسبت به استثنای استاندارد و کلی DivideByZeroException مفهومتر است.
در دات نت 4 ، به کمک امکانات مهیای در فضای نام System.Diagnostics.Contracts، این نوع بررسیها نام و امکانات درخور خود را یافتهاند:
using System.Diagnostics.Contracts;
namespace Refactoring.Day10.DesignByContract.After
{
public class MathMehods
{
public double Divide(int dividend, int divisor)
{
Contract.Requires(divisor != 0, "divisor cannot be zero");
return dividend / divisor;
}
}
}
البته اگر قطعه کد فوق را به همراه divisor=0 اجرا کنید، هیچ پیغام خاصی را مشاهده نخواهید کرد؛ از این لحاظ که نیاز است تا فایلهای مرتبط با آنرا از این آدرس دریافت و نصب کنید. این کتابخانه با VS2008 و VS2010 سازگار است. پس از آن، برگهی Code contracts به عنوان یکی از برگههای خواص پروژه در دسترس خواهد بود و به کمک آن میتوان مشخص کرد که برنامه حین رسیدن به این نوع بررسیها چه عکس العملی را باید بروز دهد.
برای مطالعه بیشتر: