اهلا وسهلا بكم احبائي في الدرس الثالث من سلسلة دروس SOLIDE PRINCIPLE … هذا الدرس سوف نأخذ المبدأ الثاني من مفاهيم SOLID PRINCIPLE وهو
مفهوم O:OPEN/CLOSE PRINCIPLE
OPEN/CLOSE PRINCIPLE : بمعنى ان هذا المبدأ يكون OPEN FOR EXETENTION BUT CLOSE FOR MODIFICATION بمعنى ان الكلاس او الدوال تكون مقفوله او لا تستمح بعمل التعديلات على هذا الكلاس لكن نستطيع ان نضيف دوال او تعليمات برمجية لغرض التطوير على سبيل المثل لو معنا كلاس فيه دالة وظيفتها حساب مرتبات الموظفين وهذه الدالة ثابتة .. وفرضا اردنا ان ان نقوم بعمل تعديلات على هذه الدالة .. فلا يجب ان نقوم بعمل التعديلات على هذه الدالة ولكن يمكننا ان نقوم بعمل كلاس جديد يورث من هذا الكلاس وعمل الدالة التي تقوم بعملية التعديل .. يعني ان الكلاس القديم كما هو لم نغيير فيه شئ فقط حيث قمنا بعمل كلاس جديد يورث منه وعملنا اضافة دالة جديدة تقوم بوظيفة حساب مرتبات موظف معيين ..
الفائدة من استخدام المبدأ OCP
وقد تتساءل ما الفائدة من ذلك .. لماذا لايتم التعديل على الدالة في الكلاس القديم ؟
الجواب : يفيدنا ذلك ان الكلاس القديم والدوال التي فيه نعتمد عليها في حساب مرتبات الموظفين . وبما اننا لم نقم بعملية التعديل على الكلاس القديم وهي دالة حساب مرتبات الموظفين فهذا يضمن لنا ان النظام يعمل ولن نحتاج الى عمل اختبار لهذه الكلاس وسوف يشتغل بهدفه وغرضه لحساب مرتبات الموظفين . وفي حالة طلب حساب معين لموظف معين يمكننا استدعاء الدالة الجديدة في الكلاس الجديد .
طيب الان كيف يمكننا تحقيق هذا المبدأ . كيف يمكننا ان نحافظ على الدوال القديمة في الكلاس القديم وان نعمل كلاس اخر يورث منه
الجواب : نستطيع تحقيق ذلك باحدى طريقتين
- باستخدام الـ ABSTRACT CLASS
- باستخدام الـ INTERFACE
مثال لعدم تحقيق مبدأ OCP؟
سوف تقوم بعرض مثال حتى يتضح المفهوم جيدا
في المثال اعلاه معنا كلاس يسمى كلاس الموظفين EMPLOYEE فيه بيانات الموظف مثل اسم الموظف وكذلك مرتبه الاساسي .
وهذه الدالة تقوم بحساب عدد الساعات الاضافية التي قام الموظف بالعمل بها او يسمى بالـ BOUNS وايضا دالة اخرى تقوم بارجاع رقم الموظف واسمه
الان سوف نقوم باستدعاء هذه الدوال في دالة الـ MAIN
في دالة الـ MAIN هنا قمنا بكتابة تعليمة برمجية تقوم باستدعاء دالة الـ TOSTRING والذي وظيفتها ارجاع رقم واسم الموظف ثم عرض الـ BOUNS للموظف كما هو واضح باستدعاء دالة CALCHOURNBOUS ()
الان اذا قمنا بتشغيل النظام
لاحظ معي النتيجة :
كما تلاحظون ان النتيجة واضحة بعد تشغيل البرنامج بان رقم الموظف 123 واسم الموظف محمد رضا وان الزيادة سوف تكون 18.75
الان نريد ان نختبر هل هذا الكلاس والدالة تحقق مبدأ OPL ..
لو اردت ان اجعل هذه الدالة تحسب الـ BOUNS لكل درجة وظيفية بشكل مختلف .
سوف نضطر الى تعديل الكلاس باضافة متغير ثالث يسمى EMPTYPE - نوع الموظف- اي اذا كان نوع الموظف مدير مثلا سوف تجعل الدالة تعيد حساب مختلف . لذلك هذا الكلاس فقد مبدأ OCP بسبب اننا قمنا بعمل التعديل على الدالة .. باضافة متغيرات واضافة طريقة حساب ولو افترضانا اننا قمنا باضافة شروط اكثر . فهذا يعني ان الدالة MAIN سوف تتغير على حسب نوع الموظف وعلى حسب الدرجة الوظيفية . والسؤال هنا : هل في كل مرة نقوم بالرجوع الى هذا الكلاس والدالة لنقوم بعملية التعديل … وايضا لاننسى اننا سوف نقوم بالتغير في دالة الـ MAIN وباضافة المدخلات في كل مرة حتى تتناسب مع التغيير الذي حصل في الكلاس … يمعنى اننا سوف نضطر الى عمل تعديلات على الكلاس وايضا عمل تعديلات على الدالة MAIN وايضا سوف نقوم باختبار وظيفة عمل الدالة في كل مرة . وهذا الامر يعارض مبدأ OCP . اذن هذا الكلاس ليس مغلق على التعديلات ويؤثر على استدعاؤها في الدالة MAIN .
ماهو الحل لتحقيق مبدأ OCP؟
كما قلنا يمكن تحقيق مبدأ OCP بإحدى طريقتين:
- باستخدام الـ ABSTRACT CLASS
- باستخدام الـ INTERFACE
تطبيق تحقيق مبدأ OCP بالاعتماد على ABSTRACT CLASS
الان لو رجعنا الى الكلاس وقمنا بجعله ABSTRACT : وهذا يعني اننا سوف نعرف الدوال في هذا الكلاس من غير ان نذكر اي محتوى له تقوم بعملية التنفيذ .
في الصوة اعلاه عملنا كلاس من النوع ABSTRACT وهذا الكلاس سوف يحتوى على دالة عامة سوف تستخدم تستخدم لارجاع ثمن الساعات الاضافية لموظف معين .. الان لنفترض ان معنى نوعين من الموظفين موظف مدير وموظف عادي .. لذلك سوف نقوم بعمل كلاسان كلاس خاص بالموظف المدير MANAGER وكلاس اخر خاص بالموظف العادي REGULAR وكلاهما سوف يرثان من الكلاس الموظفين EMPLOY
سوف نقوم بعمل كلاس يسمى MANAGER سوف يورث من هذا كلاس الموظفين .. وكما نعمل ان الكلاس الذي يرث سوف يحتوي تلقائيا على كل لمحتوى من الكلاس الاب اي ان كلاس موظف المدير سوف يحتوي على كل محتوى كلاس الموظفين .
وبهذه الطريقة نضمن انه لن نقوم بالتعديل على الكلاس الاساسي من النوع ABSTRAT .. اذن هنا قمنا بقفل الكلاس الاساسي عن اي تغيير في الدالة .. وكيف قمنا بعمل التغيير على طريقة حساب الـ BOUNS بان اضفنا كلاسات جديدة تورث من الكلاس الاساسي .
الان اذا اردنا اضافة نوع ثالث من الموظفين هنا لن نقوم بعمل الاضافة على الكلاس الاساسي وانما سوف يكون الحل باضافة كلاس اخر خاصة بموظفين الدرجة المتوسطة مثلا يورث من الكلاس الاساسي .
اذن طبقنا مبدأ ( OCL (OPNE /CLOSE PRINCIPLE : بان قمنا بغلق التعديل على الكلاس الاساسي وقمنا بعملية باضافة كلاسات اخرى تورث من الكلاس الاساسي واضافة الدوال التي تقوم الوظائف المناسبة .