استبدال الخوارزمية (Substitute Algorithm)
المشكلة
الحاجة إلى استبدال خوارزميّة ما بخوارزميّة أخرى.
الحل
تعديل محتوى التابع (method body) الذي يُنفِّذ الخوارزمية السابقة ليُنفِّذ الخوارزمية الجديدة.
مثال
قبل إعادة التصميم
تتلخَّص مهمة التابع foundPerson
بالبحث عن الأشخاص ذوي الأسماء "Don" أو "John" أو "Kent" وذلك بالمرور بعناصر المصفوفة النصّيّة people
باستخدام حلقة for
كما في الشيفرة:
String foundPerson(String[] people){
for (int i = 0; i < people.length; i++) {
if (people[i].equals("Don")){
return "Don";
}
if (people[i].equals("John")){
return "John";
}
if (people[i].equals("Kent")){
return "Kent";
}
}
return "";
}
بعد إعادة التصميم
اختلف محتوى التابع كليًّا وأصبحت خوارزمية البحث تعتمد على قائمةٍ (list) باسم candidates
تجري المقارنة مع عناصرها أثناء المرور بعناصر المصفوفة عبر حلقة for
، فأصبحت شيفرة التابع بالشكل:
String foundPerson(String[] people){
List candidates =
Arrays.asList(new String[] {"Don", "John", "Kent"});
for (int i=0; i < people.length; i++) {
if (candidates.contains(people[i])) {
return people[i];
}
}
return "";
}
لم إعادة التصميم؟
- ليست إعادة التصميم «التدريجيّة» الطريقةَ الوحيدة لتطوير البرنامج، فقد يكون من الأسهل في بعض الحالات هدمُ جزءٍ من الشيفرة كليًّا والبدء به من جديد، وخاصّة عند العثور على خوارزميةٍ أبسط وأكثر فعاليّةً من الخوارزمية الحاليّة المُستخدَمة.
- قد تتطور المكتبات (libraries) وأُطر العمل (frameworks) مع مرور الزمن لتشمل خوارزميتَك التي أنشأتها، وسيكون من الأفضل حينئذٍ التخلُّص من تنفيذك (implementation) الحاليّ لها والاستفادة مما تحتويه المكتبة إذ سيجعل ذلك من الصيانة (maintenance) أمرًا أسهل.
- قد تختلف متطلبات البرنامج كثيرًا إلى أن تصبح الخوارزمية الحاليّة غير مجديةٍ ولا كفيلةٍ بأداء المهمة.
آلية الحل
- التأكُّد من تبسيط الخوارزميّة الحاليّة ما أمكن، كنقل الأجزاء غير المهمة منها إلى توابعَ أخرى عبر تقنيّة استخراج التابع (extract method)، فكلمّا ازدادت بساطة الخوارزمية يصبح استبدالها أمرًا أسهل.
- كتابة خوارزميّتك البديلة في تابعٍ جديدٍ والاستغناء مؤقتًا عن الخوارزميّة السابقة للبدء باختبار البرنامج (test).
- عند ملاحظة أيّ خللٍ بالنتائج فلا بُدَّ من العودة إلى الخوارزمية السابقة ومقارنة النتائج بين الخوارزميتين لتحديد أسباب الاختلاف، فقد يكون السبب وجودَ خطأٍ ما بالخوارزميّة السابقة أو وجود جزءٍ لا يعمل في الخوارزميّة الجديدة.
- التخلُّص من الخوارزميّة القديمة إن اجتازت الخوارزميّةُ الجديدة كافّة الاختبارات بنجاح.