الفرق بين المراجعتين ل"Refactoring/separate query from modifier"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: فصل الاستعلامات عن المُعدِّلات (Separate Query from Modifier)}}</noinclude> = المشكلة = هل لديك تا...')
 
ط
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE: فصل الاستعلامات عن المُعدِّلات (Separate Query from Modifier)}}</noinclude>   
 
<noinclude>{{DISPLAYTITLE: فصل الاستعلامات عن المُعدِّلات (Separate Query from Modifier)}}</noinclude>   
= المشكلة =
+
== المشكلة ==
 
هل لديك تابع يُعيد قيمة ما ولكن يغيِّر أيضا شيئًا ما داخل الكائن؟
 
هل لديك تابع يُعيد قيمة ما ولكن يغيِّر أيضا شيئًا ما داخل الكائن؟
  
= الحل =
+
== الحل ==
 
تقسيم التابع إلى تابعَين منفصلَين. كما يمكن أن نتوقع، يجب على أحدهما أن يعيد القيمة ويُغيِّر الآخر الكائن.
 
تقسيم التابع إلى تابعَين منفصلَين. كما يمكن أن نتوقع، يجب على أحدهما أن يعيد القيمة ويُغيِّر الآخر الكائن.
  
سطر 14: سطر 14:
 
[[ملف:Separate Query from Modifier - After.png|بديل=يقسَّم التابع إلى تابعَين منفصلَين.|بدون|تصغير|يقسَّم التابع إلى تابعَين منفصلَين.]]
 
[[ملف:Separate Query from Modifier - After.png|بديل=يقسَّم التابع إلى تابعَين منفصلَين.|بدون|تصغير|يقسَّم التابع إلى تابعَين منفصلَين.]]
  
= لم إعادة التصميم؟ =
+
== لم إعادة التصميم؟ ==
 
تفصل تقنية إعادة التصميم هذه مسؤولية الأوامر عن الاستعلامات (Command and Query Responsibility Segregation). ويدعو هذا المبدأ إلى فصل شيفرة الحصول على البيانات عن الشيفرة التي تغير شيئًا داخل الكائن.
 
تفصل تقنية إعادة التصميم هذه مسؤولية الأوامر عن الاستعلامات (Command and Query Responsibility Segregation). ويدعو هذا المبدأ إلى فصل شيفرة الحصول على البيانات عن الشيفرة التي تغير شيئًا داخل الكائن.
  
سطر 21: سطر 21:
 
ولكن تذكَّر أن الآثار الجانبية لا تكون خطيرة إلا في حالة المُعدِّلات التي تغير الحالة المرئية للكائن. على سبيل المثال، يمكن الوصول إلى هذه الحقول من الواجهة العامة لكائن، أو عنصر في قاعدة بيانات، أو في الملفات وما إلى ذلك. إذا كان المُعدِّل يُخزِّن فقط عملية معقدة ويحفظها داخل الحقل الخاص لصنف ما، فإنه بالكاد قد يسبب آثارًا جانبية.
 
ولكن تذكَّر أن الآثار الجانبية لا تكون خطيرة إلا في حالة المُعدِّلات التي تغير الحالة المرئية للكائن. على سبيل المثال، يمكن الوصول إلى هذه الحقول من الواجهة العامة لكائن، أو عنصر في قاعدة بيانات، أو في الملفات وما إلى ذلك. إذا كان المُعدِّل يُخزِّن فقط عملية معقدة ويحفظها داخل الحقل الخاص لصنف ما، فإنه بالكاد قد يسبب آثارًا جانبية.
  
= فوائد تطبيق الحل =
+
== فوائد تطبيق الحل ==
 
* إذا كان لديك استعلام لا يغير حالة البرنامج، يمكنك استدعائه مرات عديدة كما تريد دون الحاجة إلى القلق حول التغييرات غير المقصودة في النتيجة الناتجة عن مجرد حقيقة استدعاء التابع.
 
* إذا كان لديك استعلام لا يغير حالة البرنامج، يمكنك استدعائه مرات عديدة كما تريد دون الحاجة إلى القلق حول التغييرات غير المقصودة في النتيجة الناتجة عن مجرد حقيقة استدعاء التابع.
  
= مساوئ تطبيق الحل =
+
== مساوئ تطبيق الحل ==
 
* في بعض الحالات يكون من الملائم الحصول على البيانات بعد تنفيذ الأمر. على سبيل المثال، عند حذف شيء من قاعدة البيانات تريد أن تعرف عدد الصفوف التي حُذفت.
 
* في بعض الحالات يكون من الملائم الحصول على البيانات بعد تنفيذ الأمر. على سبيل المثال، عند حذف شيء من قاعدة البيانات تريد أن تعرف عدد الصفوف التي حُذفت.
  
= آلية الحل =
+
== آلية الحل ==
 
# أنشئ تابع استعلام جديد ليُعيد ما يقوم به التابع الأصلي.
 
# أنشئ تابع استعلام جديد ليُعيد ما يقوم به التابع الأصلي.
 
# غيِّر التابع الأصلي بحيث يعيد فقط نتيجة استدعاء تابع الاستعلام الجديد.
 
# غيِّر التابع الأصلي بحيث يعيد فقط نتيجة استدعاء تابع الاستعلام الجديد.

مراجعة 12:46، 2 فبراير 2019

المشكلة

هل لديك تابع يُعيد قيمة ما ولكن يغيِّر أيضا شيئًا ما داخل الكائن؟

الحل

تقسيم التابع إلى تابعَين منفصلَين. كما يمكن أن نتوقع، يجب على أحدهما أن يعيد القيمة ويُغيِّر الآخر الكائن.

مثال

قبل إعادة التصميم

تابع يُعيد قيمة ويغيِّر شيئًا ما داخل الكائن.
تابع يُعيد قيمة ويغيِّر شيئًا ما داخل الكائن.

بعد إعادة التصميم

يقسَّم التابع إلى تابعَين منفصلَين.
يقسَّم التابع إلى تابعَين منفصلَين.

لم إعادة التصميم؟

تفصل تقنية إعادة التصميم هذه مسؤولية الأوامر عن الاستعلامات (Command and Query Responsibility Segregation). ويدعو هذا المبدأ إلى فصل شيفرة الحصول على البيانات عن الشيفرة التي تغير شيئًا داخل الكائن.

وتسمَّى شيفرة الحصول علي البيانات الاستعلام (query). وتسمَّى شيفرة تغيير الأشياء في الحالة المرئية للكائن مُعدِّل modifier. عند الجمع بين الاستعلام والمُعدِّل، لن يكون لديك سبيل للحصول علي البيانات دون إجراء تغييرات علي حالتها. وبعبارة أخرى، يمكنك أن تطرح السؤال وتغيير الإجابة حتى أثناء تلقيها. وتزداد هذه المشكلة حدة عندما لا يعرف الشخص الذي يستدعي الاستعلام عن "الآثار الجانبية" للتابع، التي كثيرًا ما تؤدي إلى أخطاء وقت التشغيل.

ولكن تذكَّر أن الآثار الجانبية لا تكون خطيرة إلا في حالة المُعدِّلات التي تغير الحالة المرئية للكائن. على سبيل المثال، يمكن الوصول إلى هذه الحقول من الواجهة العامة لكائن، أو عنصر في قاعدة بيانات، أو في الملفات وما إلى ذلك. إذا كان المُعدِّل يُخزِّن فقط عملية معقدة ويحفظها داخل الحقل الخاص لصنف ما، فإنه بالكاد قد يسبب آثارًا جانبية.

فوائد تطبيق الحل

  • إذا كان لديك استعلام لا يغير حالة البرنامج، يمكنك استدعائه مرات عديدة كما تريد دون الحاجة إلى القلق حول التغييرات غير المقصودة في النتيجة الناتجة عن مجرد حقيقة استدعاء التابع.

مساوئ تطبيق الحل

  • في بعض الحالات يكون من الملائم الحصول على البيانات بعد تنفيذ الأمر. على سبيل المثال، عند حذف شيء من قاعدة البيانات تريد أن تعرف عدد الصفوف التي حُذفت.

آلية الحل

  1. أنشئ تابع استعلام جديد ليُعيد ما يقوم به التابع الأصلي.
  2. غيِّر التابع الأصلي بحيث يعيد فقط نتيجة استدعاء تابع الاستعلام الجديد.
  3. استبدل كافة المراجع إلى التابع الأصلي باستدعاءات تابع الاستعلام. وضع استدعاءًا إلى تابع المُعدِّل مباشرةً قبل هذا السطر. سيجنبك هذا الآثارَ الجانبية في حالة إذا كان التابع الأصلي قد اُستخدم في شرط عامل أو حلقة شرطيَّين.
  4. تخلص من شيفرة إعادة القيمة في التابع الأصلي، الذي أصبح الآن تابع مُعدِّل مناسب.

انظر أيضًا

مصادر