تطوير البرامج

عند هذه النقطة يجب أن تكون قادراً على النظر إلى عمليات كاملة في Java ومعرفة ما تفعله. لكن قد لا تكون كيفية كتابة عمليات كهذه واضحة بعد. سأطرح إحدى التقنيات التي أدعوها التطوير التصاعدي
(incremental development).
كمثال، تخيل أنك تريد حساب المسافة بين نقطتين، إحداثياتهما (x1, y1) و(x2, y2). باستخدام التعريف المعتاد،

الخطوة الأولى هو الأخذ بعين الاعتبار الشكل الذي ستظهر به عملية distance في Java. بكلمات أخرى، ما هو الدخل (المعاملات) وما هو الخرج (القيمة المعادة).
في هذه الحالة، النقطتين هما المعاملات، ومن الطبيعي أن نعبر عنهما باستخدام أربع أعداد عشرية، مع أننا سنرى فيما بعد أن Java تملك كائناً يدعى Point يمكننا استعماله. القيمة المعادة هي المسافة، والتي ستكون من النوع double.
يمكننا الآن كتابة مخططاً تمهيدياً للعملية:
كود:
public static double distance
(double x1, double y1, double x2, double y2) {
  return 0.0;
}
التعليمة return 0.0; هي إشارة علام ضرورية حتى يتم تجميع البرنامج. من الواضح أن البرنامج لا يجري أي شيء مفيد في هذه المرحلة، لكنه يستحق تجربة تجميعه لنتمكن من العثور على أية أخطاء نحوية قبل أن نضيف المزيد من الشفرة.
حتى نختبر العملية الجديدة، علينا استدعاؤها مع قيم اختبار. في مكان ما من main يمكن أن أضيف:
double dist = distance (1.0, 2.0, 4.0, 6.0);
لقد اخترت هذه القيم بحيث تكون المسافة الأفقية 3 والمسافة الشاقولية 4؛ وبهذا ستكون المسافة بين النقطتين 5 (الوتر في مثلث قائم الزاوية أضلاعه 3-4-5). عندما تختبر عملية ما، من المفيد أن تعلم الإجابة الصحيحة.
بعد أن تأكدنا من صحة بنية تعريف العملية، يمكننا البدء بإضافة أسطر من الشفرة بالتدريج. بعد كل تغيير تصاعدي، نجمع البرنامج ونشغله. بهذه الطريقة، سنعرف بالضبط المكان الذي يجب أن يحتوي على الخطأ في أية مرحلة: في السطر الأخير الذي أضفناه.
الخطوة التالية في حسبتنا هي إيجاد الفرق x2 – x1 و y2 – y1. سأخزن هذه القيم في متغيرات مؤقتة اسمها dx وdy.
كود:
public static double distance
(double x1, double y1, double x2, double y2) {
  double dx = x2 - x1;
  double dy = y2 - y1;
  System.out.println ("dx is " + dx);
  System.out.println ("dy is " + dy);
  return 0.0;
}
أضفت تعليمات طباعة تمكنني من معرفة القيم الوسيطة الناتجة قبل المتابعة. كما ذكرت من قبل، أنا أعلم مسبقاً أن القيم يجب أن تكون 3.0 و4.0.
عندما أنتهي من كتابة العملية سأزيل تعليمات الطباعة. شفرة كهذه تدعى سقالات (scaffolding)، لأنها تساعد في بناء البرنامج، لكنها ليست جزءاً من البرنامج النهائي. أحياناً يكون إبقاء السقالات فكرة جيدة، لكن حوِّلها لتعليقات، لكي تجدها في حال احتجت إليها لاحقاً.
الخطوة التالية في تطوير عمليتنا هو تربيع dx وdy. يمكننا استخدام عملية Math.pow، لكن من الأبسط والأسرع أن نضربهما بنفسيهما.
كود:
public static double distance
(double x1, double y1, double x2, double y2) {
  double dx = x2 - x1;
  double dy = y2 - y1;
  double dsquared = dx*dx + dy*dy;
  System.out.println ("dsquared is " + dsquared);
  return 0.0;
}
مرة أخرى، سأترجم البرنامج وأشغله للتحقق من القيمة الوسيطة (التي يجب أن تكون 25.0).
أخيراً، يمكننا استخدام عملية Math.sqrt لحساب وإرجاع النتيجة.
كود:
public static double distance
(double x1, double y1, double x2, double y2) {
  double dx = x2 - x1;
  double dy = y2 - y1;
  double dsquared = dx*dx + dy*dy;
  double result = Math.sqrt (dsquared);
  return result;
}
بعد ذلك في main، يجب أن نطبع القيمة الناتجة وأن نتحقق من صحتها.
عند اكتسابك المزيد من الخبرة البرمجية، قد تجد نفسك تكتب وتنقح أكثر من سطر في كل مرة. بغض النظر عن ذلك، فإن هذه عملية التطوير التصاعدي هذه توفر عليك الكثير من الوقت الضائع في تصحيح الأخطاء.
المقومات الأساسية لهذه العملية هي:
· ابدأ مع برنامج يعمل وقم بتغييرات صغيرة وتصاعدية. إذا حدث أي خطأ في أي مرحلة، فستعرف مكانه بالضبط.
· استعمل متغيرات مؤقتة لتخزين القيم الوسيطة حتى تتمكن من طباعتها والتحقق من صحتها.
· بعد أن يجهز البرنامج، قد ترغب بإزالة بعض السقالات أو دمج عدة تعليمات ضمن عبارات مركّبة، لكن بشرط ألا تجعل قراءة البرنامج أصعب.