الفرق بين المراجعتين ل"Refactoring/change bidirectional association to unidirectional"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: تغيير الاقتران ثنائي الاتجاه إلى أحادي الاتجاه (Change Bidirectional Association to Unidirectional)}}<...')
 
(تدقيق)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE: تغيير الاقتران ثنائي الاتجاه إلى أحادي الاتجاه (Change Bidirectional Association to Unidirectional)}}</noinclude>
 
<noinclude>{{DISPLAYTITLE: تغيير الاقتران ثنائي الاتجاه إلى أحادي الاتجاه (Change Bidirectional Association to Unidirectional)}}</noinclude>
 
== المشكلة ==
 
== المشكلة ==
وجود اقتران ثنائي الاتجاه بين الأصناف، ولكن لا يستخدم أحد الأصناف الميزات الأخرى.
+
وجود اقتران ثنائي الاتجاه (bidirectional association) بين الأصناف، ولكن لا يستخدم أحد الأصناف الميزات الأخرى.
  
 
== الحل ==
 
== الحل ==
سطر 7: سطر 7:
  
 
== لم إعادة التصميم؟ ==
 
== لم إعادة التصميم؟ ==
يكون من الصعب المحافظة على الاقتران ثنائي الاتجاه بشكل عام أكثر من أحادي الاتجاه، ويتطلب شيفرة برمجية إضافية لإنشاء الكائنات ذات الصلة وحذفها بشكل صحيح. وهذا يجعل البرنامج أكثر تعقيدًا.
+
يكون من الصعب المحافظة على الاقتران ثنائي الاتجاه بشكل عام بالموازنة مع الاقتران أحادي الاتجاه (unidirectional association)، ويتطلب شيفرة برمجية إضافية لإنشاء الكائنات ذات الصلة وحذفها بشكل صحيح. وهذا يجعل البرنامج أكثر تعقيدًا.
  
 
بالإضافة إلى ذلك، يمكن أن يسبب تنفيذ اقتران ثنائي الاتجاه بشكل غير صحيح مشاكل لتجميع البيانات المهملة (يؤدي ذلك بدوره إلى تضخم الذاكرة بواسطة الكائنات غير المستخدمة).
 
بالإضافة إلى ذلك، يمكن أن يسبب تنفيذ اقتران ثنائي الاتجاه بشكل غير صحيح مشاكل لتجميع البيانات المهملة (يؤدي ذلك بدوره إلى تضخم الذاكرة بواسطة الكائنات غير المستخدمة).
  
على سبيل المثال: يزيل جامع البيانات المهملة الكائنات التي لم تعد يشار إليها من قبل كائنات أخرى من الذاكرة. لنفترض إنشاء زوج من الكائنات User-Order، واستخدامه، ثم التخلي عنه. ولكن هذان الكائنان لم بُمسحا من الذاكرة لأنهما لا يزالان يشيران إلى أحدهما الآخر. ومع ذلك، فان هذه المشكلة أصبحت أقل أهمية بفضل التقدم في لغات البرمجة، والتي أصبحت تحدد تلقائيًا الآن مراجع الكائن غير المستخدمة وتُزيلها من الذاكرة.
+
على سبيل المثال: يزيل جامع البيانات المهملة (garbage collector) الكائنات التي لم تعد يشار إليها من قبل كائنات أخرى من الذاكرة. لنفترض إنشاء زوج من الكائنات <code>User</code>-<code>Order</code>، واستخدامه، ثم التخلي عنه. ولكن هذان الكائنان لم يُمسحا من الذاكرة لأنه لا يزال يشير أحدهما إلى الآخر. ومع ذلك، فإن هذه المشكلة أصبحت أقل أهمية بفضل التقدم في لغات البرمجة، والتي أصبحت تحدِّد تلقائيًا الآن مراجع الكائن غير المستخدمة وتُزيلها من الذاكرة.
  
هناك أيضا مشكلة الاعتماد المتبادل بين الأصناف. ففي الاقتران ثنائي الاتجاه، يجب أن يعلم الصنفان عن أحدهما الآخر، مما يعني أنه لا يمكن استخدامهما بشكل منفصل. وإذا وُجد العديد من هذه الاقترانات، تصبح أجزاء مختلفة من البرنامج معتمدة بشكل كبير على بعضها البعض وقد تؤثر أية تغييرات في أحد المكونات على المكونات الأخرى.
+
هناك أيضا مشكلة الاعتماد المتبادل بين الأصناف. ففي الاقتران ثنائي الاتجاه، يجب أن يعلم كل صنف عن الصنف الآخر، مما يعني أنه لا يمكن استخدامهما بشكل منفصل. وإذا وُجِدت العديد من هذه الاقترانات، تصبح أجزاء مختلفة من البرنامج معتمدة بشكل كبير على بعضها البعض وقد تؤثر أية تغييرات في أحد المكونات على المكونات الأخرى.
  
 
== فوائد تطبيق الحل ==
 
== فوائد تطبيق الحل ==
سطر 21: سطر 21:
 
== آلية الحل ==
 
== آلية الحل ==
 
# تأكد من تحقق أحد ما يلي لأصنافك:
 
# تأكد من تحقق أحد ما يلي لأصنافك:
#* لم يستخدم أي اقتران.
+
#* لم يُستخدَم أي اقتران.
 
#* هناك طريقة أخرى للحصول على الكائن المقترن، مثل إجراء استعلام قاعدة بيانات.
 
#* هناك طريقة أخرى للحصول على الكائن المقترن، مثل إجراء استعلام قاعدة بيانات.
 
#* يمكن تمرير الكائن المقترن كوسيط إلى التوابع التي تستخدمه.
 
#* يمكن تمرير الكائن المقترن كوسيط إلى التوابع التي تستخدمه.
# اعتمادًا علي وضعك، يجب استبدال استخدام الحقل الذي يحتوي علي اقتران مع كائن آخر بمعامل أو استدعاء تابع للحصول علي الكائن بطريقة مختلفة.
+
# اعتمادًا على وضعك، يجب استبدال استخدام الحقل الذي يحتوي علي اقتران مع كائن آخر بمعامل أو استدعاء تابع للحصول علي الكائن بطريقة مختلفة.
# حذف الشيفرة البرمجية التي تحدد الكائن المقترن إلى الحقل.
+
# حذف الشيفرة البرمجية التي تحدِّد الكائن المقترن إلى الحقل.
 
# حذف الحقل غير المستخدم الآن.
 
# حذف الحقل غير المستخدم الآن.
  
 
== انظر أيضًا ==
 
== انظر أيضًا ==
* العملية المُعاكسة [[Refactoring/change unidirectional association to bidirectional|تغيير الاقتران أحادي الاتجاه إلى ثنائي الاتجاه]].
+
* [[Refactoring/change unidirectional association to bidirectional|تغيير الاقتران أحادي الاتجاه إلى ثنائي الاتجاه]].
 
* [[Refactoring/inappropriate intimacy|الارتباط الوثيق غير المناسب]].
 
* [[Refactoring/inappropriate intimacy|الارتباط الوثيق غير المناسب]].
  

مراجعة 06:35، 21 نوفمبر 2018

المشكلة

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

الحل

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

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

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

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

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

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

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

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

آلية الحل

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

انظر أيضًا

مصادر