3.1الإجراءات المحلية والعامة ومجموعات الإجراءات
الأساسي في 30 ثانية
- الإجراء كتلة مسمّاة قابلة لإعادة الاستخدام: محلي في نافذة، أو عام على مستوى المشروع، أو مُجمّع في مجموعة حسب الموضوع.
- الوسائط وقيمة الإرجاع تجعل الإجراء عامًّا؛ التمرير بالقيمة يعمل على نسخة، والتمرير بالمرجع يعدّل الأصل.
- إجراء واحد = مسؤولية واحدة واسم واضح؛ نحدّ من المتغيرات العامة ونحوّل كل نسخ ولصق إلى إجراء.
حالة مصغّرة متسلسلة — ياسين يجمع حسابات إدارته
يطوّر ياسين تطبيق إدارة شركة صغيرة لتجارة المعدات الكهربائية في وهران: عملاء، منتجات، طلبات، فواتير ومخزون. لقد نسخ ولصق حساب خصم الوفاء في ثلاث شاشات، وكل تغيير في النسبة يفرض عليه التصحيح ثلاث مرات. ينشئ CalculeRemiseFidelite وCalculeMontantTTC كإجراءات عامة، مجمّعة في مجموعة GestionCommerciale. في المقابل، يبقى RéinitialiseSaisie إجراءً محليًا في نافذة الطلب، لأنه لا يُستخدم إلا هناك. كما يستبدل متغيراته العامة بوسائط وقيم إرجاع. ويسجّل المبدأ: التكرار = إجراء، النطاق حسب الاستخدام، والمجموعة حسب الموضوع.
حالة مستقلة لهذا القسم: تعود في الدرس والمخطط والسيناريو وتحدي 48 ساعة في القسم 3.1.
1. ثلاثة نطاقات، ثلاث استخدامات
الإجراء كتلة شيفرة مسمّاة وقابلة لإعادة الاستخدام: نكتبها مرة واحدة ونستدعيها بقدر ما يلزم. ويعتمد نطاقها على مكان الإعلان عنها. الإجراء المحلي ينتمي إلى نافذة أو تقرير: لا يُستخدم إلا في تلك الشاشة. أما الإجراء العام فيُعلن على مستوى المشروع ويكون متاحًا في كل مكان: وهناك تعيش قواعد الأعمال القابلة لإعادة الاستخدام. ومجموعة الإجراءات تجمع إجراءات حسب الموضوع (حسابات تجارية، أدوات تواريخ، الوصول إلى خدمة): وهو التنظيم الطبيعي لمشروع ينمو.
2. الوسائط، القيمة والمرجع
يستقبل الإجراء وسائط — البيانات التي يحتاجها — ويمكنه إرجاع قيمة: ويُسمّى عندئذ غالبًا دالة. التمرير بالقيمة ينقل نسخة: يمكن للإجراء تعديل وسيطه دون المساس بالمتغير الأصلي. أما التمرير بالمرجع فينقل المتغير نفسه: ويمكن للإجراء تعديله. والخلط بينهما مصدر كلاسيكي للأخطاء، خصوصًا حين يظن ياسين أن المجموع قد حُدّث بينما كان يعمل على نسخة.
3. الجودة: مسؤولية واحدة، اسم واحد
الإجراء الجيد يفعل شيئًا واحدًا ويحمل اسمًا واضحًا يصفه: CalculeMontantTTC، ControleCodePostal. يبقى قصيرًا، ويتلقى ما يحتاجه عبر الوسائط، ويعيد نتيجته. ونحدّ من المتغيرات العامة، لأن أي شاشة يمكنها تعديلها وجعل السلوك غير متوقع. وأخيرًا، بمجرد أن يستعد ياسين لـنسخ ولصق شيفرة، يحوّلها إلى إجراء: فهذه أوثق إشارة.
🔎 مثال ملموس — 🔎 مثال ملموس — إجراؤان عامان وحساب واحد
يجمع ياسين القواعد التجارية في مجموعة GestionCommerciale:
// Collection GestionCommerciale — procédures globales
PROCEDURE CalculeMontantTTC(nMontantHT est un monetaire, nTauxTVA est un reel = 19)
RENVOIE nMontantHT * (1 + nTauxTVA / 100)
PROCEDURE CalculeRemiseFidelite(nCA est un monetaire, nAnciennete est un entier)
SI nAnciennete >= 5 ALORS
RENVOIE nCA * 0.05
FIN
RENVOIE 0
// Fenêtre FicheCommande : appel explicite, sans variable globale
nTTC est un monetaire = CalculeMontantTTC(SAI_MontantHT, 19)
nRemise est un monetaire = CalculeRemiseFidelite(CLI_CA, CLI_Anciennete)
القراءة: تُكتب القاعدة مرة واحدة وتُستدعى من أي شاشة.
الدرس: الوسائط والإرجاع توثّقان الاعتماد؛ لا متغير عام خفي.
مفردات القسم
- إجراء
- كتلة شيفرة مسمّاة قابلة لإعادة الاستخدام، تُكتب مرة وتُستدعى بقدر ما يلزم.
مثال بسيط: يستدعي ياسين CalculeMontantTTC من نافذة الطلب ونافذة الفاتورة.
ما ليس كذلك: شيفرة منسوخة حرفيًا في ثلاثة أحداث مختلفة.
رد فعل: تكرار يجب حذفه → إجراء.
- إجراء عام
- إجراء مُعلن على مستوى المشروع ومتاح من كل الشاشات والمعالجات.
مثال بسيط: CalculeRemiseFidelite يعيش في مجموعة عامة.
ما ليس كذلك: إجراء مُعلن في نافذة واحدة وغير مرئي في غيرها.
رد فعل: قاعدة تُستخدم في كل مكان → إجراء عام.
- مجموعة إجراءات
- عنصر من المشروع يجمع إجراءات حسب الموضوع لتنظيم مشروع ينمو.
مثال بسيط: GestionCommerciale تجمع حسابات الخصم والرسم على القيمة المضافة والنقل.
ما ليس كذلك: إجراءات مبعثرة دون تجميع موضوعي.
رد فعل: التنظيم حسب الموضوع → مجموعة.
- التمرير بالقيمة
- نقل نسخة من الوسيط: لا يعدّل الإجراء المتغير الأصلي.
مثال بسيط: يمرّر ياسين مبلغًا إلى إجراء حساب دون المساس بالإدخال.
ما ليس كذلك: إجراء يحدّث مباشرة متغير المستدعي.
رد فعل: الأصل سليم → تمرير بالقيمة.
- التمرير بالمرجع
- نقل المتغير نفسه: يمكن للإجراء تعديل القيمة الأصلية.
مثال بسيط: يجعل ياسين إجراءً يملأ مصفوفة أسطر عبر مرجع.
ما ليس كذلك: نسخة محلية تضيع في نهاية الإجراء.
رد فعل: تعديل الأصل → تمرير بالمرجع.
في التطبيق — عمليًا — هيكلة الشيفرة في إجراءات
- حدّد معالجة منسوخة ولصوقة (أو على وشك ذلك): فهذه إشارة إلى وجوب تحوّلها إلى إجراء، كما فعل ياسين.
- أنشئ إجراءً عامًّا إذا كانت القاعدة تُستخدم في عدة شاشات، ومحليًا إذا كانت تخص نافذة واحدة.
- أعطه وسائط وقيمة إرجاع بدلًا من جعله يعتمد على متغيرات عامة.
- جمّع الإجراءات حسب الموضوع في مجموعات، بأسماء واضحة تصف ما تفعله.
سيناريو خطوة بخطوة — جمّع الشيفرة كما يفعل ياسين (4 دقائق)
1) ابحث عن حساب أو تحقق منسوخ في عدة شاشات. 2) قرّر النطاق: عام للاستخدام العابر، ومحلي لشاشة واحدة. 3) اكتب الإجراء بوسائطه وقيمة إرجاعه. 4) ضعه في مجموعة موضوعية باسم واضح. 5) استبدل النسخ باستدعاءات وتحقق من عدم وجود متغير عام يحمل الحالة.
احتفظ بهذا المبدأ: إذا كنت على وشك النسخ واللصق، توقّف وأنشئ إجراءً.
قالب للنسخ واللصق — بطاقة الإجراءات عند ياسين
الإشارة : تكرار، طول، تعقيد، حاجة إلى الاختبار
النطاق : محلي (نافذة واحدة) / عام (كل المشروع)
المجموعة : التجميع حسب الموضوع (تجاري، تواريخ، خدمات)
الوسائط : قيمة (نسخة) / مرجع (يعدّل الأصل)
الجودة : مسؤولية واحدة، اسم واضح، قليل من المتغيرات العامة
خصم منسوخ ثلاث مرات
ينشئ ياسين CalculeRemiseFidelite كإجراء عام: تصحيح واحد يكفي من الآن.
تحقق خاص بشاشة
يبقي ياسين ControleSaisieCommande إجراءً محليًا في نافذة الطلب.
مجموع غير محدَّث
ظنّ ياسين أنه يعدّل الأصل: فمرّر الوسيط بالمرجع وأصلح الخطأ.
إجراءات مبعثرة
يجمع ياسين الحسابات والتواريخ والتصديرات في ثلاث مجموعات واضحة للإدارة.
✓ ممارسات جيدة
- حوّل كل نسخ ولصق إلى إجراء.
- اختر النطاق حسب الاستخدام الفعلي.
- فضّل الوسائط والإرجاع على المتغيرات العامة.
✗ أخطاء شائعة
- وضع قاعدة عابرة في إجراء محلي.
- الخلط بين التمرير بالقيمة والتمرير بالمرجع.
- تكديس متغيرات عامة قابلة للتعديل من كل مكان.
النقاط الأساسية
- الإجراء كتلة مسمّاة قابلة لإعادة الاستخدام تلغي التكرار.
- محلي (نافذة)، عام (كل المشروع) أو مجمّع في مجموعة حسب الموضوع.
- التمرير بالقيمة ينسخ؛ والتمرير بالمرجع يعدّل الأصل.
- مسؤولية واحدة لكل إجراء، واسم واضح، وقليل من المتغيرات العامة.
تحدي 48 ساعة — طبّقه غدًا
كما يفعل ياسين، افتح تطبيقك وحدّد حسابًا منسوخًا ولصوقًا في شاشتين على الأقل. حوّله إلى إجراء عام بوسائط وقيمة إرجاع، ثم ضعه في مجموعة ذات اسم واضح. تحقق أخيرًا مما إذا كنت تحتاج تمريرًا بالقيمة أو بالمرجع، واحذف المتغير العام الذي أصبح غير ضروري.
- أستطيع شرح الفرق بين الإجراء المحلي والعام.
- أعرف كيف أنشئ مجموعة إجراءات حسب الموضوع.
- أميّز بين التمرير بالقيمة والتمرير بالمرجع.
أسئلة شائعة
متى يجب إنشاء إجراء بدلًا من كتابة الشيفرة في مكانها؟
بمجرد أن تُستخدم الشيفرة عدة مرات، أو تصبح المعالجة طويلة، أو تستحق كتلة اسمًا لتُفهم. تبقى الإشارة الأولى هي التكرار: إذا نسخت ولصقت، أو كنت على وشك ذلك، فحوّلها إلى إجراء. والقاعدة التجارية — حساب الرسم على القيمة المضافة، خصم الوفاء، التحقق من رمز — ستُستخدم حتمًا في مكان آخر: شاشة أو تقرير أو استيراد أو خدمة ويب.
لماذا يجب الحد من المتغيرات العامة؟
لأن المتغير العام يمكن قراءته وتعديله من أي مكان وفي أي لحظة: فتصبح الشيفرة غير متوقعة والأخطاء صعبة التحديد جدًا. والإجراء الذي يعتمد على متغير عام يخفي هذا الاعتماد في توقيعه. فضّل الوسائط وقيم الإرجاع: فيصبح الإجراء قابلًا لإعادة الاستخدام والاختبار والتوقع.
أي إشارة تفرض تحويل الشيفرة إلى إجراء؟