فرض کنیم که در حال طراحی یک فروشگاه آنلاین بوده و درصدد هستیم تا بخش سبد خرید را کدنویسی کنیم. برای این منظور، کلاسی داریم تحت عنوان Order که حاوی متدهای مختلفی است منجمله ()isComplete که حاوی کدهای زیر است:
function boolean isComplete()
{
return isPaid() && hasShipped();
}
منطقاً یک سفارش قبل از اینکه پرداخت شود نمیتواند به دست مشتری برسد؛ لذا ()hasShipped نمیتوان True باشد مگر اینکه ()isPaid برابر با True باشد و به خاطر همین مسأله است که بخشی از کد اضافی بوده و کد بالا را میتوان به صورت زیر تغییر داد:
function boolean isComplete()
{
return hasShipped();
}
در تفسیر کدهای فوق بایستی گفت که به طور کلی، وقتی که در حال کار روی یک Order (سفارش) هستیم، ۳ وضعیت مختلف میتواند وجود داشته باشد:
- در جریان: مشتری میتواند آیتمهایی را به سبد خرید خود اضافه کرده و یا برخی موارد را حذف کند.
- پرداخت شده: مشتری دیگر نمیتواند آیتمی را حذف کند.
- ارسال شده: کار به اتمام رسیده است و هیچگونه تغییری رخ نخواهد داد.
در فرایند توسعهٔ نرمافزار، بسیاری مواقع پیش میآید که شاهد کدهای اضافی هستیم که این مسأله به خاطر عدم توجه به State (وضعیت) قرار گرفته در آن صورت میگیرد. به عبارت دیگر، ما میبایست ببینیم که در چه وضعیتی قرار داریم، سپس بسته به شرایطی که پیش روی ما است، فرایندها را تعریف کنیم.
یکی از راههای خوب برای توجه به این مسأله، استفاده از متدهایی بامعنی، همچون چیزی که در بالا مشاهده کردیم، برای پیادهسازی دستوراتی است که مد نظر داریم. در یک کلام، به خاطر داشته باشیم که اگر فرایندی را روی تسکی در State (وضعیت) نادرستی انجام دهیم، کدهای ما منجر به ایجاد باگ خواهد شد.