تبديل رموز الأنواع بالحالة/الاستراتيجية (Replace Type Code with State/Strategy)

من موسوعة حسوب
< Refactoring
مراجعة 20:29، 27 نوفمبر 2018 بواسطة Khaled-yassin (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: تبديل رموز الأنواع بالحالة/الاستراتيجية (Replace Type Code with State/Strategy)}}</noinclude> ما هو ر...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

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

المشكلة

يؤثر نوع مُرمَّز على سلوك البرنامج ولكن لا يمكن استخدام الأصناف الفرعية للتخلص منه.

Replace Type Code with State-Strategy - Before.png

الحل

استبدال رمز النوع بكائن حالة. إذا كان من الضروري استبدال قيمة حقل برمز النوع، يكون كائن حالة آخر "موصولًا" ("plugged-in"). Replace Type Code with State-Strategy - After.png

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

يؤثر رمز النوع على سلوك الصنف، لذلك لا يمكن استخدام تبديل رموز الأنواع بالأصناف.

يؤثر رمز النوع علي سلوك الصنف ولكن لا يمكن إنشاء أصناف فرعية للنوع المُرمَّز بسبب التسلسل الهرمي للصنف الموجود أو لأسباب أخرى. مما يعني أنه لا يمكن أن تطبيق تبديل رموز الأنواع بالأصناف الفرعية.

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

  • تقنية إعادة التصميم هذه هي طريقة للخروج من الحالات التي يُغيِّر فيها حقل مع نوع مُرمَّز من قيمته طوال عمر الكائن. في هذه الحالة، تُستبدل القيمة عن طريق استبدال كائن الحالة الذي يشير إليه الصنف الأصلي.
  • إذا دعت الحاجة إلى إضافة قيمة جديدة من نوع مُرمَّز، فيجب إضافة صنف حالة فرعي جديد دون تغيير الرمز الموجود (راجع مبدأ مفتوح/مغلق).

مساوئ تطبيق الحل

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

من الجيد أن نعرف

يمكن أن يستخدم تنفيذ تقنية إعادة التصميم واحدًا من نمطي التصميم: الحالة (State) أو الاستراتيجية (Strategy). ويكون التنفيذ متشابهًا بغض النظر عن استخدام أي النمطين. لذا أي نمط يجب اختياره لكل موقف؟

إذا كنا بصدد محاولة تقسيم الشرط الذي يتحكم في تحديد الخوارزميات، تُستخدم الاستراتيجية.

ولكن إذا كانت كل قيمة من النوع المُرمَّز مسؤولة ليس فقط عن تحديد الخوارزمية ولكن عن كامل شرط الصنف، وحالة الصنف، وقيم الحقل، والعديد من الإجراءات الأخرى، ستكون الحالة هي الأفضل لهذه المهمة.

آلية الحل

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

انظر أيضًا

مصادر