Refactoring: Code Smells – Large Class

غالبًا ما تبدأ الـClass بكونها صغيرة ولكن مع الوقت ومع اضافة التغييرات واضافة ميزات جديدة  في التطبيق يزداد حجمها تدريجيًا إلى أن تصبح عملاقة ويصعب التعامل معها بشكل كبير مما يحد من إمكانية إضافة المزيد من التغييرات أو صيانة الـCode
Refactoring: Code Smells – Large Class
Refactoring: Code Smells – Large Class

في هذه الصفحة

قبل أن نتطرق إلى إستكمال الحديث في سلسلة الـ Refactoring .. قمنا بعمل Github Repo تحتوي على كل الأمثلة التي نقوم بشرحها حتى يسهل عليك فهمها والتطبيق عليها  .. سنترك رابط الـ Github Repo في آخر المقال .. فقم بتجربة هذه الأمثلة باستعمال لغة البرمجة التي تفضلها .. فهذه الأمثلة مكتوبة بلغة الـ Java.

تحدثنا سابقًا عن أول نوع من الـ Code Smells وهو الـ Bloaters ويعني الانتفاخ .. وهذا النوع ينقسم إلى أكثر من نوع  تحدثنا عن أحدهم في المقال السابق وكانت عن الـLong Method وسنكمل حديثنا اليوم عن نوع  أخر وهي التعامل مع Large Class.

غالبًا ما تبدأ الـClass بكونها صغيرة ولكن مع الوقت ومع اضافة التغييرات واضافة ميزات جديدة  في التطبيق يزداد حجمها تدريجيًا إلى أن تصبح عملاقة ويصعب التعامل معها بشكل كبير مما يحد من إمكانية إضافة المزيد من التغييرات أو صيانة الـCode.

مثال للمشكلة ؟

في الـ Code Snippet رقم 1 يمكننا رؤية أن الـ Employee Class يحتوي على معلومات عامة عن كل موظف ولكن هل يمكنك معرفة أين المشكلة؟

// Before Refactoring -- code snippet 1
public class Employee {

    private String firstName;
    private String lastName;
    private String employeeId;
    private String department;
    private String email;
    private LocalDateTime dateOfBirth;
    private LocalDateTime hiringDate;

    private String country;
    private String city;
    private String street;
    private String postalCode;
    private String apartment;
    private String state;

    public String getFullAddress() {
        return "City: %s, State: %s, Country: %s, Street: %s, ApartmentNo: %s, PostalCode: %s"
                .formatted(city, state, country, street, apartment, postalCode);
    }
}

في الـ Code Snippet رقم 2 يمكننا رؤية أن الـ CardPaymentProcessor Class يحتوي على بعض البيانات المهمة الخاصة بكروت الإئتمان بالاضافة لطريقة عمل الـ processing لكل نوع من الكروت ..ولكن هل يمكنك معرفة أين المشكلة؟

// Before Refactoring -- Code Snippet 2
public class CardPaymentProcessor {

    private String visaCardNumber;
    private String visaCardHolder;
    private int visaCCN;
    private LocalDateTime visaExpirationDate;

    private String masterCardNumber;
    private String masterCardHolder;
    private int masterCCN;
    private LocalDateTime masterExpirationDate;

    private String maestroCardNumber;
    private String maestroCardHolder;
    private int maestroCCN;
    private LocalDateTime maestroExpirationDate;

    private String virtualCardNumber;
    private String virtualCardHolder;
    private int virtualCCN;
    private LocalDateTime virtualExpirationDate;

    public void processVisaCardPayment(){
        // logic
    }

    public void processMaterCardPayment(){
        // logic
    }

    public void processMaestroCardPayment(){
        // logic
    }

    public void processVirtualCardPayment(){
        // logic
    }

}

في الـ Code Snippet رقم 3 يمكننا رؤية أن الـ PaymentCalculator Class يحتوي على بعض البيانات المهمة الخاصة بطريقة الشحن بالاضافة لطريقة حساب التكلفة لكل نوع من طريقة الشحن .. ولكن هل يمكنك معرفة أين المشكلة ؟

هذا المقال مخصص للأعضاء المنتسبين لخطط الاشتراك المدفوعة فقط

اشترك الآن بنشرة اقرأ-تِك الأسبوعية

لا تدع أي شيء يفوتك. واحصل على أحدث المقالات المميزة مباشرة إلى بريدك الإلكتروني وبشكل مجاني!