التطوير والتخطيط التصاعدي

لقد اعتمدت في هذا الفصل على أسلوب في تطوير البرامج يدعى rapid prototyping. في كل مرة، كتبت مسودة أولية للعملية تجري الحسابات الأساسية، بعد ذلك اختبرتها على عدة حالات، وصححت الأخطاء التي وجدتها.
يمكن لهذا الأسلوب أن يكون فعالاً، لكنه قد يقودنا إلى شفرة معقدة أكثر من اللازم – نظراً لأنه يعالج العديد من الحالات الخاصة – وغير موثوقة – وذلك لأنك لأن إقناع نفسك بأنك قد وجدت جميع الأخطاء صعب.
من الأساليب البديلة هو البحث عن فكرة في تلك المشكلة تجعل البرمجة أسهل. في هذه الحالة الفكرة هي أن الوقت في الحقيقة هو عدد مؤلف من ثلاث خانات في الأساس الستيني! الثواني هي خانة "الآحاد"، والدقائق هي "الستينات"، والساعات هي خانة "3600".
عندما كتبنا addTime وincrement، كنا نجري عملية الجمع في النظام الستيني في الحقيقة، ولذلك اضطررنا إلى "الحمل" من عمود إلى تاليه.
من الأساليب الأخرى للتعامل مع المشكلة ككل هو تحويل الأوقات إلى أعداد عشرية والاستفادة من قدرة الحواسيب على تنفيذ العمليات الرياضية على الأعداد العشرية. ها هي العملية التي تحول كائن Time إلى عدد من نوع double:
كود:
public static double convertToSeconds(Time t) {
   int minutes = t.hour * 60 + t.minute;
   double seconds = minutes * 60 + t.second;
   return seconds;
}
كل ما نحتاجه الآن هو التحويل من double إلى كائن Time. يمكننا كتابة عملية تجري بذلك، لكن كتابتها كعملية بانية ثالثة تبدو منطقية أكثر:
كود:
public Time(double secs) {
   this.hour =(int)(secs / 3600.0);
   secs -= this.hour * 3600.0;
   this.minute =(int)(secs / 60.0);
   secs -= this.minute * 60;
   this.second = secs;
}
هذا الباني يختلف قليلاً عن سابقيه؛ فهو يشتمل على حسابات بالإضافة إلى تعليمات الإسناد إلى متغيرات الحالة.
قد تحتاج للتفكير قبل أن تقنع نفسك بأن التقنية التي أستخدمها للتحويل من أساس إلى آخر صحيحة. وبمجرد أن تقتنع، سنكون جاهزين لاستعمال هذه العمليات لكتابة addTime من جديد:
كود:
public static Time addTime(Time t1, Time t2) {
   double seconds = convertToSeconds(t1) + convertToSeconds(t2);
   return new Time(seconds);
}
هذه النسخة أقصر من الأصلية، ومن الأسهل بكثير معرفة أنها ستعمل بشكل صحيح (بفرض – كالعادة – أن العمليات التي تستدعيها صحيحة).
كتمرين، أعد كتابة increment بنفس الطريقة.


ما أدعوه بالنمذجة الأولية السريعة rapid prototyping مشابه للتطوير الموجه بالاختبار
test-driven development (TDD)؛ الفرق بينهما هو أن TDD يقوم عادة على أساس الاختبار المؤتمت.
انظر http://en.wikipedia.org/wiki/Test-driven_development.