مستحيل تكون مبرمج ولا تعرف الفرق بين OOP و Functional

اذا كنت مطوراً فمن المؤكد أنك سمعت بهذين المصطلحين من قبل…

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

ماذا يعني نمط (أو نموذج) البرمجة “Programming Paradigm”؟

نمط البرمجة (مثلما حزرت :grin:) هي طريقة معينة للبرمجة وأيضاً طريقة لتصنيف لغات البرمجة بناءً على مزاياها، يمكن أن تحتوي لغة البرمجة على نمط واحد أو أكثر (multi-paradigm language) كما هو الحل في لغات البرمجة المستخدمة حالياً.

يوجد الكثير من أنماط البرمجة ولكن بشكل عام تنقسم هذه الأنماط إلى نمطين رئيسيين وهما:

1. البرمجة الأمرية (Imperative Programming Paradigm):

هذا النمط عبارة عن كتابة البرنامج في سلسلة من الأسطر البرمجية المتتالية. ترتيب هذه الأسطر مهم جداً في هذا النمط.

لتفهم هذا النمط أكثر، دعنا نقوم بشرحه بمثال واقعي:

لنفترض أنك تريد الذهاب إلى مطعم يقوم بإعداد البيتزا. فتقوم بسؤال شخص ما عن مكان هذا المطعم؟

فيرد عليك بالمكان بالضبط:

  1. تقدم نحو الأمام إلى أن تصل إلى تقاطع طرق
  2. انعطف يساراً
  3. تقدم مسافة 100 متر

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

من خصائص هذا النمط أن حالة البرنامج (state) ربما تتغير، البيانات تكون قابلة للتعديل في هذا النمط (mutable data) وبالإمكان وجود تأثيرات جانبية (Side effects) في البرنامج ومثل ما قلنا سابقاً سيكون الترتيب مهماً أيضاً.

2. البرمجة التعريفية (Declarative Programming Paradigm):

نمط البرمجة التعريفية على نقيض نمط البرمجة الأمرية تكمن الفكرة فيه على “ما الذي ستقوم به؟”

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

خصائص هذا النمط عكس النمط السابق. أي حالة البرنامج لن تتغير، البيانات يجب أن تكون غير قابلة للتعديل (Immutable data) وبالتأكيد لن يكون هناك تأثيرات جانبية في البرنامج وأخيراً الترتيب غير مهم أيضاً.


الآن بعد هذه المقدمة البسيطة. يا ترى مالفرق بين نمط البرمجة كائنية التوجه (Object Oriented Programming) و نمط البرمجة الوظيفية (Functional Programming) وماعلاقة هذين النمطين بما شرحناه مسبقاً :thinking:؟

أولاً: البرمجة كائنية التوجه:

هذا النمط هو شكل من أشكال البرمجة الأمرية، أي به كل خصائص البرمجة الأمرية مع مفاهيم أخرى سنتعرف عليها الآن.

في هذا النمط كل شي عبارة عن كائن (Object)، وكل كائن يعتبر نسخة لما يسمى ب “فئة” (Class)، هذا الكائن لديه بيانات تسمى بـ “حقول” أو “خصائص” (fields / attributes) والوظائف الخاصة به (أي الدوال) تسمى ب “أساليب” (methods).

يمكن تصور الفئة على أنها “كلب” :dog2: والكائن على أنه “بوبي” مثل الصورة التالية:

51085253_2226517887609001_6699475178700668928_n

بالإضافة إلى هذه المكونات، هناك مفاهيم أخرى وهي:

  • التجريد (Abstraction)
  • التغليف (Encapsulation)
  • الوراثة (Inheritance)
  • تعدد الأشكال (Polymorphism)

كل هذه الأشياء تساعدنا في كتابة برامج قابلة للتعديل والتطوير وأيضاً سهلة القراءة.

ثانياً: البرمجة الوظيفية:

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

أيضاً تعتبر الدالة في هذا النمط “مواطن من الدرجة الأولى” (First-class Citizen)، يعني هذا أنه يمكنك معاملة الدوال كأي شيء آخر في اللغة، مثل حفظها في متغير، وضعها في معاملات الدوال، إرجاعها في الدوال … الخ

let sum = function(a, b) {
    return a + b;
}

اضافة على هذا، الدوال في هذا النمط تسمى بـ “الدوال النقية” (Pure Functions)، فكيف نعرف أن الدالة نقية أم لا؟

يجب أن تقوم بإرجاع نفس النتيجة دائماً لنفس المعاملات.

يجب أن لا تحتوي على تأثيرات جانبية (Side effects)، بحيث أنها لا تقوم بتعديل أي شيء آخر خارج الدالة.

البرمجة الوظيفية ستمكننا من جعل الكود سهل التعديل وقابل لإعادة الاستخدام والإختبار وأقل عرضة للأخطاء :v:

لا يوجد نمط أفضل من آخر!

بالنهاية لا يوجد نمط أفضل من الآخر، فبغض النظر عن انتشار نمط البرمجة الوظيفية بين المطورين في هذه الأوقات لكن هذا لا يعني أننا يجب أن نتخلص من مفهوم البرمجة كائنية التوجه.

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

ماهو النمط الذي تفضله أنت؟ وتستعمله بشكل اعتيادي؟

22 Likes

المقال الفريد من نوعة في المحتوى العربي :clap:

تسلم أيمن إستفدت منه وإستمتعت بقرأته

4 Likes

فعلا لا يوجد نمط افضل من اخر على الاطلاق, ولكن في مجالات معينه ربما يفضل استخدام نمط معين بدلامن الاخر للاستفادة من ميزاته.
مثلا البرمجه الكائنيه شائعه الاستخدام في بناء تطبيقات الويب, لاسباب منها:

  • سرعة تطوير التطبيقات

  • اعادة استخدام الاكواد

  • امكانية التخصيص والتوسيع

  • سهولة الصيانة

6 Likes

:heart_eyes: سعيد أنه أعجبك محمد

2 Likes

نعم بكل تأكيد. كل نمط له استعمالاته :ok_hand:

2 Likes

صراحة انا معجب بصياغتك للمصطلحات البرمجية باللغة العربية!
ما شاء الله يا أيمن!
استفدت كثيرا :rose:
استمر

3 Likes

شكراً لك نصر :heart: :smile:

3 Likes

مقال رائع يا أيمن
شكرا جزيلا

2 Likes

العفو مخلوف :smiley:

1 Like

بكل صراحة لم أقرأ محتوى عربي إلى غاية الآن بهاته الجودة :heart_eyes: ماشاء الله أبدعت برو

2 Likes

جودة المقالة:

quality

3 Likes

:heart_eyes::heart_eyes: شكراا هشام

1 Like

:joy: :joy: :joy:

1 Like

شكرا جزيلا لك اخي :+1::heart:

2 Likes

أبدعت أستاذ أيمن, كل الشكر والتقدير لك.

2 Likes

العفو أخي :heart:

1 Like

شكراا مالك :heart_eyes: :heart:

موضوع جميل المفاهيم مشروحة بشكل جيد احسنت @Ayman97 :ok_hand: لكن هذا الموضوع قديم نريدك أن تظهر مرة ثانية فى موضوع آخر اكثر من رائع :smile:

2 Likes

شكراا أخي عبد الله. سيكون في جديد بعون الله :grin::grin:

1 Like

دائماً رائع
دائماً متميز يا صديقي
رائع في اسلوب شرحك وإيصال المعلومة بأسهل مايمكن
ومتميز في ذكر المصطلحات الأنجليزية ونظيرها بالعربية
فشكرأ لك :tulip: :tulip:

2 Likes