recent
احدث الدروس

الدرس الثالث من دروس Solid Principle - مفهوم(OCP) Open/Close principle

اهلا وسهلا بكم احبائي في الدرس الثالث من سلسلة دروس SOLIDE PRINCIPLE  … هذا الدرس سوف نأخذ المبدأ الثاني من مفاهيم SOLID PRINCIPLE  وهو 

مفهوم O:OPEN/CLOSE PRINCIPLE 

OPEN/CLOSE PRINCIPLE : بمعنى ان هذا المبدأ يكون OPEN FOR EXETENTION BUT CLOSE FOR MODIFICATION  بمعنى ان الكلاس او الدوال تكون مقفوله او لا تستمح بعمل التعديلات على هذا الكلاس لكن نستطيع ان نضيف دوال او تعليمات برمجية لغرض التطوير على سبيل المثل لو معنا كلاس فيه دالة وظيفتها حساب مرتبات الموظفين وهذه الدالة ثابتة .. وفرضا اردنا ان ان نقوم بعمل تعديلات على هذه الدالة .. فلا يجب ان نقوم بعمل التعديلات على هذه الدالة ولكن يمكننا ان نقوم بعمل كلاس جديد يورث من هذا الكلاس وعمل الدالة التي تقوم بعملية التعديل .. يعني ان الكلاس القديم كما هو لم نغيير فيه شئ  فقط  حيث قمنا بعمل كلاس جديد يورث منه وعملنا اضافة دالة جديدة تقوم بوظيفة حساب مرتبات موظف معيين ..

الفائدة من استخدام المبدأ OCP

وقد تتساءل ما الفائدة من ذلك .. لماذا لايتم التعديل على الدالة في الكلاس القديم ؟ 

الجواب : يفيدنا ذلك ان الكلاس القديم والدوال التي فيه نعتمد عليها في حساب مرتبات الموظفين . وبما اننا لم نقم بعملية التعديل على الكلاس القديم  وهي دالة حساب مرتبات الموظفين فهذا يضمن لنا ان النظام يعمل ولن نحتاج الى عمل اختبار لهذه الكلاس وسوف يشتغل بهدفه وغرضه لحساب مرتبات الموظفين . وفي حالة طلب حساب معين لموظف معين يمكننا استدعاء الدالة الجديدة في الكلاس الجديد .

طيب الان كيف يمكننا تحقيق هذا المبدأ . كيف يمكننا ان نحافظ على الدوال القديمة في الكلاس القديم وان نعمل كلاس اخر يورث منه 

الجواب : نستطيع تحقيق ذلك باحدى طريقتين 

  1. باستخدام الـ ABSTRACT CLASS
  2. باستخدام الـ 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 :   بان قمنا بغلق التعديل على الكلاس الاساسي وقمنا بعملية باضافة كلاسات اخرى تورث من الكلاس الاساسي واضافة الدوال التي تقوم الوظائف المناسبة .

author-img
دروس ومشاريع برمجية - جديد التقنية والابداع

تعليقات

ليست هناك تعليقات
إرسال تعليق
    google-playkhamsatmostaqltradent