تغيير الاقتران ثنائي الاتجاه إلى أحادي الاتجاه (Change Bidirectional Association to Unidirectional)
المشكلة
وجود اقتران ثنائي الاتجاه (bidirectional association) بين الأصناف، ولكن لا يستخدم أحد الأصناف الميزات الأخرى.
الحل
إزالة الاقتران غير المستخدم.
مثال
قبل إعادة التصميم
وجود اقتران ثنائي الاتجاه بين الصنفين Order
و Customer
، ولكن لا يستخدم أحدهما ميزات الآخر:
بعد إعادة التصميم
يحتاج الصنفان Customer
و Order
أحدهما الآخر ولكن الاقتران بينهما أحادي الاتجاه:
لم إعادة التصميم؟
يكون من الصعب المحافظة على الاقتران ثنائي الاتجاه بشكل عام بالموازنة مع الاقتران أحادي الاتجاه (unidirectional association)، ويتطلب شيفرة برمجية إضافية لإنشاء الكائنات ذات الصلة وحذفها بشكل صحيح. وهذا يجعل البرنامج أكثر تعقيدًا.
بالإضافة إلى ذلك، يمكن أن يسبب تنفيذ اقتران ثنائي الاتجاه بشكل غير صحيح مشاكل لتجميع البيانات المهملة (يؤدي ذلك بدوره إلى تضخم الذاكرة بواسطة الكائنات غير المستخدمة).
على سبيل المثال: يزيل جامع البيانات المهملة (garbage collector) الكائنات التي لم تعد يشار إليها من قبل كائنات أخرى من الذاكرة. لنفترض إنشاء زوج من الكائنات User
-Order
، واستخدامه، ثم التخلي عنه. ولكن هذان الكائنان لم يُمسحا من الذاكرة لأنه لا يزال يشير أحدهما إلى الآخر. ومع ذلك، فإن هذه المشكلة أصبحت أقل أهمية بفضل التقدم في لغات البرمجة، والتي أصبحت تحدِّد تلقائيًا الآن مراجع الكائن غير المستخدمة وتُزيلها من الذاكرة.
هناك أيضا مشكلة الاعتماد المتبادل بين الأصناف. ففي الاقتران ثنائي الاتجاه، يجب أن يعلم كل صنف عن الصنف الآخر، مما يعني أنه لا يمكن استخدامهما بشكل منفصل. وإذا وُجِدت العديد من هذه الاقترانات، تصبح أجزاء مختلفة من البرنامج معتمدة بشكل كبير على بعضها البعض وقد تؤثر أية تغييرات في أحد المكونات على المكونات الأخرى.
فوائد تطبيق الحل
- تبسيط الصنف الذي لا يحتاج إلى العلاقة يؤدي إلى شيفرة برمجية أقصر أي صيانة أقل للشيفرة.
- تقليل التبعية بين الأصناف يؤدي إلى تسهيل صيانة الأصناف المستقلة إذ أن أية تغييرات في صنف ستؤثر على ذلك الصنف فقط.
آلية الحل
- تأكد من تحقق أحد ما يلي لأصنافك:
- لم يُستخدَم أي اقتران.
- هناك طريقة أخرى للحصول على الكائن المقترن، مثل إجراء استعلام قاعدة بيانات.
- يمكن تمرير الكائن المقترن كوسيط إلى التوابع التي تستخدمه.
- اعتمادًا على وضعك، يجب استبدال استخدام الحقل الذي يحتوي علي اقتران مع كائن آخر بمعامل أو استدعاء تابع للحصول علي الكائن بطريقة مختلفة.
- حذف الشيفرة البرمجية التي تحدِّد الكائن المقترن إلى الحقل.
- حذف الحقل غير المستخدم الآن.