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

إخفاء المفوض.

المشكلة

يحصل العميل على الكائن B من حقل أو دالة في الكائن A. ثم يقوم العميل باستدعاء دالة في الكائن B.

الحل

أنشئ دالة جديدة في الفئة A تفوض الاستدعاء إلى الكائن B. الآن لا يعرف العميل الفئة B ولا يعتمد عليها.

##مثال

قبل
manager = person.getDepartment().getManager();
بعد
manager = person.getManager();

class Person {
  Department getDepartment() { return department; }
  Person getManager() { return department.getManager(); }
}

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

بادئ ذي بدء، دعنا نلقي نظرة على المصطلحات:

  • الخادم (Server) هو الكائن الذي يمتلك العميل وصولاً مباشراً إليه.

  • المفوض (Delegate) هو الكائن النهائي الذي يحتوي على الوظائف التي يحتاجها العميل.

تظهر سلسلة الاستدعاءات (call chain) عندما يطلب العميل كائناً من كائن آخر، ثم يطلب الكائن الثاني كائناً آخر، وهكذا. هذه السلاسل من الاستدعاءات تشرك العميل في التنقل عبر هيكل الفئات. وسيتطلب أي تغيير في هذه العلاقات المتبادلة تغييرات في جانب العميل.

##الفوائد

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

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

  1. لكل دالة في فئة المفوض (delegate-class) يستدعيها العميل، أنشئ دالة في فئة الخادم (server-class) تفوض الاستدعاء إلى فئة المفوض.

  2. قم بتغيير كود العميل بحيث يستدعي دوال فئة الخادم.

  3. إذا كانت تغييراتك تغني العميل عن الحاجة إلى فئة المفوض، فيمكنك إزالة دالة الوصول إلى فئة المفوض من فئة الخادم (الدالة التي تم استخدامها في الأصل للحصول على فئة المفوض).