ConstructiCat Logo
CodeBust.
Browse section ▾

التغليف الذاتي للحقل.

Problem

تستخدم الوصول المباشر إلى الحقول الخاصة داخل الفئة.

Solution

أنشئ دالة جلب (getter) ودالة تعيين (setter) للحقل، واستخدمهما فقط للوصول إلى الحقل.

##Example

Before
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= low && arg <= high;
  }
}
After
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= getLow() && arg <= getHigh();
  }
  int getLow() {
    return low;
  }
  int getHigh() {
    return high;
  }
}

##Why Refactor

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

##Benefits

  • الوصول غير المباشر إلى الحقول هو عندما يتم التعامل مع الحقل عبر طرق الوصول (getters و setters). هذا النهج أكثر مرونة بكثير من الوصول المباشر إلى الحقول.

    • أولاً، يمكنك إجراء عمليات معقدة عند تعيين البيانات في الحقل أو استلامها. يتم تنفيذ التهيئة الكسولة (Lazy initialization) و التحقق من صحة قيم الحقل (validation of field values) بسهولة داخل دوال جلب وتعيين الحقل.

    • ثانيًا وهو الأكثر أهمية، يمكنك إعادة تعريف دوال الجلب والتعيين في الفئات الفرعية (subclasses).

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

##How to Refactor

  1. أنشئ دالة جلب (ودالة تعيين اختيارية) للحقل. يجب أن تكون إما protected (محمية) أو public (عامة).

  2. ابحث عن جميع الاستدعاءات المباشرة للحقل واستبدلها باستدعاءات دالة الجلب ودالة التعيين.