فصل الأوامر عن الاستعلامات

يُعد فصل الأوامر عن الاستعلامات ( CQS ) أحد مبادئ البرمجة الحاسوبية الإجرائية . وقد ابتكره برتراند ماير كجزء من عمله الرائد على لغة برمجة إيفل .

ينص هذا على أن كل دالة يجب أن تكون إما أمرًا يُنفذ إجراءً، أو استعلامًا يُعيد بيانات إلى المُستدعي، وليس كليهما. بعبارة أخرى، لا ينبغي أن يُغير طرح سؤال الإجابة . [ 1 ] وبشكل أكثر دقة، يجب أن تُعيد الدوال قيمة فقط إذا كانت شفافة مرجعيًا ، وبالتالي لا تُسبب أي آثار جانبية .

الارتباط بالتصميم بموجب عقد

يُعدّ فصل الأوامر عن الاستعلامات مناسبًا جدًا لمنهجية التصميم التعاقدي (DbC)، حيث يُعبّر عن تصميم البرنامج من خلال تأكيدات مُضمّنة في شفرة المصدر ، تصف حالة البرنامج في أوقات حرجة مُحدّدة. في منهجية التصميم التعاقدي، تُعتبر التأكيدات بمثابة تعليقات تصميمية - وليست منطقًا برمجيًا - وبالتالي، لا ينبغي أن يؤثر تنفيذها على حالة البرنامج. يُفيد فصل الأوامر عن الاستعلامات منهجية التصميم التعاقدي لأنه يُمكن استدعاء أي دالة تُعيد قيمة (أي استعلام) بواسطة أي تأكيد دون خشية تعديل حالة البرنامج.

من الناحية النظرية، يُرسي هذا معيارًا للمنطق، حيث يُمكن فهم حالة البرنامج دون تعديلها في الوقت نفسه. أما من الناحية العملية، فيُتيح نظام CQS تجاوز جميع عمليات التحقق من التأكيدات في نظام عامل لتحسين أدائه دون تغيير سلوكه عن غير قصد. كما قد يمنع نظام CQS حدوث أنواع معينة من الأخطاء البرمجية غير المتوقعة (heisenbugs) .

تأثير أوسع على هندسة البرمجيات

حتى بمعزل عن العلاقة بالتصميم التعاقدي، يعتبر مؤيدو CQS أن له تأثيرًا مبسطًا على البرنامج، مما يجعل حالاته (عبر الاستعلامات) وتغييرات الحالة (عبر الأوامر) أكثر قابلية للفهم.

يُعدّ CQS مناسبًا تمامًا لمنهجية البرمجة الكائنية ، ولكنه قابل للتطبيق أيضًا خارج نطاق البرمجة الكائنية. ولأن فصل التأثيرات الجانبية عن القيم المُعادة ليس من خصائص البرمجة الكائنية بطبيعتها، يُمكن تطبيق CQS بنجاح على أي نموذج برمجي يتطلب تحليل التأثيرات الجانبية.

فصل مسؤوليات أوامر الاستعلام

يُعمم فصل مسؤوليات الاستعلام عن الأوامر ( CQRS ) مبدأ فصل مسؤوليات الاستعلام عن الأوامر ( CQS) ليشمل الخدمات على مستوى البنية: حيث يطبق مبدأ CQS باستخدام واجهات استعلام وأوامر، ​​وعادةً نماذج بيانات منفصلة ، ​​لاسترجاع البيانات وتعديلهاعلى التوالي. [ 2 ] [ 3 ]

أنماط معمارية أخرى

  • بينما نبتعد عن التمثيل الواحد الذي نتفاعل معه عبر CRUD ، يمكننا بسهولة الانتقال إلى واجهة مستخدم قائمة على المهام.
  • يتوافق نمط CQRS بشكل جيد مع نماذج البرمجة القائمة على الأحداث. من الشائع رؤية نظام CQRS مُقسّمًا إلى خدمات منفصلة تتواصل فيما بينها باستخدام Event Collaboration. وهذا يُتيح لهذه الخدمات الاستفادة بسهولة من بنية البرمجيات الموجهة بالأحداث .
  • إن وجود نماذج منفصلة يثير تساؤلات حول مدى صعوبة الحفاظ على اتساق تلك النماذج، مما يزيد من احتمالية استخدام الاتساق النهائي.
  • بالنسبة للعديد من المجالات، هناك حاجة إلى الكثير من المنطق المطلوب عند التحديث، لذلك قد يكون من المنطقي استخدام Eager Read Derivation لتبسيط نماذج جانب الاستعلام.
  • إذا كان نموذج الكتابة يُنشئ أحداثًا لجميع التحديثات، فيمكنك هيكلة نماذج القراءة على شكل ملصقات أحداث، مما يسمح لها بأن تكون صورًا في الذاكرة وبالتالي تجنب الكثير من التفاعلات مع قاعدة البيانات.
  • يُعدّ CQRS مناسبًا للمجالات المعقدة، وهو النوع الذي يستفيد أيضًا من تصميم المجال الموجه . [ 3 ]

القيود

قد يُؤدي فصل الأوامر عن الاستعلامات (CQS) إلى تعقيدات في تنفيذ البرامج القابلة لإعادة الدخول والمتعددة الخيوط بشكل صحيح. ويحدث هذا عادةً عند استخدام نمط غير آمن للخيوط لتنفيذ فصل الأوامر عن الاستعلامات.

إليك مثال بسيط لا يتبع تسلسل الاستعلامات المستمر (CQS)، ولكنه مفيد للبرامج متعددة الخيوط لأنه يحل تعقيد عملية التأمين لجميع أجزاء البرنامج الأخرى، ولكن بفعل ذلك فهو لا يتبع تسلسل الاستعلامات المستمر (CQS) لأن الدالة تقوم بتغيير الحالة وإعادتها في نفس الوقت:

private int x ; public int incrementAndReturnX () { lock x ; // بواسطة آلية ما x = x + 1 ; int x_copy = x ; unlock x ; // بواسطة آلية ما return x_copy ; }

هذه نسخة متوافقة مع معيار CQS. يُرجى ملاحظة أنها قابلة للاستخدام بأمان فقط في التطبيقات أحادية الخيوط. في البرامج متعددة الخيوط، توجد حالة تنافس في البرنامج المُستدعي، حيث يتم استدعاء الدالتين increment()و .value()

private int x ; public int value () { return x ; } void increment () { x = x + 1 ; }

حتى في البرامج أحادية الخيوط، قد يكون من الأنسب في بعض الأحيان استخدام دالة تجمع بين الاستعلام والأمر. ويستشهد مارتن فاولر بدالة المكدس كمثال علىpop() ذلك . [ 4 ]

انظر أيضاً

مراجع

  1. ماير، برتراند. "إيفل: لغة لهندسة البرمجيات" (ملف PDF) . ص  22. تم الاطلاع عليه بتاريخ 16 ديسمبر 2014 .
  2. يونغ، غريغ. "وثائق CQRS" (ملف PDF) . تم الاطلاع عليه بتاريخ 28-12-2012 .
  3. 1 2 فاولر، مارتن. "CQRS" . تم الاسترجاع في 14-07-2011 .
  4. فاولر، مارتن. "فصل الأوامر والاستعلامات" . تم الاطلاع عليه في 5 ديسمبر 2005 .

للمزيد من القراءة

  • ماير، برتراند (سبتمبر 1994) [1988]. بناء البرمجيات الموجهة للكائنات . برنتيس هول. ISBN 0-13-629049-3.