تُعدّ المتغيرات المؤقتة من أكثر مصادر التعقيد غير الضروري في الشيفرة البرمجية شيوعًا. فهي تتراكم في الدوال الطويلة، وتُطلق أسماءً مبهمة على القيم المحسوبة، وتُصعّب استخراج المنطق الذي تحتويه، واختباره، وإعادة استخدامه. وتتناول عملية إعادة هيكلة الشيفرة البرمجية "استبدال المؤقت بالاستعلام"، التي وثّقها مارتن فاولر في كتابه "إعادة الهيكلة: تحسين تصميم الشيفرة البرمجية الحالية" ، هذه المشكلة مباشرةً: فبدلًا من تخزين القيمة المحسوبة في متغير محلي، يتم استخراج العملية الحسابية إلى دالة مُسماة، تُسمى "استعلام"، ثم استدعاؤها عند الحاجة إلى القيمة.
والنتيجة هي كود يُعبّر عن الغرض بدلًا من إخفائه. لم تعد العملية الحسابية مُخبأة في تعيين قيمة لمتغير في بداية دالة طويلة؛ بل أصبح لها اسم وموقع، وإمكانية اختبارها بشكل منفصل. تتناول هذه المقالة التقنية كاملةً، وماهية المتغيرات المؤقتة، ومتى تُصبح مشكلة، وكيفية تنفيذ إعادة البناء خطوة بخطوة في جافا وبايثون وتايب سكريبت، ومتى يُنصح بتطبيقها ومتى يُنصح بتجنبها، وكيف ترتبط بالتقنيات ذات الصلة في دليل إعادة البناء.
أعد هيكلة الكود الخاص بك بثقة
SMART TS XL آثار حيث يتم استخدام المتغيرات المؤقتة والحسابات المكررة وطرق الاستعلام المستخرجة.
يتعلم أكثرما هو المتغير المؤقت (Temp) في البرمجة؟
المتغير المؤقت، أو ما يُعرف اختصارًا بـ " temp" ، هو متغير محلي داخل دالة أو أسلوب، يُخزّن نتيجة وسيطة لاستخدامها ضمن نفس النطاق. يُحسب هذا المتغير مرة واحدة، ويُخزّن في متغير مُسمى، ثم يُشار إليه لاحقًا في نفس الدالة. يبقى المتغير موجودًا فقط طوال مدة استدعاء الدالة؛ فلا يمكن الوصول إليه من خارجها، ولا يُخزّن في حالة الكائن.
الثعبان
# Python: base_price is a temp variable
def calculate_total(quantity, item_price):
base_price = quantity * item_price # temp: computed once, used below
if base_price > 1000:
return base_price * 0.95
return base_price * 0.98
جافا
// Java: basePrice is a temp variable
double basePrice = quantity * itemPrice; // temp
if (basePrice > 1000) {
return basePrice * 0.95;
}
return basePrice * 0.98;
نسخة مطبوعة على الآلة الكاتبة
// TypeScript: basePrice is a temp variable
const basePrice = quantity * itemPrice; // temp
if (basePrice > 1000) return basePrice * 0.95;
return basePrice * 0.98;
لا تُعدّ المتغيرات المؤقتة سيئة بطبيعتها، فلها استخدامات مشروعة: مثل تسجيل نتيجة عملية حسابية مكلفة، أو تقسيم عملية حسابية معقدة متعددة الخطوات إلى مراحل سهلة القراءة، أو تخزين القيم المتراكمة عبر تكرارات الحلقة. تكمن المشكلة في استخدام المتغيرات المؤقتة بشكل تلقائي لقيم مشتقة بسيطة، والتي سيكون من الأوضح استخدامها كدوال مُسماة، أو عندما تتراكم هذه القيم عبر دالة طويلة، مما يُجبر المستخدمين على تتبع قيم وسيطة متعددة نشطة في الوقت نفسه.
ما هي عملية إعادة هيكلة البرمجيات في هندسة البرمجيات؟
إعادة هيكلة الكود هي عملية إعادة تنظيم الكود الحالي دون تغيير سلوكه الظاهر. الهدف هو تحسين جودة الكود الداخلية: سهولة قراءته، وقابليته للاختبار، وسهولة صيانته، وبنيته المعيارية. لا تضيف إعادة الهيكلة ميزات جديدة ولا تُصلح الأخطاء؛ بل تُغير بنية الكود مع الحفاظ على وظيفته الأساسية.
يُعد استبدال Temp بـ Query أحد أساليب إعادة الهيكلة ضمن مجموعة من عشرات الأساليب التي وصفها مارتن فاولر. وينتمي هذا الأسلوب إلى عائلة من الأساليب التي تتعامل مع الدوال التي أصبحت طويلة جدًا أو معقدة للغاية.
| تقنية إعادة الهيكلة | ماذا يفعل |
|---|---|
| استبدال Temp بالاستعلام | يستخرج عملية حساب متغير مؤقت إلى دالة مسماة |
| طريقة استخراج | يستخرج كتلة من التعليمات البرمجية إلى دالة جديدة مسماة |
| درجة الحرارة المضمنة | يستبدل درجة الحرارة البسيطة بتعبيرها مباشرة |
| تقسيم المتغير المؤقت | يفصل هذا الأمر متغيرًا مؤقتًا يُعاد استخدامه لأغراض مختلفة إلى متغيرات منفصلة. |
| استبدل الحلقة بخط الأنابيب | يستبدل حلقة الإجرائية بخط أنابيب وظيفي (map، filter، reduce) |
| تقديم المتغير التفسيري | يُدخل متغيرًا مؤقتًا مُسمى لتوضيح تعبير معقد |
لا تُستخدم هذه التقنيات بمعزل عن بعضها. يصف فاولر استبدال المتغيرات المؤقتة بالاستعلامات كخطوة أساسية قبل استخراج الدالة: فإذا كانت الدالة تحتوي على متغيرات مؤقتة، يصبح استخراج جزء منها إلى دالة جديدة أمرًا صعبًا لأن هذه المتغيرات المؤقتة قد تُستخدم قبل الجزء المستخرج وبعده. لذا، فإن حذف المتغيرات المؤقتة أولًا بتحويلها إلى استعلامات يُسهّل عملية الاستخراج.
ما المقصود باستبدال كلمة "temp" بكلمة "query"؟
استبدال المتغير المؤقت بالاستعلام هو أسلوب لإعادة هيكلة الكود يحوّل المتغير المؤقت المحلي إلى استدعاء دالة. فبدلاً من حساب قيمة وتعيينها لمتغير محلي، يتم استخراج عملية الحساب إلى دالة خاصة، هي الاستعلام، والتي تُعيد القيمة المحسوبة عند استدعائها. أينما تم استخدام المتغير المؤقت، يتم استبدال مرجعه باستدعاء دالة الاستعلام.
المثال النموذجي من كتاب فاولر " إعادة الهيكلة ":
قبل:
جافا
double basePrice = _quantity * _itemPrice;
if (basePrice > 1000)
return basePrice * 0.95;
else
return basePrice * 0.98;
بعد:
جافا
if (basePrice() > 1000)
return basePrice() * 0.95;
else
return basePrice() * 0.98;
private double basePrice() {
return _quantity * _itemPrice;
}
طريقة الاستعلام basePrice() أصبحت الآن عملية حسابية مستقلة ومسماة. يمكن استدعاؤها من أي طريقة أخرى في الفئة، واختبارها بشكل مستقل، وإعادة تعريفها في الفئات الفرعية، وفهمها دون الحاجة إلى قراءة طريقة الاستدعاء أولاً.
مشكلة المتغيرات المؤقتة
إنهم يجزئون المنطق عبر طريقة واحدة
يُقسّم المتغير المؤقت العملية الحسابية إلى جزأين منفصلين: التخصيص (حيث تُحسب القيمة) والاستخدام (حيث تُقرأ). في الدوال القصيرة، لا يُسبب هذا التقسيم أي ضرر. أما في الدوال التي يصل طولها إلى ثلاثين أو خمسين سطرًا، فقد يفصل بين التخصيص والاستخدام عدة أسطر من منطق برمجي آخر. يجب على القارئ التمرير لأعلى للعثور على التخصيص، وحفظ معناه في الذاكرة العاملة، ثم التمرير مرة أخرى إلى الاستخدام. كل متغير مؤقت إضافي يزيد من هذا العبء المعرفي.
إنهم يحظرون طريقة الاستخراج
تكمن المشكلة العملية الأبرز في استخدام المتغيرات المؤقتة في أنها تعيق عمليات إعادة هيكلة الكود الأخرى. لنفترض وجود دالة تحتوي على فرع شرطي معقد، من الأفضل فصله إلى دالة مستقلة. إذا كان هذا الفرع يستخدم متغيرًا مؤقتًا تم تعيينه مسبقًا داخل الدالة، فإن عملية الفصل تتطلب إما تمرير المتغير المؤقت كمعامل، أو جعله متغيرًا خاصًا بالمثيل، أو إعادة حساب قيمته داخل الدالة المفصولة. لا يُعد أي من هذه الخيارات مثاليًا. لذا، فإن حذف المتغير المؤقت أولًا باستبداله باستعلام يزيل هذه العقبة تمامًا.
إنها تدعو إلى إعادة الاستخدام والتغيير
تُعاد استخدام المتغيرات المؤقتة أحيانًا لأغراض مختلفة ضمن نفس الدالة، وهي ممارسة يسميها فاولر "تشابك المتغيرات المؤقتة". متغير يُسمى temp or result لا يُقدّم إعادة تعيين البيانات عدة مرات أي معلومات دلالية، بل يُضلّل القراء بشأن ما تُمثّله في أي لحظة. حتى البيانات المؤقتة ذات الغرض الواحد يُمكن أن تتراكم حتى يُصبح نطاق الدالة مُزدحمًا بالقيم الوسيطة التي يجب على القراء تتبّعها في آنٍ واحد.
خطوة بخطوة: كيفية تطبيق استبدال Temp بالاستعلام
تتضمن عملية التحويل أربع خطوات يمكن تطبيقها بأمان في أي لغة:
الخطوة الأولى: تأكد من تعيين قيمة المتغير المؤقت مرة واحدة فقط وعدم تغييرها مطلقًا. إذا أُعيد تعيين قيمة المتغير المؤقت لاحقًا في الدالة، فقم بتقسيمه أولًا باستخدام دالة تقسيم المتغير المؤقت.
الخطوة 2: استخراج الجانب الأيمن من عملية الإسناد إلى دالة خاصة. أعطِ الدالة اسمًا يصف ما تحسبه، وليس كيف. basePrice() أفضل من calculateQuantityTimesPrice().
الخطوة 3: استبدل كل إشارة إلى المتغير المؤقت باستدعاء للدالة الجديدة. تستطيع معظم بيئات التطوير المتكاملة (IDEs) القيام بذلك تلقائيًا: انقر بزر الماوس الأيمن على المتغير المؤقت ← إعادة هيكلة ← تضمين متغير، ثم استخرج الدالة من التعبير المضمن.
الخطوة الرابعة: احذف تعريف المتغير المؤقت. إذا اكتمل الاستخراج، فلن يكون للمتغير المؤقت أي مراجع ويمكن حذفه.
جافا: مثال عملي كامل
جافا
// Before: Order class with temporary variables
public class Order {
private int quantity;
private double itemPrice;
public double getPrice() {
double basePrice = quantity * itemPrice; // temp 1
double discountFactor; // temp 2
if (basePrice > 1000)
discountFactor = 0.95;
else
discountFactor = 0.98;
return basePrice * discountFactor;
}
}
جافا
// After: temps extracted to query methods
public class Order {
private int quantity;
private double itemPrice;
public double getPrice() {
return basePrice() * discountFactor();
}
private double basePrice() {
return quantity * itemPrice;
}
private double discountFactor() {
return basePrice() > 1000 ? 0.95 : 0.98;
}
}
الأسلوب getPrice() يُقرأ الآن كتعبير واحد يُوضح العملية الحسابية بوضوح. يمكن قراءة كل استعلام مُستخرج واختباره وتوسيعه بشكل مستقل. لاحظ أن discountFactor() المكالمات basePrice()هذا صحيح لأن basePrice() هي عملية حسابية بحتة بدون أي آثار جانبية، لذا فإن استدعاءها مرتين لا يشكل أي خطر.
بايثون: استبدل Temp بـ Property
في لغة بايثون، المكافئ الطبيعي لطريقة الاستعلام هو @property، مما يسمح باستدعاء الطريقة بدون أقواس، وتتم قراءتها بشكل مطابق للوصول إلى السمة:
الثعبان
# Before: temporary variables in a method
class Order:
def __init__(self, quantity, item_price):
self.quantity = quantity
self.item_price = item_price
def get_price(self):
base_price = self.quantity * self.item_price # temp
discount = 0.95 if base_price > 1000 else 0.98 # temp
return base_price * discount
الثعبان
# After: temps replaced with properties (query methods in Python)
class Order:
def __init__(self, quantity, item_price):
self.quantity = quantity
self.item_price = item_price
def get_price(self):
return self.base_price * self.discount_factor
@property
def base_price(self):
return self.quantity * self.item_price
@property
def discount_factor(self):
return 0.95 if self.base_price > 1000 else 0.98
باستخدام @property يعني self.base_price يُقرأ بشكل مطابق لمتغير مثيل، مما يجعل الكود المُستدعي self.base_price * self.discount_factor طبيعي بالكامل. كل خاصية قابلة للاختبار بشكل مستقل:
الثعبان
def test_base_price():
order = Order(10, 150)
assert order.base_price == 1500
def test_discount_factor_high_value():
order = Order(10, 150) # base_price = 1500 > 1000
assert order.discount_factor == 0.95
def test_get_price():
order = Order(10, 150)
assert order.get_price() == 1500 * 0.95
يستحيل تحقيق هذا المستوى من إمكانية الاختبار باستخدام الإصدار القائم على البيانات المؤقتة: العمليات الحسابية الداخلية base_price و discount_factor لا يمكن الوصول إليها من خارج هذه الطريقة.
تايب سكريبت: طرق الاستعلام ودوال الوصول
يدعم TypeScript كلاً من الاستعلامات القائمة على الأساليب ووظائف جلب الخصائص، بما يتوافق مع الأنماط المتوفرة في Java و Python على التوالي:
نسخة مطبوعة على الآلة الكاتبة
// Before: temporary variables
class Order {
constructor(private quantity: number, private itemPrice: number) {}
getPrice(): number {
const basePrice = this.quantity * this.itemPrice; // temp
const discount = basePrice > 1000 ? 0.95 : 0.98; // temp
return basePrice * discount;
}
}
نسخة مطبوعة على الآلة الكاتبة
// After: TypeScript getters replace temps
class Order {
constructor(private quantity: number, private itemPrice: number) {}
getPrice(): number {
return this.basePrice * this.discountFactor;
}
private get basePrice(): number {
return this.quantity * this.itemPrice;
}
private get discountFactor(): number {
return this.basePrice > 1000 ? 0.95 : 0.98;
}
}
تسمية أساليب الاستعلام بشكل جيد
يُعدّ اسم دالة الاستعلام هو العامل الأهم. فاستخدام اسم غير مناسب لعملية الاستخراج أسوأ من الدالة المؤقتة التي استبدلتها، لأنه يُنشئ مستوىً غير واضح من التوجيه: إذ يتعيّن على المستخدمين الرجوع إلى تعريف الدالة لفهم وظيفتها، مما يُفقدها جدواها.
تتبع أسماء طرق الاستعلام الجيدة هذه المبادئ:
سمِّ ما يمثله، وليس كيف يتم حسابه. basePrice() يوصل مفهوم العمل. getQuantityTimesItemPrice() يصف الحساب، وليس المفهوم. هذا التمييز مهم عندما يتغير الحساب، أو اسم المفهوم. basePrice() يظل ثابتاً حتى لو تغيرت الصيغة.
استخدم عبارات اسمية للتعبير عن القيم. تُرجع طرق الاستعلام قيمًا؛ فهي ليست أوامر. discountFactor(), totalAmount(), isEligible() اتبع اصطلاح تسمية ما يتم إرجاعه. calculateDiscount(), processAmount() اتبع اصطلاح الأوامر الإجرائي، وهو أمر مربك بالنسبة للطرق التي تقوم فقط بالحساب والإرجاع.
يجب قراءة الاستعلامات المنطقية على أنها أسئلة. isHighValue(), hasDiscount(), meetsThreshold() توضيح أن القيمة المُعادة هي قيمة منطقية (boolean) وأن المتصل يطرح سؤالاً بنعم/لا. bool 変数名 (تسمية المتغيرات المنطقية، استعلام في بيانات Search Console) يعكس هذا القلق بالضبط: تحتاج المتغيرات والأساليب المنطقية إلى أسماء توضح معناها عند نقطة الاستخدام.
حافظ على ثبات الأسماء عبر الطرق ذات الصلة. If basePrice() يستخدم من قبل discountFactor()يدل اتساق التسمية على أن discountFactor يعتمد على basePriceيؤدي عدم اتساق التسمية إلى الإخلال بهذا التوثيق الضمني.
متى يتم تطبيق استبدال كلمة "مؤقت" بكلمة "استعلام"؟
قم بتطبيق هذا التعديل البرمجي عندما:
- يتم تعيين درجة الحرارة مرة واحدة فقط ولا يتم إعادة تعيينها أبداً.
- الحساب عبارة عن تعبير محض: فهو يقرأ من الحقول أو المعلمات ولكنه لا يعدل الحالة الخارجية، ولا يستدعي خدمات الشبكة، ولا يعتمد على الوقت أو العشوائية.
- الحساب معقد بما يكفي بحيث أن تسميته ستساعد على سهولة القراءة، أو بسيط بما يكفي بحيث أن درجة الحرارة مجرد فوضى.
- أنت على وشك تطبيق طريقة الاستخراج على كتلة تستخدم temp
السيناريو الأمثل الأكثر شيوعًا هو القيمة المشتقة: السعر، الإجمالي، الخصم، سلسلة نصية منسقة، تصنيف شرطي. هذه قيم مشتقة بالكامل من حقول الكائن، دون أي آثار جانبية، وتنتمي بطبيعتها إلى خصائص الكائن نفسه بدلًا من كونها عمليات حسابية وسيطة داخل دالة.
متى لا يُنصح بالتطبيق؟ استبدل كلمة "مؤقت" بكلمة "استعلام".
العمليات الحساسة للأداء. إذا كانت العملية الحسابية مكلفة، كاستعلام قاعدة بيانات، أو استدعاء شبكة، أو حلقة تكرارية من رتبة O(n²)، فإن استدعاء دالة الاستعلام مرتين يُضاعف التكلفة. وُجد المتغير المؤقت تحديدًا لتجنب ذلك. في هذه الحالات، إما أن تُبقي المتغير المؤقت في مكانه أو تُخزّن نتيجة دالة الاستعلام مؤقتًا (تخزين النتيجة بعد الاستدعاء الأول).
الثعبان
# Memoized property: computed once, cached
from functools import cached_property
class Order:
@cached_property
def expensive_validation(self):
return self.external_service.validate(self.data) # called once, cached
العمليات ذات الآثار الجانبية. إذا كان المتغير المؤقت يحتوي على نتيجة عملية يجب تنفيذها مرة واحدة فقط (مثل إنشاء مُعرّف فريد، أو تسجيل البيانات، أو الكتابة إلى ملف)، فإن تحويله إلى استعلام سيؤدي إلى تنفيذ العملية في كل استدعاء. هذا يُغيّر سلوك البرنامج، وليس بنيته فقط. لذا، لا تُطبّق هذا التعديل على المتغيرات المؤقتة ذات الآثار الجانبية.
درجات الحرارة التي تتراكم عبر تكرارات الحلقة. درجة الحرارة التي تمثل المُجمِّع في for حلقة، total += item.priceلا يُعدّ `temp` خيارًا مناسبًا لاستبدال `Query`. فهو ليس قيمة مشتقة، بل حالة تتراكم عبر التكرارات. إذا كانت المشكلة تكمن في الحلقة، ففكّر في استبدال `Loop` بـ `Pipeline`.
تقنيات إعادة الهيكلة ذات الصلة
يُعد استبدال Temp بـ Query أحد أساليب مجموعة من التقنيات التي تُزيل مجتمعةً التعقيد غير الضروري في الدوال. ويساعد فهم هذه المجموعة المطورين على اختيار الأسلوب المناسب للمشكلة المطروحة.
تُعدّ دالة الاستخراج هي الأكثر شيوعًا. غالبًا ما يُسهّل استبدال "Temp" بـ "Query" استخدام دالة الاستخراج عن طريق مسح المتغيرات التي قد تتطلب تمريرًا معقدًا للمعاملات بين الجزء المستخرج وبقية الدالة.
يُعدّ Inline Temp عكس إضافة متغير مؤقت: فهو يستبدل المتغير المؤقت بتعبيره مباشرةً في الكود. استخدم Inline Temp عندما لا يُضيف المتغير المؤقت أي وضوح، ويكون تعبيره قابلاً للقراءة بالفعل.
يُستخدم تقسيم المتغير المؤقت عندما يُعاد استخدام متغير مؤقت واحد لأغراض متعددة في نفس الدالة. قسّم المتغير إلى متغيرات منفصلة بأسماء تعكس كل غرض، ثم طبّق استبدال المتغير المؤقت بالاستعلام على أي من المتغيرات المؤقتة الناتجة ذات الاستخدام الواحد.
يُعدّ إدخال متغير توضيحي اتجاهًا معاكسًا: فإذا كان التعبير المعقد صعب القراءة، فإنّ إدخال متغير مؤقت باسم وصفي يُحسّن من وضوحه. تتعارض هذه التقنية مع استبدال المتغير المؤقت بالاستعلام، وعلى المطور تحديد أيّ الاتجاهين يُحسّن الكود المعنيّ.
استبدل الحلقة بخط الأنابيب يتناول هذا الأسلوب نمطًا شائعًا حيث يمكن استبدال حلقة مع مُجمِّع مؤقت بعملية خط أنابيب متسلسلة (map, filter, reduce)، وهو أكثر وضوحاً وأسهل في القراءة.
كيفية SMART TS XL يدعم إعادة هيكلة البيانات على نطاق واسع
استبدال Temp بـ Query هو إعادة هيكلة محلية: فهو يحوّل متغيرًا واحدًا في دالة واحدة. في قاعدة بيانات كبيرة الحجم، السؤال الأهم ليس "كيف أطبّق هذه إعادة الهيكلة؟" بل "أين في قاعدة البيانات بأكملها يجب تطبيقها، وما الذي سيتأثر عند تطبيقها؟"
SMART TS XL يُقدّم هذا البرنامج تحليلًا هيكليًا شاملًا لقواعد البيانات البرمجية، مما يجعل الإجابة على هذا السؤال منهجية. فهو يُحدّد مواضع تنفيذ نفس العملية الحسابية كمتغير مؤقت في مواقع متعددة، وهو النمط الذي صُمّم برنامج "استبدال المؤقت بالاستعلام" لدمجه في دالة استعلام واحدة مُسمّاة. كما يتتبّع كيفية استخدام دالة الاستعلام المُعاد هيكلتها بعد استخراجها، مما يجعل نطاق إعادة الهيكلة واضحًا قبل تنفيذها. ويعمل البرنامج عبر لغات البرمجة المختلفة: لأنظمة المؤسسات التي تعمل فيها برامج COBOL وخدمات Java وخطوط أنابيب Python على نفس البيانات. تحليل الكود الثابت و تحليل الأثر تحديد مكان ظهور نفس الحساب المنطقي بأشكال مختلفة عبر لغات مختلفة، وهو الشكل الأعمق للمشكلة التي يعالجها برنامج Replace Temp with Query على مستوى اللغة الواحدة.
للفرق العاملة على تحديث التراث, SMART TS XLالصورة تصور التبعية يجعل من الممكن رؤية مكان استخدام المكونات المعاد هيكلتها قبل تغييرها، مما يضمن أن استخراج عملية حسابية إلى طريقة استعلام لا يؤدي إلى كسر المتصلين الذين توقعوا البنية الأصلية.
المتغيرات المؤقتة والتعليمات البرمجية ذاتية التوثيق
إن قرار استبدال متغير مؤقت باستعلام هو في جوهره قرار يتعلق بما يجب أن يوضحه الكود. توضح المتغيرات المؤقتة تفاصيل التنفيذ: هذه هي العملية الحسابية التي أجريتها للحصول على هذه القيمة. بينما توضح دوال الاستعلام نطاق العمل: هذا هو معنى هذه القيمة. في فئة الطلب، basePrice() يخبر القارئ أن هذا المفهوم موجود في هذا المجال. double x = quantity * itemPrice يشرح للقارئ عملية حسابية.
مع تطور الشيفرة البرمجية، تحتاج مفاهيم المجال إلى بيئات مستقرة. قد تتغير عملية حسابية مضمنة في متغير مؤقت، أو تُكرر في عدة دوال، أو يُساء فهمها من قِبل المطور التالي الذي يقرأها. أما دالة الاستعلام المسماة، فيمكن العثور عليها واختبارها وتوثيقها وتطويرها بشكل مدروس. هذا الاستقرار، في جميع المواضع التي تتطلب هذه العملية الحسابية وبين جميع المطورين الذين سيعملون عليها، هو ما يجعل استبدال المتغير المؤقت بالاستعلام أكثر من مجرد تغيير في الصياغة. إنه قرار يتعلق بكيفية توصيل قاعدة الشيفرة البرمجية للمشكلة التي تحلها.