تغيير الارتباط ثنائي الاتجاه إلى أحادي الاتجاه.
لديك ارتباط ثنائي الاتجاه بين فئات، ولكن إحدى الفئات لا تستخدم ميزات الفئة الأخرى.
قم بإزالة الارتباط غير المستخدم.
##مثال
class Order {
Customer customer;
}
class Customer {
Set<Order> orders; // لا تُقرأ قيمته مطلقاً
}class Order {
Customer customer;
}
class Customer {
}##لماذا نعيد الهيكلة
يصعب عموماً صيانة الارتباط ثنائي الاتجاه مقارنة بالارتباط أحادي الاتجاه، حيث يتطلب كوداً إضافياً لإنشاء وحذف الكائنات ذات الصلة بشكل صحيح. هذا يجعل البرنامج أكثر تعقيداً.
بالإضافة إلى ذلك، يمكن أن يتسبب الارتباط ثنائي الاتجاه الذي تم تنفيذه بشكل غير صحيح في حدوث مشكلات لجامع القمامة (garbage collection) (مما يؤدي بدوره إلى تضخم الذاكرة بسبب كائنات غير مستخدمة).
مثال: يقوم جامع القمامة بإزالة الكائنات من الذاكرة التي لم تعد كائنات أخرى تشير إليها. لنفترض أنه تم إنشاء زوج من الكائنات User-Order واستخدامه ثم التخلي عنه. ولكن لن يتم مسح هذه الكائنات من الذاكرة لأنها لا تزال تشير إلى بعضها البعض. ومع ذلك، أصبحت هذه المشكلة أقل أهمية بفضل التقدم في لغات البرمجة، والتي تحدد الآن تلقائياً مراجع الكائنات غير المستخدمة وتزيلها من الذاكرة.
هناك أيضاً مشكلة الاعتماد المتبادل بين الفئات. في الارتباط ثنائي الاتجاه، يجب أن تعرف الفئتان بعضهما البعض، مما يعني أنه لا يمكن استخدامهما بشكل منفصل. إذا كان هناك العديد من هذه الارتباطات، فستصبح أجزاء مختلفة من البرنامج معتمدة بشكل كبير على بعضها البعض وقد يؤثر أي تغيير في أحد المكونات على المكونات الأخرى.
##الفوائد
-
يبسط الفئة التي لا تحتاج إلى العلاقة. كود أقل يعني صيانة كود أقل.
-
يقلل التبعية بين الفئات. الفئات المستقلة أسهل في الصيانة لأن أي تغييرات في الفئة تؤثر على تلك الفئة فقط.
##كيفية إعادة الهيكلة
-
تأكد من صحة أحد الشروط التالية لفئاتك:
-
لا يتم استخدام أي ارتباط.
-
هناك طريقة أخرى للحصول على الكائن المرتبط، مثل الاستعلام من قاعدة البيانات.
-
يمكن تمرير الكائن المرتبط كوسيط (argument) للدوال التي تستخدمه.
-
-
اعتماداً على حالتك، يجب استبدال استخدام حقل يحتوي على ارتباط بكائن آخر بمعامل (parameter) أو استدعاء دالة للحصول على الكائن بطريقة مختلفة.
-
احذف الكود الذي يقوم بتعيين الكائن المرتبط إلى الحقل.
-
احذف الحقل الذي أصبح غير مستخدم الآن.