تجاوز المحتوى

شرح قاعدة Single Responsibility Principle

اسم القاعدة: Single Responsibility Principle وتختصر SRP

يقصد بهذه القاعدة أن كل كلاس وكل ميثود يجب أن يكون لها مسؤولية واحدة فقط.

سنكتب مثال كلاس Employee يخالف هذه القاعدة، ثم سنطبق القاعدة عليها ونستخرج المُخالفات، ثم سنقوم بإجراء عدة تعديلات لنحصل على مثال متوافق مع القاعدة.

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

  • مسؤولة عن الموظف كأوبجكت.
  • مسؤولة عن عمليات قاعدة البيانات على الموظف.
  • مسؤولة عن عمليات أخرى تجرى على قائمة (مصفوفة) الموظفين.

وبناءً على هذه المسؤوليات المتعددة سنقوم بتقسيم هذه الكلاس إلى عدة كلاسات كما يلي:

  1. الكلاس الأول يكون تحت اسم Employee وهو عبارة عن كلاس POJO عادي للموظف بدون أي عمليات.
  1. الكلاس الثاني يكون تحت اسم EmployeeModel ويمثل كافة العمليات الخاصة بالموظف في قاعدة البيانات. الإضافة والقراءة والحذف والتعديل والبحث… إلخ
  1. الكلاس الثالث يكون تحت مسمى EmployeeUtils ويحتوي على العمليات التي نجريها على الموظف خارج قاعدة البيانات، مثلاً البحث في قائمة من الموظفين أو ترتيبها.

لهذا التقسيم العديد من الفوائد التي تكتشفها عند العمل على مشاريع حقيقية. ومنها:

  • سهولة إجراء التعديلات المستقبلية.
  • سهولة حل المشكلات.
  • سهولة قراءة البرنامج ومعرفة عمل كل جزء بدون تعقيد وخلط بين الوظائف.
  • عزل كلاس Employee عن العمليات الأخرى يحميك من أي تعديلات غير مقصودة عند إرسال الاوبجكت لكلاس آخر في نفس التطبيق.

مثال على مشكلة في النسخة الأولى من كلاس Employee:
أولاً نعلم أن النسخة الأولى من الكلاس تضم كافة المسؤوليات في كلاس واحد.
ثانياً استخدمنا هذه الكلاس في أجزاء مختلفة من برنامجنا، عمليات قاعدة البيانات، عمليات البحث و الترتيب، واستخدمناها كناقل لأوبجكت الموظفين في عدد من الجزئيات.

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

لكن لو استخدمنا النسخة الثانية:
أولاً نعلم أن كل كلاس لها مسؤولية واحدة، لنقل الأوبجكت، لعمليات قاعدة البيانات، لعمليات البحث و الترتيب.
ثانياً كل كلاس نستخدمها في برنامجنا في جزئية مختلفة، نستخدم كلاس عمليات قاعدة البيانات في جزئية قاعدة البيانات فقط.

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

ملاحظة: التسمية التي استخدمناها في الكلاسات لا يجب أن تكون دائماً هكذا. هي مجرد تفضيل شخصي. مثلاً يمكن تغيير EmployeeModel إلى EmployeeTable وتغيير EmployeeUtils إلى EmployeeOperations

يمكن ترجمة هذه القاعدة إلى العربية كالتالي:
قاعدة المسؤولية الواحدة

Published inبرمجة

كن أول من ‫يعلق على المقالة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *