البرمجة الأمرية مقابل البرمجة التصريحية: دليل شامل لفهم الفروقات الجوهرية

دقائق القراءة: 4

بصفتي مدربًا في مجال البرمجة، تقع على عاتقي مسؤولية تمكين المبرمجين من التفكير بأساليب مبتكرة. يحدث تحول كبير في طريقة التفكير عندما ننتقل من نموذج البرمجة الأمرية (Imperative Programming) إلى البرمجة التصريحية (Declarative Programming). بعد أن يتقن طلابي أساسيات لغة JavaScript، ننتقل إلى استكشاف البرمجة الوظيفية (Functional Programming) والأساليب المتاحة للمصفوفات (array methods) التي تُستخدم في نمط البرمجة التصريحية. هذه المرحلة هي التي تشعل شرارة الإبداع في أذهانهم، وتجعلهم يرون الكود بمنظور جديد تمامًا.

صورة توضيحية لقطع حلوى المارشميلو تذوب على النار، ترمز لتحول الأفكار في البرمجة

ما هي البرمجة الأمرية (Imperative Programming)؟

كمبتدئ في عالم البرمجة، من المرجح أنك قد قمت بمعظم كتاباتك البرمجية بأسلوب أمري. في هذا النمط، تقوم بتوجيه الكمبيوتر بمجموعة محددة من التعليمات خطوة بخطوة، ويقوم الكمبيوتر بتنفيذ ما تطلبه بتسلسل منطقي وسهل المتابعة.

لنتخيل أن لدينا قائمة بكلمات المرور الأكثر شيوعًا واستخدامًا عالميًا:

const passwords = [
  "123456",
  "password",
  "admin",
  "freecodecamp",
  "mypassword123",
];

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

باستخدام الأسلوب الأمري، سنكتب الكود كالتالي:

// باستخدام الثابت passwords المذكور أعلاه
let longPasswords = [];
for (let i = 0; i < passwords.length; i++) {
  const password = passwords[i];
  if (password.length >= 9) {
    longPasswords.push(password);
  }
}
console.log(longPasswords); // يطبع: ["freecodecamp", "mypassword123"]

في هذا المثال، نقوم بإنشاء قائمة فارغة تُسمى longPasswords. ثم نكتب حلقة تكرارية (for loop) ستعمل بعدد المرات التي تحتويها قائمة passwords الأصلية. في كل تكرار، نحصل على كلمة المرور في الفهرس (index) الحالي للحلقة. بعد ذلك، نتحقق مما إذا كانت كلمة المرور هذه تتكون من 9 أحرف أو أكثر. إذا كان الشرط صحيحًا، نضيفها إلى قائمة longPasswords.

تكمن إحدى نقاط قوة البرمجة الأمرية في سهولة فهمها وتتبعها. فمثل الكمبيوتر، يمكننا متابعة كل خطوة على حدة بشكل مباشر وواضح.

صورة توضيحية لعدة خطوات متسلسلة، ترمز إلى طبيعة البرمجة الأمرية

ما هي البرمجة التصريحية (Declarative Programming)؟

هناك طريقة أخرى للتفكير في البرمجة، وهي التركيز على تعريف “ماذا” نريد تحقيقه بدلاً من “كيف” نصل إليه. هذا هو جوهر البرمجة التصريحية (Declarative Programming). كلا النمطان، الأمري والتصريحي، يهدفان إلى تحقيق نفس الأهداف، لكنهما يمثلان طريقتين مختلفتين للتفكير في الكود.

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

لذا، بدلاً من إعطاء الكمبيوتر تعليمات تفصيلية خطوة بخطوة، نقوم بالتصريح عما نريده، ونُسند هذه الرغبة إلى نتيجة عملية معينة. لنعد إلى مثال كلمات المرور الطويلة:

// باستخدام الثابت passwords المذكور أعلاه
const longPasswords = passwords.filter(password => password.length >= 9);
console.log(longPasswords); // يطبع: ["freecodecamp", "mypassword123"]

هنا، يتم تعريف (أو التصريح عن) قائمة longPasswords على أنها قائمة passwords التي تم تصفيتها (filtered) لتشمل فقط كلمات المرور التي تتكون من 9 أحرف أو أكثر. تمكننا أساليب البرمجة الوظيفية في JavaScript من التصريح عن الأشياء بوضوح:

  • هذه قائمة بكلمات المرور.
  • هذه قائمة بكلمات المرور الطويلة فقط (بعد استخدام filter).
  • هذه قائمة بكلمات المرور مع معرفات (بعد استخدام map).
  • هذه كلمة مرور واحدة (بعد استخدام find).

إحدى نقاط قوة البرمجة التصريحية هي أنها تجبرنا على التفكير في “ماذا نريد” أولاً. ففي تسمية هذه الكيانات الجديدة، يصبح الكود الخاص بنا معبرًا وواضحًا. وعندما يأتي مطورون آخرون للاطلاع على الكود، يمكنهم العثور على الأخطاء بسهولة أكبر. على سبيل المثال، قد يقولون: “لقد أطلقت على هذا المتغير اسم index مما يجعلني أتوقع رقمًا، لكنني أرى أنه نتيجة لدالة filter التي تعيد مصفوفة. ما هو الغرض من ذلك؟” هذا يبرز أهمية التسمية الواضحة التي تعكس الغرض من المتغير.

صورة لامرأة تعمل على الحاسوب في المنزل، ترمز إلى التركيز والإبداع في البرمجة

الخلاصة التقنية

في الختام، بينما توفر البرمجة الأمرية مسارًا واضحًا ومباشرًا للمبتدئين من خلال توجيه الكمبيوتر خطوة بخطوة، فإن البرمجة التصريحية تقدم نهجًا أكثر تجريدًا وفعالية، يركز على “ماذا” نريد تحقيقه بدلاً من “كيف”. هذا التحول في التفكير يشجع على كتابة كود أكثر نظافة، قابلية للقراءة، وأسهل في الصيانة والتوسع.

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *