---
title: "فصل الاستعلام عن التعديل"
type: "refactoring-technique"
slug: "separate-query-from-modifier"
url: "http://localhost:3000/ar/separate-query-from-modifier.md"
category: "تبسيط استدعاءات الدوال"
description: "المشكلة: هل لديك دالة تعيد قيمة ولكنها تغير أيضًا شيئًا ما داخل الكائن؟ الحل: قسّم الدالة إلى دالتين منفصلتين. كما تتوقع، يجب أن تعيد إحداهما القيمة والأخرى تعدل الكائن."
---
# فصل الاستعلام عن التعديل

> المشكلة: هل لديك دالة تعيد قيمة ولكنها تغير أيضًا شيئًا ما داخل الكائن؟ الحل: قسّم الدالة إلى دالتين منفصلتين. كما تتوقع، يجب أن تعيد إحداهما القيمة والأخرى تعدل الكائن.

## المشكلة

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

## الحل

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

## لماذا نقوم بإعادة الهيكلة

تنفذ تقنية إعادة الهيكلة هذه مبدأ _فصل مسؤولية الاستعلام عن الأمر_. يخبرنا هذا المبدأ بفصل الكود المسؤول عن جلب البيانات عن الكود الذي يغير شيئًا ما داخل الكائن.

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

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

## الفوائد

* إذا كان لديك _استعلام_ لا يغير حالة البرنامج، فيمكنك استدعاؤه لعدد المرات التي تريدها دون الحاجة للقلق بشأن التغييرات غير المقصودة في النتيجة الناتجة عن مجرد استدعائك للدالة.

## كيفية إعادة الهيكلة

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

**Helps you do**

- [استبدال المتغير المؤقت باستعلام](/ar/replace-temp-with-query.md)

