Clean Code في Java: المبادئ والأمثلة للممارسين

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

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

ابدأ الدورة

Clean Code في Java: المبادئ والأمثلة التطبيقية



يواجه كل مطور Java عاجلاً أم آجلاً مشكلة الكود "القذر". الأساليب صعبة القراءة، أسماء المتغيرات غير ذات المعنى، الأرقام السحرية والفئات الضخمة - كل هذا يبطئ التطوير، ويزيد من عدد الأخطاء ويحبط الفريق. أصبح كتاب روبرت مارتن "Clean Code" مرجعاً لمن يريد كتابة برمجيات عالية الجودة. في هذه المقالة، سنحلل المبادئ الأساسية للكود النظيف في Java ونوضح كيفية تطبيقها عملياً مع أمثلة محددة.



1. تسمية المتغيرات والطرق والفئات



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



مثال سيء:

int d; // elapsed time in daysList<Integer> lst = new ArrayList<>();public void proc(int a, int b) {    // ...}


مثال جيد:

int elapsedTimeInDays;List<Integer> customerIds = new ArrayList<>();public void calculateTotalPrice(double basePrice, double discount) {    // ...}


قواعد التسمية:

  • الفئات والواجهات — أسماء (Customer, OrderProcessor, PaymentService).
  • الطرق — أفعال أو تراكيب فعلية (saveCustomer, findById, isActive).
  • المتغيرات — أسماء ذات معنى تعكس جوهر البيانات (userName, totalAmount).
  • تجنب الاختصارات — اكتب fullName بدلاً من fn، وإلا بعد شهر لن تتذكر أنت نفسك ما يعنيه fn.


2. الطرق الصغيرة ومبدأ المسؤولية الواحدة



يجب أن تقوم الطريقة بشيء واحد فقط وأن تقوم به بشكل جيد. إذا كانت الطريقة تحتوي على أكثر من 10-15 سطراً من الكود أو تحتوي على عدة مستويات من التداخل - فهذه إشارة لإعادة الهيكلة.



مثال سيء (الطريقة تفعل الكثير):

public void processOrder(Order order) {    // 1. التحقق    if (order.getItems().isEmpty()) throw new IllegalArgumentException("Order is empty");    // 2. حساب الخصم    double discount = 0;    if (order.getCustomer().isPremium()) discount = 0.1;    // 3. حساب السعر النهائي    double total = 0;    for (Item item : order.getItems()) {        total += item.getPrice() * item.getQuantity();    }    total = total * (1 - discount);    // 4. الحفظ في قاعدة البيانات    orderRepository.save(order);    // 5. إرسال البريد الإلكتروني    emailService.sendConfirmation(order.getCustomer().getEmail());}


مثال جيد (تقسيم إلى طرق صغيرة):

public void processOrder(Order order) {    validateOrder(order);    double discount = calculateDiscount(order.getCustomer());    double totalPrice = calculateTotalPrice(order, discount);    order.setTotalPrice(totalPrice);    orderRepository.save(order);    sendConfirmationEmail(order.getCustomer());}

private void validateOrder(Order order) { if (order.getItems().isEmpty()) { throw new IllegalArgumentException("Order cannot be empty"); }}

private double calculateDiscount(Customer customer) { return customer.isPremium() ? 0.1 : 0.0;}

private double calculateTotalPrice(Order order, double discount) { double subtotal = order.getItems().stream() .mapToDouble(item -> item.getPrice() * item.getQuantity()) .sum(); return subtotal * (1 - discount);}

private void sendConfirmationEmail(Customer customer) { emailService.sendConfirmation(customer.getEmail());}


3. تجنب تكرار الكود (DRY — Don't Repeat Yourself)



التكرار هو أصل الكثير من المشاكل. عندما يتكرر المنطق في عدة أماكن، فإن أي تغيير يتطلب تعديلات

المدونات

توصيات الكتب