الفرق بين المراجعتين ل"Refactoring/replace type code with class"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة وتدقيق.)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE: تبديل رموز الأنواع بالأصناف (Replace Type Code with Class)}}</noinclude>
 
<noinclude>{{DISPLAYTITLE: تبديل رموز الأنواع بالأصناف (Replace Type Code with Class)}}</noinclude>
 
 
ما هو رمز النوع؟ يحدث رمز النوع عندما يوجد مجموعة من الأرقام أو السلاسل النصية التي تشكل قائمة بالقيم المسموح بها لبعض العناصر بدلًا من استخدام نوع بيانات منفصل. غالبا ما تُعطى هذه الأرقام والسلاسل المحددة أسماءً مفهومة عن طريق الثوابت، وهو السبب في استخدام هذه الرموز بشكل كبير.
 
ما هو رمز النوع؟ يحدث رمز النوع عندما يوجد مجموعة من الأرقام أو السلاسل النصية التي تشكل قائمة بالقيم المسموح بها لبعض العناصر بدلًا من استخدام نوع بيانات منفصل. غالبا ما تُعطى هذه الأرقام والسلاسل المحددة أسماءً مفهومة عن طريق الثوابت، وهو السبب في استخدام هذه الرموز بشكل كبير.
  
 
== المشكلة ==
 
== المشكلة ==
 
يحتوي الصنف على حقل يحتوي على رموز الأنواع. ولا تُستخدم قيم هذا النوع في شروط المُشغِّل ولا تؤثر علي سلوك البرنامج.
 
يحتوي الصنف على حقل يحتوي على رموز الأنواع. ولا تُستخدم قيم هذا النوع في شروط المُشغِّل ولا تؤثر علي سلوك البرنامج.
[[ملف:Replace Type Code with Class - Before.png|بدون|تصغير]]
+
[[ملف:Replace Type Code with Class - Before.png|بدون|تصغير|206x206بك]]
  
 
== الحل ==
 
== الحل ==
 
إنشاء صنف جديد واستخدام كائناته بدلًا من قيم رموز الأنواع.
 
إنشاء صنف جديد واستخدام كائناته بدلًا من قيم رموز الأنواع.
[[ملف:Replace Type Code with Class - After.png|بدون|تصغير]]
+
[[ملف:Replace Type Code with Class - After.png|بدون|تصغير|361x361بك]]
  
 
== لم إعادة التصميم؟ ==
 
== لم إعادة التصميم؟ ==
سطر 45: سطر 44:
  
 
== مصادر ==
 
== مصادر ==
* [https://refactoring.guru/replace-type-code-with-class صفحة توثيق تبديل رموز الأنواع بالأصناف في موقع refactoring.guru]. [[تصنيف:Refactoring]] [[تصنيف:Refactoring Techniques]] [[تصنيف:Refactoring Organizing Data]]
+
* [https://refactoring.guru/replace-type-code-with-class صفحة توثيق تبديل رموز الأنواع بالأصناف في موقع refactoring.guru]. [[تصنيف:Refactoring]] [[تصنيف:Refactoring Techniques]] [[تصنيف:Refactoring Organizing Data]]

مراجعة 13:31، 18 ديسمبر 2018

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

المشكلة

يحتوي الصنف على حقل يحتوي على رموز الأنواع. ولا تُستخدم قيم هذا النوع في شروط المُشغِّل ولا تؤثر علي سلوك البرنامج.

Replace Type Code with Class - Before.png

الحل

إنشاء صنف جديد واستخدام كائناته بدلًا من قيم رموز الأنواع.

Replace Type Code with Class - After.png

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

أحد الأسباب الأكثر شيوعًا لاستخدام رموز الأنواع هو التعامل مع قواعد البيانات، فعندما تحتوي قاعدة البيانات على حقول يُجرَى فيها ترميز بعض المفاهيم المعقدة برقم أو سلسلة.

علي سبيل المثال، الصنف User مع الحقل user_role، الذي يحتوي على معلومات حول امتيازات الوصول لكل مستخدم، سواء كان المسؤول أو المحرر أو المستخدم العادي. لذلك ففي هذه الحالة، تُرمَّز هذه المعلومات في الحقل بالحروف A و E و U علي التوالي.

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

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

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

  • المُراد تحويل مجموعات بسيطة القيم – مثل الأنواع المُرمَّزة – إلى أصناف كاملة الأهلية مع كل الفوائد التي تتيحها برمجة الكائنات.
  • يسمح بالتلميح بنوع القيم المُمررة إلى التوابع والحقول علي مستوي لغة البرمجة وذلك باستبدال رموز الأنواع بالأصناف.

فعلي سبيل المثال، بينما لم يكن المُترجم البرمجي (compiler) يُميِّز مسبقًا بين الثوابت الرقمية والأرقام العشوائية عند تمرير قيمة ما إلى التابع، أصبح الآن يُصدر تحذيرًا عن الخطأ داخل IDE الخاص بك عند تمرير البيانات التي لا تناسب صنف النوع المشار إليه.

  • وبالتالي فمن الممكن نقل الرمز إلى أصناف النوع. وإذا كانت هناك حاجة لأداء معالَجات مُعقدة باستخدام قيم الأنواع في البرنامج بأكمله، يمكن لهذا الرمز الآن "العيش" داخل أصناف النوع الواحد أو المتعدد الأنواع.

متى يُترك هذا الحل؟

إذا استُخدِمت قيم أنواع مُرمَّزة داخل هياكل تدفق التحكم (if و switch، الخ) والتحكم في سلوك الصنف، يجب استخدام إحدى تقنيتي إعادة تصميم رمز النوع:

آلية الحل

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

انظر أيضًا

مصادر