البرمجة

أساسيات البرمجة الشرطية

مقدمة

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


1. ماهيّة البرمجة الشرطية

تنطلق البرمجة الشرطية من مبدأ “إذا حدث شرط X فافعل Y، وإلا فافعل Z”. هذا البناء المنطقي‑الرياضي مستمدٌّ من الجبر البولياني حيث تتخذ المتغيرات إحدى قيمتين: صواب (True) أو خطأ (False). تُترجم القرارات في الحواسيب إلى عمليات كهربائية ثنائية لا تنفصل عن هذا الجوهر البولياني.

1‑1. التفرّع (Branching)

يشير مصطلح التفرّع إلى تغيّر مسار تنفيذ الخوارزمية عند نقطة معيّنة تبعًا لتقييم شرطٍ منطقي. كلُّ فرعٍ يمثّل احتمالًا سلوكيًا مختلفًا وقد يتضمّن فروعًا متداخلة، مولِّدًا شجرة قرارات (Decision Tree) بالمعنى البرمجي.

1‑2. الشرط مقابل التكرار

في حين يوفّر التكرار (Loops) آليّةً لإعادة تنفيذ كتلة أوامر عدّة مرّات، فإن الشرطية تتحكم في ما إذا كانت هذه الكتلة ستُنفَّذ من الأصل أو أي كتلة بديلة ستُنفَّذ. وغالبًا ما يتزاوج الشرط والتكرار معًا لتشكيل أنماط خوارزمية ثرية مثل حلقة الشرط المُسبق (while) أو الحلقة الشرطية المُحصّنة (do‑while).


2. المكوّنات الأساسية للعبارة الشرطية

المكوّن الوصف مثال في Python مثال في JavaScript
المتغير (Variable) وعاء لتخزين قيمة يمكن أن تتغير temp = 37 let temp = 37;
معامل المقارنة (Comparator) يختبر علاقة بين قيمتين temp > 38 temp > 38
معامل منطقي (Logical Operator) يركّب شروطًا مركّبة age > 18 and citizen age > 18 && citizen
كتلة الأوامر (Block) تعليمات تُنفَّذ إذا تحقّق الشرط print("Fever") console.log("Fever")

3. العبارات الشرطية الأساسية في اللغات الشائعة

3‑1. ‎if و‎else

تُعدّ ‎if‎‎ حجر الأساس. يصحبها ‎else‎‎ لتنفيذ مسار بديل إن خاب الشرط:

python
if balance >= withdrawal: balance -= withdrawal else: print("رصيد غير كافٍ")
javascript
if (balance >= withdrawal) { balance -= withdrawal; } else { console.log("رصيد غير كافٍ"); }

3‑2. ‎else if‎ / ‎elif

تتيح فحصَ عدة شروط متتابعة دون تداخل عشوائي للفروع:

python
if score >= 90: grade = "A" elif score >= 80: grade = "B" else: grade = "C"

3‑3. ‎switch‎ / ‎match

في C / Java / JavaScript

c
switch(day) { case 1: printf("Mon"); break; case 2: printf("Tue"); break; default: printf("Weekend"); }

في Python 3.10+

python
match command.split(): case ["go", direction]: move(direction) case ["quit"]: sys.exit()

4. الأنماط المتقدّمة في البرمجة الشرطية

4‑1. التعبير الثلاثي (Ternary Expression)

يقلّص كتلة ‎if‑else‎ إلى تعبيرٍ واحد:

javascript
let status = (age >= 18) ? "Adult" : "Minor";

4‑2. معامل دمج القيم الفارغة (Null‑Coalescing)

يقدِّم قيمة احتياطية إذا كانت الأولى nil / null / undefined:

csharp
string name = inputName ?? "Guest";

4‑3. الحارس (Guard Clause)

أسلوبٌ يُقلّل التداخل ويُسهِّل القراءة بإنهاء الدالة مبكّرًا إذا لم يحز الشرط المطلوب:

python
def divide(a, b): if b == 0: return None return a / b

4‑4. مطابقة الأنماط (Pattern Matching)

تجمع قوة التفرع مع تفكيك البنى المركّبة:

rust
match point { Point { x, y: 0 } => println!("On X‑axis at {}", x), Point { x: 0, y } => println!("On Y‑axis at {}", y), _ => println!("Elsewhere"), }

5. أفضل الممارسات لتصميم منطق شرطي رشيق

  1. بسّط الشروط المركّبة بفصلها إلى دوال أو متغيرات وصفية.

  2. ابقِ الفروع متناظرة قدر الإمكان للحفاظ على وضوح التدفق.

  3. تجنّب التداخل العميق (Pyramid of Doom) بالاستعانة بجمل الحارس أو بإعادة هيكلة الخوارزمية.

  4. استخدم الجداول (Lookup Tables) عندما تتحول سلسلة ‎else if‎ إلى قائمة عريضة من القيم الثابتة.

  5. اعزل المنطق الشرطي عن جوانب العرض (Separation of Concerns) حتى يسهل اختبار الوحدة.


6. الأخطاء الشائعة وكيفية تلافيها

  • التسوية (=) بدل المقارنة (==) في لغات مثل C وجافا سكريبت قبل الإصدار السادس.

  • إهمال ترتيب الشروط بحيث تُقيَّم القيم العامة قبل الخاصة فيؤدي ذلك إلى ظلٍّ شرطيّ ميت.

  • مضاعفة النفي (double negation) الذي يعقّد القراءة (!(x == y) مقابل x != y).

  • استخدام القيم السحرية (Magic Numbers) داخل المقارنة بدلا من تعريف ثوابت معنونة.


7. تطبيقات عملية: من الخوارزمية إلى الواقع

السيناريو الشرط القرار
مصادقة المستخدم password_hash == stored_hash السماح بالدخول
نظام إنذار حريق temperature > 55 °C أو smoke_detected تفعيل الرشاشات
إدارة طاقة هاتف battery_level < 20% && not charging تفعيل وضع توفير الطاقة
لعبة فيديو player.health <= 0 إظهار شاشة “Game Over”

8. مقارنة بناء الجمل الشرطية في لغات مختارة

اللغة كلمة المفتاح الأساسية بنية التفرّع التعبير الثلاثي دعم switch/match
C if, else أقواس معقوفة ?: switch
Python if, elif, else مسافة بادئة x if c else y match منذ 3.10
JavaScript if, else if, else أقواس معقوفة ?: switch
Rust if, else if, else أقواس معقوفة if c {x} else {y} match متقدم
Haskell if, then, else تمايز مسافة Guard Syntax case ... of

9. اختبار المنطق الشرطي

يُعَدّ اختبار الوحدات (Unit Testing) خطّ الدفاع الأول ضدّ الأخطاء المنطقية. تبنِّ العديدُ من الأطر (Jest، PyTest، JUnit) نمط الجدول المُعاملاتي (Parameterized Tests) لاختبار المتغيرات الحرجة كافة بطريقة مُعتمدة.

python
import pytest @pytest.mark.parametrize("age,expected", [(17,"Minor"),(18,"Adult")]) def test_classify(age, expected): assert classify_age(age) == expected

10. تحسين الأداء في الفروع

  • التنبؤ الفرعي (Branch Prediction): ترتّب الشروط بحيث يكون المسار الأكثر شيوعًا أولًا؛ تُفيد هذه الممارسة المعالجات الحديثة في تقليل فقزات التجزئة (Pipeline Stalls).

  • تقليل الأخطاء السياقية (Context Switching): عبر دمج الشروط المتصلة لتجنّب الحسابات المتكررة.

  • الاستعاضة بالعمليات الشعاعية (Vectorized Operations): في الحوسبة العلمية باستخدام مكتبات مثل NumPy، حيث يُستبدَل التفرّع بمعالجة دفعيّة.


خاتمة

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


المراجع

  1. Python Documentation – Control Flow Tools (Python Software Foundation).

  2. MDN Web Docs – Control Flow and Error Handling in JavaScript (Mozilla).