الفرق بين المراجعتين لصفحة: «Refactoring/encapsulate collection»
Khaled-yassin (نقاش | مساهمات) أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: تغليف المجموعات (Encapsulate Collection)}}</noinclude> == المشكلة == صنف يحتوي على حقل مجموعة ومت...' |
Khaled-yassin (نقاش | مساهمات) طلا ملخص تعديل |
||
سطر 20: | سطر 20: | ||
* إذا كانت عناصر المجموعة موجودة داخل حاوية غير بسيطة (صنف المجموعة القياسية)، بواسطة تغليف المجموعة فيمكن تقييد الوصول إلى التوابع القياسية غير المرغوب فيها للمجموعة (مثل تقييد إضافة عناصر جديدة). | * إذا كانت عناصر المجموعة موجودة داخل حاوية غير بسيطة (صنف المجموعة القياسية)، بواسطة تغليف المجموعة فيمكن تقييد الوصول إلى التوابع القياسية غير المرغوب فيها للمجموعة (مثل تقييد إضافة عناصر جديدة). | ||
== آلية الحل == | |||
# أنشئ توابع لإضافة وحذف عناصر المجموعة. ويجب أن يقبلوا عناصر المجموعة في مُعامِلاتهم. | # أنشئ توابع لإضافة وحذف عناصر المجموعة. ويجب أن يقبلوا عناصر المجموعة في مُعامِلاتهم. | ||
# تعيين مجموعة فارغة إلى الحقل كقيمة أولية إذا لم يتم ذلك في مُنشِئ الصنف. | # تعيين مجموعة فارغة إلى الحقل كقيمة أولية إذا لم يتم ذلك في مُنشِئ الصنف. | ||
# ابحث عن استدعاءات ضابط حقل المجموعة. تغيير الضابط بحيث انه يستخدم عمليات لإضافة وحذف العناصر، أو حمل هذه العمليات على استدعاء الشيفرة البرمجية للعميل. | # ابحث عن استدعاءات ضابط حقل المجموعة. تغيير الضابط بحيث انه يستخدم عمليات لإضافة وحذف العناصر، أو حمل هذه العمليات على استدعاء الشيفرة البرمجية للعميل. علمًا بأنه يمكن استخدام الضوابط فقط لاستبدال كافة عناصر المجموعة بأخرى. ولذلك قد يكون من المستحسن تغيير اسم الضابط ([[Refactoring/rename method|تابع إعادة التسمية Rename]]) إلى <code>replace</code>. | ||
علمًا بأنه يمكن استخدام الضوابط فقط لاستبدال كافة عناصر المجموعة بأخرى. ولذلك قد يكون من المستحسن تغيير اسم الضابط (تابع إعادة التسمية Rename) إلى replace. | |||
# ابحث عن استدعاءات مُتلقي المجموعة والتي تتغير بعدها المجموعة. غَيِّر الشيفرة البرمجية بحيث تستخدم التوابع الجديدة لإضافة وحذف عناصر من المجموعة. | # ابحث عن استدعاءات مُتلقي المجموعة والتي تتغير بعدها المجموعة. غَيِّر الشيفرة البرمجية بحيث تستخدم التوابع الجديدة لإضافة وحذف عناصر من المجموعة. | ||
# غَيِّر المُتلقي بحيث يُعيد تمثيل للمجموعة قابل للقراءة فقط. | # غَيِّر المُتلقي بحيث يُعيد تمثيل للمجموعة قابل للقراءة فقط. | ||
# افحص الشيفرة البرمجية للعميل التي تستخدم المجموعة للشيفرة البرمجية التي قد تبدو أفضل داخل صنف المجموعة نفسها. | # افحص الشيفرة البرمجية للعميل التي تستخدم المجموعة للشيفرة البرمجية التي قد تبدو أفضل داخل صنف المجموعة نفسها. | ||
== انظر أيضًا == | |||
[[Refactoring/rename method|تابع إعادة التسمية (Rename)]]. | |||
[[Refactoring/data class|أصناف البيانات (Data Classes)]]. | |||
== مصادر == | == مصادر == | ||
* صفحة توثيق تغليف المجموعات في موقع refactoring.guru. | * [https://refactoring.guru/encapsulate-collection صفحة توثيق تغليف المجموعات في موقع refactoring.guru]. [[تصنيف:Refactoring]] [[تصنيف:Refactoring Techniques]] [[تصنيف:Refactoring Organizing Data]] | ||
[[تصنيف:Refactoring]] | |||
[[تصنيف:Refactoring Techniques]] | |||
[[تصنيف:Refactoring Organizing Data]] |
مراجعة 16:28، 19 نوفمبر 2018
المشكلة
صنف يحتوي على حقل مجموعة ومتلقي (getter) وضابط (setter) بسيط للعمل مع المجموعة.
الحل
ضبط القيمة المعادة من المتلقي لتكون للقراءة فقط وإنشاء توابع لإضافة/حذف عناصر المجموعة.
لم إعادة التصميم؟
يحتوي الصنف على حقل يحتوي على مجموعة من الكائنات. يمكن أن تكون هذه المجموعة مصفوفة أو قائمة أو مجموعة أو مُتجه. يُنشأ مُتلقي وضابط طبيعي للعمل مع المجموعة.
ولكن يجب استخدام المجموعات بواسطة بروتوكول يختلف قليلا عن الذي تستخدمه أنواع البيانات الأخرى. لا يجب أن يُعيد تابع المُتلقي كائن المجموعة ذاته، لأن هذا سيسمح للعملاء بتغيير محتويات المجموعة بدون معرفة صنف المالك. بالإضافة إلى ذلك، سيظهر هذا الكثيرَ من الهياكل الداخلية لبيانات الكائن إلى العملاء. ويجب أن يُعيد تابع الحصول علي عناصر المجموعة قيمة لا تسمح بتغيير المجموعة أو كشف المزيد من البيانات عن هيكلها.
بالإضافة إلى ذلك، يجب ألَّا يكون هناك تابع يحدد قيمة للمجموعة. بدلًا من ذلك ينبغي أن تكون هناك عمليات لإضافة العناصر وحذفها. بفضل هذا، يتحكم الكائن المالك في إضافة عناصر المجموعة وحذفها.
يُغلِّف مثل هذا البروتوكول المجموعة بشكل صحيح، مما يقلل في النهاية من درجة الارتباط بين الصنف المالك وشيفرة العميل.
فوائد تطبيق الحل
- تغليف حقل المجموعة داخل صنف. عند استدعاء المُتلقي، يُعيد نسخة من المجموعة، الأمر الذي يمنع التغيير العرضي أو الكتابة فوق عناصر المجموعة بدون معرفة الصنف الذي يحتوي على المجموعة.
- إذا كانت عناصر المجموعة موجودة داخل نوع بسيط، مثل مصفوفة، فانك تُنشئ توابع أكثر ملاءمة للعمل مع المجموعة.
- إذا كانت عناصر المجموعة موجودة داخل حاوية غير بسيطة (صنف المجموعة القياسية)، بواسطة تغليف المجموعة فيمكن تقييد الوصول إلى التوابع القياسية غير المرغوب فيها للمجموعة (مثل تقييد إضافة عناصر جديدة).
آلية الحل
- أنشئ توابع لإضافة وحذف عناصر المجموعة. ويجب أن يقبلوا عناصر المجموعة في مُعامِلاتهم.
- تعيين مجموعة فارغة إلى الحقل كقيمة أولية إذا لم يتم ذلك في مُنشِئ الصنف.
- ابحث عن استدعاءات ضابط حقل المجموعة. تغيير الضابط بحيث انه يستخدم عمليات لإضافة وحذف العناصر، أو حمل هذه العمليات على استدعاء الشيفرة البرمجية للعميل. علمًا بأنه يمكن استخدام الضوابط فقط لاستبدال كافة عناصر المجموعة بأخرى. ولذلك قد يكون من المستحسن تغيير اسم الضابط (تابع إعادة التسمية Rename) إلى
replace
. - ابحث عن استدعاءات مُتلقي المجموعة والتي تتغير بعدها المجموعة. غَيِّر الشيفرة البرمجية بحيث تستخدم التوابع الجديدة لإضافة وحذف عناصر من المجموعة.
- غَيِّر المُتلقي بحيث يُعيد تمثيل للمجموعة قابل للقراءة فقط.
- افحص الشيفرة البرمجية للعميل التي تستخدم المجموعة للشيفرة البرمجية التي قد تبدو أفضل داخل صنف المجموعة نفسها.
انظر أيضًا
أصناف البيانات (Data Classes).