استبدال كود النوع بالحالة/الاستراتيجية.
لديك نوع مرمز يؤثر على السلوك ولكن لا يمكنك استخدام فئات فرعية للتخلص منه.
استبدل كود النوع بكائن حالة (state object). إذا كان من الضروري استبدال قيمة حقل بكود نوع، يتم "توصيل" كائن حالة آخر.
##Example


##Why Refactor
لديك كود نوع يؤثر على سلوك فئة ما، وبالتالي لا يمكننا استخدام Replace Type Code with Class.
Type code affects the behavior of a class but we can’t create subclasses for the coded type due to the existing class hierarchy or other reasons. Thus means that we can’t apply Replace Type Code with Subclasses.
##Benefits
-
تقنية إعادة الهيكلة هذه هي مخرج من المواقف التي يغير فيها حقل ذو نوع مرمز قيمته أثناء دورة حياة الكائن. في هذه الحالة، يتم استبدال القيمة عن طريق استبدال كائن الحالة الذي تشير إليه الفئة الأصلية.
-
إذا كنت بحاجة إلى إضافة قيمة جديدة لنوع مرمز، فكل ما عليك فعله هو إضافة فئة فرعية جديدة للحالة دون تغيير الكود الحالي (راجع مبدأ الفتح/الإغلاق - Open/Closed Principle).
##How to Refactor
-
استخدم التغليف الذاتي للحقل (Self Encapsulate Field) لإنشاء دالة جلب (getter) للحقل الذي يحتوي على كود النوع.
-
أنشئ فئة جديدة وامنحها اسمًا مفهومًا يتناسب مع الغرض من كود النوع. ستلعب هذه الفئة دور الحالة (state) (أو الاستراتيجية (strategy)). فيها، قم بإنشاء دالة جلب مجردة للحقل المرمز.
-
أنشئ فئات فرعية لفئة الحالة لكل قيمة من قيم النوع المرمز. في كل فئة فرعية، أعد تعريف دالة جلب الحقل المرمز بحيث تعيد القيمة المقابلة للنوع المرمز.
-
في فئة الحالة المجردة، أنشئ دالة مصنع ثابتة (static factory method) تقبل قيمة النوع المرمز كمعامل. بناءً على هذا المعامل، ستقوم دالة المصنع بإنشاء كائنات من حالات مختلفة. ولهذا الغرض، قم بإنشاء جملة شرطية كبيرة داخلها؛ وستكون هي الوحيدة المتبقية عند اكتمال إعادة الهيكلة.
-
في الفئة الأصلية، قم بتغيير نوع الحقل المرمز إلى فئة الحالة. في دالة تعيين (setter) الحقل، استدعِ دالة مصنع الحالة للحصول على كائنات حالة جديدة.
-
الآن يمكنك البدء في نقل الحقول والدوال من الفئة الفائقة إلى الفئات الفرعية المقابلة للحالة (باستخدام إنزال الحقل (Push Down Field) و إنزال الدالة (Push Down Method)).
-
عندما يتم نقل كل ما يمكن نقله، استخدم استبدال الشرط بتعدد الأشكال (Replace Conditional with Polymorphism) للتخلص من الجمل الشرطية التي تستخدم كود النوع مرة واحدة وإلى الأبد.