الفرق بين المراجعتين لصفحة: «Refactoring/change bidirectional association to unidirectional»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: تغيير الاقتران ثنائي الاتجاه إلى أحادي الاتجاه (Change Bidirectional Association to Unidirectional)}}<...'
 
طلا ملخص تعديل
 
(3 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: تغيير الاقتران ثنائي الاتجاه إلى أحادي الاتجاه (Change Bidirectional Association to Unidirectional)}}</noinclude>
<noinclude>{{DISPLAYTITLE: تغيير الاقتران ثنائي الاتجاه إلى أحادي الاتجاه (Change Bidirectional Association to Unidirectional)}}</noinclude>
== المشكلة ==
== المشكلة ==
وجود اقتران ثنائي الاتجاه بين الأصناف، ولكن لا يستخدم أحد الأصناف الميزات الأخرى.
وجود اقتران ثنائي الاتجاه (bidirectional association) بين الأصناف، ولكن لا يستخدم أحد الأصناف الميزات الأخرى.


== الحل ==
== الحل ==
إزالة الاقتران غير المستخدم.
إزالة الاقتران غير المستخدم.
=== مثال ===
==== قبل إعادة التصميم ====
وجود اقتران ثنائي الاتجاه بين الصنفين <code>Order</code> و <code>Customer</code>، ولكن لا يستخدم أحدهما ميزات الآخر:
[[ملف:Change_Bidirectional_Association_to_Unidirectional_-_Before.png|بديل=وجود اقتران ثنائي الاتجاه بين الصنفين <code>Order</code> و <code>Customer</code>.|بدون|تصغير|وجود اقتران ثنائي الاتجاه بين الصنفين <code>Order</code> و <code>Customer</code>.]]
==== بعد إعادة التصميم ====
يحتاج الصنفان <code>Customer</code> و <code>Order</code> أحدهما الآخر ولكن الاقتران بينهما أحادي الاتجاه:
[[ملف:Change_Bidirectional_Association_to_Unidirectional_-_After.png|بديل=وجود اقتران ثنائي الاتجاه بين الصنفين <code>Order</code> و <code>Customer</code>.|بدون|تصغير|وجود اقتران ثنائي الاتجاه بين الصنفين <code>Order</code> و <code>Customer</code>.]]


== لم إعادة التصميم؟ ==
== لم إعادة التصميم؟ ==
يكون من الصعب المحافظة على الاقتران ثنائي الاتجاه بشكل عام أكثر من أحادي الاتجاه، ويتطلب شيفرة برمجية إضافية لإنشاء الكائنات ذات الصلة وحذفها بشكل صحيح. وهذا يجعل البرنامج أكثر تعقيدًا.
يكون من الصعب المحافظة على الاقتران ثنائي الاتجاه بشكل عام بالموازنة مع الاقتران أحادي الاتجاه (unidirectional association)، ويتطلب شيفرة برمجية إضافية لإنشاء الكائنات ذات الصلة وحذفها بشكل صحيح. وهذا يجعل البرنامج أكثر تعقيدًا.


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


على سبيل المثال: يزيل جامع البيانات المهملة الكائنات التي لم تعد يشار إليها من قبل كائنات أخرى من الذاكرة. لنفترض إنشاء زوج من الكائنات User-Order، واستخدامه، ثم التخلي عنه. ولكن هذان الكائنان لم بُمسحا من الذاكرة لأنهما لا يزالان يشيران إلى أحدهما الآخر. ومع ذلك، فان هذه المشكلة أصبحت أقل أهمية بفضل التقدم في لغات البرمجة، والتي أصبحت تحدد تلقائيًا الآن مراجع الكائن غير المستخدمة وتُزيلها من الذاكرة.
على سبيل المثال: يزيل جامع البيانات المهملة (garbage collector) الكائنات التي لم تعد يشار إليها من قبل كائنات أخرى من الذاكرة. لنفترض إنشاء زوج من الكائنات <code>User</code>-<code>Order</code>، واستخدامه، ثم التخلي عنه. ولكن هذان الكائنان لم يُمسحا من الذاكرة لأنه لا يزال يشير أحدهما إلى الآخر. ومع ذلك، فإن هذه المشكلة أصبحت أقل أهمية بفضل التقدم في لغات البرمجة، والتي أصبحت تحدِّد تلقائيًا الآن مراجع الكائن غير المستخدمة وتُزيلها من الذاكرة.


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


== فوائد تطبيق الحل ==
== فوائد تطبيق الحل ==
سطر 21: سطر 33:
== آلية الحل ==
== آلية الحل ==
# تأكد من تحقق أحد ما يلي لأصنافك:
# تأكد من تحقق أحد ما يلي لأصنافك:
#* لم يستخدم أي اقتران.
#* لم يُستخدَم أي اقتران.
#* هناك طريقة أخرى للحصول على الكائن المقترن، مثل إجراء استعلام قاعدة بيانات.
#* هناك طريقة أخرى للحصول على الكائن المقترن، مثل إجراء استعلام قاعدة بيانات.
#* يمكن تمرير الكائن المقترن كوسيط إلى التوابع التي تستخدمه.
#* يمكن تمرير الكائن المقترن كوسيط إلى التوابع التي تستخدمه.
# اعتمادًا علي وضعك، يجب استبدال استخدام الحقل الذي يحتوي علي اقتران مع كائن آخر بمعامل أو استدعاء تابع للحصول علي الكائن بطريقة مختلفة.
# اعتمادًا على وضعك، يجب استبدال استخدام الحقل الذي يحتوي علي اقتران مع كائن آخر بمعامل أو استدعاء تابع للحصول علي الكائن بطريقة مختلفة.
# حذف الشيفرة البرمجية التي تحدد الكائن المقترن إلى الحقل.
# حذف الشيفرة البرمجية التي تحدِّد الكائن المقترن إلى الحقل.
# حذف الحقل غير المستخدم الآن.
# حذف الحقل غير المستخدم الآن.


== انظر أيضًا ==
== انظر أيضًا ==
* العملية المُعاكسة [[Refactoring/change unidirectional association to bidirectional|تغيير الاقتران أحادي الاتجاه إلى ثنائي الاتجاه]].
* [[Refactoring/change unidirectional association to bidirectional|تغيير الاقتران أحادي الاتجاه إلى ثنائي الاتجاه]].
* [[Refactoring/inappropriate intimacy|الارتباط الوثيق غير المناسب]].
* [[Refactoring/inappropriate intimacy|الارتباط الوثيق غير المناسب]].



المراجعة الحالية بتاريخ 11:08، 2 مارس 2019

المشكلة

وجود اقتران ثنائي الاتجاه (bidirectional association) بين الأصناف، ولكن لا يستخدم أحد الأصناف الميزات الأخرى.

الحل

إزالة الاقتران غير المستخدم.

مثال

قبل إعادة التصميم

وجود اقتران ثنائي الاتجاه بين الصنفين Order و Customer، ولكن لا يستخدم أحدهما ميزات الآخر:

وجود اقتران ثنائي الاتجاه بين الصنفين Order و Customer.
وجود اقتران ثنائي الاتجاه بين الصنفين Order و Customer.

بعد إعادة التصميم

يحتاج الصنفان Customer و Order أحدهما الآخر ولكن الاقتران بينهما أحادي الاتجاه:

وجود اقتران ثنائي الاتجاه بين الصنفين Order و Customer.
وجود اقتران ثنائي الاتجاه بين الصنفين Order و Customer.

لم إعادة التصميم؟

يكون من الصعب المحافظة على الاقتران ثنائي الاتجاه بشكل عام بالموازنة مع الاقتران أحادي الاتجاه (unidirectional association)، ويتطلب شيفرة برمجية إضافية لإنشاء الكائنات ذات الصلة وحذفها بشكل صحيح. وهذا يجعل البرنامج أكثر تعقيدًا.

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

على سبيل المثال: يزيل جامع البيانات المهملة (garbage collector) الكائنات التي لم تعد يشار إليها من قبل كائنات أخرى من الذاكرة. لنفترض إنشاء زوج من الكائنات User-Order، واستخدامه، ثم التخلي عنه. ولكن هذان الكائنان لم يُمسحا من الذاكرة لأنه لا يزال يشير أحدهما إلى الآخر. ومع ذلك، فإن هذه المشكلة أصبحت أقل أهمية بفضل التقدم في لغات البرمجة، والتي أصبحت تحدِّد تلقائيًا الآن مراجع الكائن غير المستخدمة وتُزيلها من الذاكرة.

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

فوائد تطبيق الحل

  • تبسيط الصنف الذي لا يحتاج إلى العلاقة يؤدي إلى شيفرة برمجية أقصر أي صيانة أقل للشيفرة.
  • تقليل التبعية بين الأصناف يؤدي إلى تسهيل صيانة الأصناف المستقلة إذ أن أية تغييرات في صنف ستؤثر على ذلك الصنف فقط.

آلية الحل

  1. تأكد من تحقق أحد ما يلي لأصنافك:
    • لم يُستخدَم أي اقتران.
    • هناك طريقة أخرى للحصول على الكائن المقترن، مثل إجراء استعلام قاعدة بيانات.
    • يمكن تمرير الكائن المقترن كوسيط إلى التوابع التي تستخدمه.
  2. اعتمادًا على وضعك، يجب استبدال استخدام الحقل الذي يحتوي علي اقتران مع كائن آخر بمعامل أو استدعاء تابع للحصول علي الكائن بطريقة مختلفة.
  3. حذف الشيفرة البرمجية التي تحدِّد الكائن المقترن إلى الحقل.
  4. حذف الحقل غير المستخدم الآن.

انظر أيضًا

مصادر