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

تغيير المرجع إلى قيمة.

المشكلة

لديك كائن مرجعي (reference object) صغير جداً ونادراً ما يتغير، مما لا يبرر إدارة دورة حياته.

الحل

قم بتحويله إلى كائن قيمة (value object).

##مثال

قبل
class Currency {
  private String code;

  // مثيل واحد مشترك لكل رمز، تتم مقارنته باستخدام ==
}
بعد
class Currency {
  private final String code;

  Currency(String code) {
    this.code = code;
  }

  @Override
  public boolean equals(Object other) {
    return other instanceof Currency
      && code.equals(((Currency) other).code);
  }

  @Override
  public int hashCode() {
    return code.hashCode();
  }
}

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

قد يأتي الإلهام للتحول من مرجع إلى قيمة من عدم ملاءمة العمل مع المرجع. تتطلب المراجع إدارة من جانبك:

  • تتطلب دائماً طلب الكائن اللازم من وحدة التخزين.

  • قد يكون من غير المريح العمل مع المراجع في الذاكرة.

  • يعد العمل مع المراجع صعباً بشكل خاص، مقارنة بالقيم، في الأنظمة الموزعة والمتوازية.

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

##الفوائد

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

  • القيم أسهل بكثير في التنفيذ.

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

  1. اجعل الكائن غير قابل للتغيير (unchangeable). يجب ألا يحتوي الكائن على أي دوال تعيين (setters) أو دوال أخرى تغير حالته وبياناته (قد تفيد طريقة إزالة دالة التعيين هنا). المكان الوحيد الذي يجب أن تُعين فيه البيانات لحقول كائن القيمة هو المنشئ (constructor).

  2. أنشئ دالة مقارنة لتتمكن من مقارنة قيمتين.

  3. تحقق مما إذا كان بإمكانك حذف دالة المصنع (factory method) وجعل منشئ الكائن عاماً (public).