إعادة هيكلة الكود القديم بلغة Java: دليل خطوة بخطوة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

إعادة هيكلة الكود القديم (Legacy) بلغة Java: دليل خطوة بخطوة

العمل مع الكود القديم (Legacy) بلغة Java هي واحدة من أكثر المهام شيوعًا وصعوبة التي يواجهها المطورون. غالبًا ما يكون هذا الكود بدون اختبارات، ومكتوبًا بأسلوب متكامل (Monolithic)، ويحتوي على العديد من الأنماط المعاكسة (Anti-patterns). ومع ذلك، فإن إعادة كتابة النظام بالكامل مكلفة ومحفوفة بالمخاطر. والأكثر فعالية هو تطبيق إعادة هيكلة منهجية. في هذه المقالة، سنقوم بتحليل نهج عملي لإعادة هيكلة كود Java القديم، مما سيجعله أنظف وأكثر أمانًا وقابلية للصيانة.



1. التحضير: التحليل وإنشاء "شبكة أمان"

قبل تغيير الكود، من الضروري فهم ما يفعله وكيفية عدم كسر المنطق الحالي. المبدأ الرئيسي لإعادة هيكلة الكود القديم هو عدم تغيير السلوك. للقيام بذلك، نحتاج إلى إنشاء "شبكة أمان" - مجموعة من الاختبارات.

ابدأ بدراسة الكود. ابحث عن نقاط الدخول (الطرق التي يتم استدعاؤها من الخارج) وحاول تحديد النتائج المتوقعة. حتى لو كان الكود مكتوبًا بشكل سيئ، فهو يفعل شيئًا صحيحًا.

بعد التحليل، اكتب اختبارات التوصيف (Characterization Tests). هذه اختبارات تثبت السلوك الحالي للكود. إنها لا تتحقق مما إذا كان المنطق يعمل بشكل صحيح، بل توثق فقط ما يحدث حاليًا.

مثال: لدينا فئة ضخمة (Monster class) تقوم بمعالجة الطلبات.

public class OrderProcessor {    public void process(Order order) {        // 200 سطر من كود السباغيتي        if (order.getTotal() > 100) {            order.setStatus("VIP");        } else {            order.setStatus("STANDARD");        }        // ... الكثير من المنطق الآخر    }}

لا نعرف ما بداخلها، لكن يمكننا كتابة اختبار:

@Testpublic void testProcessOrderWithHighTotal() {    // Given    Order order = new Order();    order.setTotal(150);    OrderProcessor processor = new OrderProcessor();

// When processor.process(order);

// Then (نثبت السلوك الحالي) assertEquals("VIP", order.getStatus());}

قم بتشغيل الاختبارات. إذا نجحت، فقد قمت بتثبيت السلوك الحالي. الآن لديك حماية ضد الانحدار (Regression).



2. استخراج الطريقة (Extract Method)

أكثر إعادة هيكلة أمانًا وفعالية للطرق الكبيرة. الفكرة بسيطة: نأخذ جزءًا من الكود يقوم بشيء واحد، ونخرجه في طريقة منفصلة باسم واضح.

لننظر إلى مثال لكود سيئ:

public double calculateEmployeePay(Employee emp) {    double basePay = emp.getBasePay();    double overtimePay = 0;    if (emp.getHoursWorked() > 40) {        overtimePay = (emp.getHoursWorked() - 40) * basePay * 1.5;    }    double tax = basePay * 0.13;    double insurance = 5000;    return basePay + overtimePay - tax - insurance;}

هنا يتم خلط حساب ساعات العمل الإضافية والضرائب والتأمين. دعنا نفصلها:

public double calculateEmployeePay(Employee emp) {    double basePay = emp.getBasePay();    double overtimePay = calculateOvertimePay(emp, basePay);    double tax = calculateTax(basePay);    double insurance = getInsuranceCost();    return basePay + overtimePay - tax - insurance;}

private double calculateOvertimePay(Employee emp, double basePay) { if (emp.getHoursWorked() > 40) { return (emp.getHoursWorked() - 40) * basePay * 1.5; } return 0;}

private double calculateTax(double basePay) { return basePay * 0.13;}

private double getInsuranceCost() { return 5000;}

الآن كل طريقة مسؤولة عن مهمة واحدة. أصبح الكود أكثر قابلية للقراءة، وأصبح من الأسهل اختباره بشكل منفصل.



3. إزالة التكرار (DRY)

غالبًا ما يعاني الكود القديم من النسخ واللصق. قد تظهر نفس قطعة المنطق في فئات مختلفة. هذا أمر خطير: عند تغيير المتطلبات، قد تنسى تصحيح أحد التكرارات.

لنفترض أن في خدمتين مختلفتين

المدونات

توصيات الكتب