شعار ConstructiCat
CodeBust.
تصفح القسم ▾

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

المشكلة

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

الحل

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

##مثال

قبل
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= low && arg <= high;
  }
}
بعد
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= getLow() && arg <= getHigh();
  }
  int getLow() {
    return low;
  }
  int getHigh() {
    return high;
  }
}

##لماذا نعيد الهيكلة

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

##الفوائد

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

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

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

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

##كيفية إعادة الهيكلة

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

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