عمليات التعديل

لنأخذ increment، كمثال عن عملية تعديل، التي تضيف عدد معطى من الثواني إلى كائن Time. المسودة الأولية لهذه العملية ستبدو كهذه:
كود:
public static void increment(Time time, double secs) {
  time.second += secs;
 
  if (time.second >= 60.0) {
    time.second -= 60.0;
    time.minute += 1;
  }
 
  if (time.minute >= 60) {
    time.minute -= 60;
    time.hour += 1;
  }
}
يجري السطر الأول العملية الأساسية؛ وتتم معالجة الباقي كما فعلنا في الحالات التي مرت معنا سابقاً.
هل هذه العملية صحيحة؟ ماذا يحدث لو أن المتحول كان أكبر بكثير من 60؟ في تلك الحالة لن يكون طرح 60 مرة واحدة كافياً؛ علينا الاستمرار في الطرح حتى تصبح قيمة second أقل من 60. يمكننا عمل ذلك باستبدال تعليمة if بتعليمة while:
كود:
public static void increment(Time time, double secs) {
   time.second += secs;
 
   while (time.second >= 60.0) {
     time.second -= 60.0;
     time.minute += 1;
   }
   while (time.minute >= 60) {
     time.minute -= 60;
     time.hour += 1;
   }
}
هذا الحل صحيح، لكنه غير فعال جداً. هل يمكنك التفكير بحل لا يتطلب التكرار؟