ما هي البرمجة الوظيفية؟
⚡ ملخص ذكي
البرمجة الوظيفية هي طريقة لبناء البرمجيات من خلال تركيب دوال خالصة، وتجنب الحالة المشتركة والبيانات القابلة للتغيير. وهي تركز على التعبيرات بدلاً من التعليمات، بحيث يعتمد ناتج الدالة فقط على مدخلاتها، مما يجعل البرامج قابلة للتنبؤ والاختبار.

ما هي البرمجة الوظيفية؟
البرمجة الوظيفية (وتُسمى أيضًا FP) هي طريقة للتفكير في بناء البرمجيات من خلال إنشاء دوال خالصة. وهي تتجنب مفاهيم الحالة المشتركة والبيانات القابلة للتغيير الموجودة في البرمجة الكائنية التوجه.
تُركز اللغات الوظيفية على التعبيرات والتصريحات بدلاً من تنفيذ التعليمات. لذلك، وعلى عكس الإجراءات الأخرى التي تعتمد على حالة محلية أو عامة، فإن قيمة المخرجات في اللغات الوظيفية تعتمد فقط على الوسائط المُمررة إلى الدالة.
خصائص البرمجة الوظيفية
- تركز طريقة البرمجة الوظيفية على النتائج، وليس على العملية.
- ينصب التركيز على ما سيتم حسابه.
- البيانات غير قابلة للتغيير.
- تقوم البرمجة الوظيفية بتقسيم المشكلة إلى دوال.
- يعتمد هذا النظام على مفهوم الدوال الرياضية التي تستخدم التعبيرات الشرطية والتكرار لإجراء الحساب.
- لا يدعم التكرار مثل عبارات الحلقة والعبارات الشرطية مثل If-Else.
تاريخ البرمجة الوظيفية
- يُعد حساب لامدا أساس البرمجة الوظيفية. وقد تم تطويره في ثلاثينيات القرن العشرين للتطبيق الوظيفي والتعريف والاستدعاء الذاتي.
- كانت لغة LISP أول لغة برمجة وظيفية. صممها مكارثي عام 1960.
- في أواخر السبعينيات، قام باحثون في جامعة إدنبرة بتعريف لغة ماتا (ML).
- في أوائل الثمانينيات، أضافت لغة هوب أنواع البيانات الجبرية للاستدعاء الذاتي والاستدلال المعادلاتي.
- في عام 2004، تم ابتكار لغة البرمجة الوظيفية "سكالا".
لغات البرمجة الوظيفية
يهدف أي لغة برمجة وظيفية إلى محاكاة الدوال الرياضية. ومع ذلك، فإن عملية الحساب الأساسية تختلف في البرمجة الوظيفية.
فيما يلي بعض من أبرز لغات البرمجة الوظيفية:
- هاسكل
- SML
- كلوجر
- سكالا
- إرلانج
- نظيف
- F#
- ML/OCaml Lisp/Scheme
- XSLT
- SQL
- الرياضيات
مصطلحات البرمجة الوظيفية الأساسية و Concepts
بيانات غير قابلة للتغيير
البيانات غير القابلة للتغيير تعني أنه يجب أن تكون قادراً بسهولة على إنشاء هياكل بيانات بدلاً من تعديل الهياكل الموجودة بالفعل.
الشفافية المرجعية
ينبغي للبرامج الوظيفية أن تُنفّذ العمليات كما لو كانت تُنفّذ للمرة الأولى. وبذلك، ستعرف ما قد حدث أو لم يحدث أثناء تنفيذ البرنامج، وآثاره الجانبية. في مصطلحات البرمجة الوظيفية، يُطلق على هذا اسم الشفافية المرجعية.
نمطية
يُحسّن التصميم المعياري الإنتاجية. إذ يُمكن برمجة الوحدات الصغيرة بسرعة، كما أنها قابلة لإعادة الاستخدام بشكل أكبر، مما يُؤدي حتمًا إلى تسريع تطوير البرامج. إضافةً إلى ذلك، يُمكن اختبار الوحدات بشكل منفصل، مما يُساعد على تقليل الوقت المُستغرق في اختبار الوحدات وتصحيح الأخطاء.
قابلية الصيانة
إن قابلية الصيانة مصطلح بسيط يعني أن برمجة FP أسهل في الصيانة، حيث لا تحتاج إلى القلق بشأن تغيير أي شيء عن طريق الخطأ خارج الوظيفة المحددة.
وظيفة من الدرجة الأولى
يُطلق مصطلح "الدالة من الدرجة الأولى" على كيانات لغات البرمجة التي لا تخضع لأي قيود على استخدامها. ولذلك، يمكن أن تظهر الدوال من الدرجة الأولى في أي مكان في البرنامج.
إغلاق
الإغلاق هو دالة داخلية يمكنها الوصول إلى متغيرات الدالة الأصلية، حتى بعد تنفيذ الدالة الأصلية.
وظائف ذات ترتيب أعلى
وظائف ذات ترتيب أعلى إما أن تأخذ وظائف أخرى كوسيطات أو ترجعها كنتائج.
تسمح الدوال ذات الرتبة العليا بالتطبيقات الجزئية أو ما يُعرف بالتطبيق الجزئي. تُطبّق هذه التقنية دالة على وسيطاتها واحدًا تلو الآخر، حيث يُعيد كل تطبيق دالة جديدة تقبل الوسيط التالي.
وظيفة نقية
"الوظيفة النقية" هي دالة يتم الإعلان عن مدخلاتها كمدخلات ولا يجب إخفاء أي منها. يتم الإعلان عن المخرجات أيضًا كمخرجات.
تعمل الدوال النقية على مُعاملاتها. ولا تكون فعّالة إذا لم تُرجع أي قيمة. علاوة على ذلك، فإنها تُعطي نفس الناتج للمُعاملات المُعطاة.
على سبيل المثال:
Function Pure(a,b) { return a+b; }
وظائف غير نقية
الدوال غير النقية هي عكس الدوال النقية تمامًا. فهي تحتوي على مدخلات أو مخرجات مخفية، ولذلك تُسمى غير نقية. لا يمكن استخدام الدوال غير النقية أو اختبارها بشكل منفصل لأنها تعتمد على دوال أخرى.
مثال
int z; function notPure(){ z = z+10; }
تكوين الوظيفة
تكوين الوظيفة هو الجمع بين وظيفتين أو أكثر لإنشاء وظيفة جديدة.
الدول المشتركة
تُعدّ الحالة المشتركة مفهومًا هامًا في البرمجة الكائنية التوجه. وتتمثل أساسًا في إضافة خصائص إلى الكائنات. على سبيل المثال، إذا كان القرص الصلب كائنًا، فيمكن إضافة سعة التخزين وحجم القرص كخصائص.
الآثار الجانبية
الآثار الجانبية هي أي تغييرات في حالة البرنامج تحدث خارج نطاق الدالة المُستدعاة. الهدف الأسمى لأي لغة برمجة وظيفية هو تقليل الآثار الجانبية إلى أدنى حد ممكن بفصلها عن باقي أجزاء البرنامج. في البرمجة الوظيفية، من الضروري عزل الآثار الجانبية عن منطق البرنامج الأساسي.
فوائد البرمجة الوظيفية
- يُتيح لك ذلك تجنب المشاكل والأخطاء المُربكة في الكود.
- أسهل في الاختبار والتنفيذ، واختبار الوحدة وتصحيح الأخطاء في البرمجة الوظيفية Code.
- المعالجة المتوازية والتزامن.
- نشر التعليمات البرمجية الساخنة وتحمل الأعطال.
- يوفر مرونة أفضل مع كود أقصر.
- زيادة إنتاجية المطور.
- يدعم الوظائف المتداخلة.
- البنيات الوظيفية مثل الخريطة والقوائم الكسولة، وما إلى ذلك.
- يسمح بالاستخدام الفعال لحساب التفاضل والتكامل لامدا.
حدود البرمجة الوظيفية
- إن نموذج البرمجة الوظيفية ليس سهلاً، لذا يصعب فهمه بالنسبة للمبتدئين.
- يصعب الحفاظ عليها لأن العديد من العناصر تتطور أثناء عملية البرمجة.
- يحتاج الأمر إلى الكثير من المحاكاة الساخرة وإعداد بيئي شامل.
- إعادة الاستخدام أمر معقد للغاية ويحتاج إلى إعادة هيكلة مستمرة.
- قد لا تمثل الكائنات المشكلة بشكل صحيح.
البرمجة الوظيفية مقابل البرمجة الشيئية
| البرمجة الوظيفية | OOP |
|---|---|
| يستخدم FP بيانات غير قابلة للتغيير. | يستخدم OOP البيانات القابلة للتغيير. |
| يتبع نموذجًا قائمًا على البرمجة التصريحية. | يتبع نموذج البرمجة الإجرائية. |
| ما يركز عليه هو: "ما الذي تقوم به في البرنامج". | ما يركز عليه هو: "كيف تقوم ببرمجتك؟" |
| يدعم البرمجة الموازية. | لا يوجد دعم للبرمجة المتوازية. |
| لا توجد آثار جانبية لوظائفه. | قد ينتج عن طريقة ما العديد من الآثار الجانبية. |
| يتم تنفيذ التحكم في التدفق باستخدام استدعاءات الوظائف واستدعاءات الوظائف مع العودية. | تتم عملية التحكم في التدفق باستخدام الحلقات والعبارات الشرطية. |
| ترتيب تنفيذ البيانات ليس مهمًا جدًا. | ترتيب تنفيذ البيانات مهم. |
| يدعم كلاً من "Abs"trac"tion over Data" و "Abstrac"السيطرة على السلوك". | يدعم فقط "Abs"trac"التحليل على البيانات". |

