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

شرح قاعدة Command-Query Separation Principle

اسم القاعدة: Command-Query Separation Principle وتختصر CQS

تهتم هذه القاعدة بأسلوب كتابة الميثودز. فهي تقسم عمل المثود إلى نوعين:

  • أمر: أي أن الميثود تقوم بإجراء مؤثر على بيانات مستهدفة
  • استعلام: أي أن الميثود تقوم باستعلام مطلوب عن بيانات مستهدفة وإعادة النتيجة لمن طلب هذا الاستعلام بدون أي تأثير على البيانات

هذا مثال سابق استخدمته في شرح قاعدة المسؤولية الواحدة Single Responsibility Principle وقد تعمدت في ذلك الوقت مخالفة هذه القاعدة لشرحها في مقالة منفصلة.

class EmployeeModel {
    // save given employee object into database (add new or update current)
    public boolean saveEmployee(Employee employee);
 
    // delete given employee object from the database
    public boolean deleteEmployee(Employee employee);
}
class EmployeeModel {
    // save given employee object into database (add new or update current)
    func saveEmployee(employee: Employee) -> Bool
 
    // delete given employee object from the database
    func deleteEmployee(employee: Employee) -> Bool
}

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

فميثود saveEmployee تقوم بحفظ بيانات الموظف (أمر) ثم تعيد نتيجة الإضافة (استعلام).
وميثود deleteEmployee تقوم بحذف بيانات الموظف ثم تعيد نتيجة الحذف.

و تصحيح المخالفة يكون بالتعديل التالي على الكود السابق:

class EmployeeModel {
    // save given employee object into database (add new or update current)
    // throw a related Exception on errors
    public void saveEmployee(Employee employee) throws Exception;
 
    // delete given employee object from the database
    // throw a related Exception on errors
    public void deleteEmployee(Employee employee) throws Exception;
}
class EmployeeModel {
    // save given employee object into database (add new or update current)
    // throw a related Error on errors
    func saveEmployee(employee: Employee) throws
 
    // delete given employee object from the database
    // throw a related Error on errors
    func deleteEmployee(employee: Employee) throws
}

بعد التعديل، لا نقوم بإعادة true أو false كنتيجة للإضافة أو الحذف. لأن الأصل في الأمر أن تتم العملية بنجاح. إذا فشلت العملية فإن هناك مشكلة في قاعدة البيانات أو في الاتصال. لهذا نبلغ عن المشكلة عن طريق إرسال استثناء من الميثود وليس عن طريق true أو false.

بهذه الطريقة نكون طبقنا قاعدتنا. والفائدة كما يلي:
جعلنا هذه الميثود ذات مسؤولية واحدة فقط. مما يسهل فهمها وفهم عملها من مجرد قراءة توقيعها.

حذفنا مسؤولية الاستعلام عن الميثودز وهو إرجاع true أو false، لأن هذه الطريقة لا تعطينا معلومات كافية عن الخطأ.

مثلاً قد يكون الخطأ حدث في هذه المحاولة بسبب ضعف الاتصال، فيمكننا إعادة المحاولة مباشرة. أما إذا كان الخطأ بسبب انقطاع في الاتصال أو أن قاعدة البيانات تعطلت فنستطيع إنهاء العملية بدون محاولة ثانية.

Published inبرمجة

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

اترك تعليقاً

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