ما هي البرمجة الوظيفية؟ البرنامج التعليمي مع المثال
ما هي البرمجة الوظيفية؟
البرمجة الوظيفية (وتسمى أيضًا FP) هي طريقة للتفكير في بناء البرمجيات من خلال إنشاء وظائف نقية. وهي تتجنب مفاهيم الحالة المشتركة والبيانات القابلة للتغيير التي لوحظت في البرمجة الموجهة للكائنات.
وتعتمد اللغات الوظيفية على العبارات والتصريحات بدلا من تنفيذ التصريحات. ولذلك، على عكس الإجراءات الأخرى التي تعتمد على حالة محلية أو عالمية، فإن إخراج القيمة في FP يعتمد فقط على الوسائط التي تم تمريرها إلى الوظيفة.
خصائص البرمجة الوظيفية
- تركز طريقة البرمجة الوظيفية على النتائج وليس على العملية
- يتم التركيز على ما يجب حسابه
- البيانات غير قابلة للتغيير
- البرمجة الوظيفية قم بتحليل المشكلة إلى "وظائف".
- إنه مبني على مفهوم الدوال الرياضية التي تستخدم التعبيرات الشرطية والتكرار لإجراء العمليات الحسابية
- لا يدعم التكرار مثل عبارات الحلقة والعبارات الشرطية مثل If-Else
تاريخ البرمجة الوظيفية
- الأساس للبرمجة الوظيفية هو حساب لامدا. تم تطويره في ثلاثينيات القرن العشرين للتطبيق الوظيفي والتعريف والتكرار
- كانت LISP أول لغة برمجة وظيفية. صممه مكارثي في عام 1960
- في أواخر السبعينيات، قام الباحثون في جامعة إدنبره بتعريف ML (اللغة الوصفية)
- في أوائل الثمانينيات، أضافت لغة الأمل أنواعًا من البيانات الجبرية للاستدلال التكراري والاستدلال المعادلة
- في عام 2004 تم ابتكار لغة وظيفية "سكالا".
لغات البرمجة الوظيفية
الهدف من أي لغة FP هو تقليد الوظائف الرياضية. ومع ذلك، فإن العملية الأساسية للحساب تختلف في البرمجة الوظيفية.
فيما يلي بعض أبرز لغات البرمجة الوظيفية:
- هاسكل
- SML
- كلوجر
- سكالا
- إرلانج
- نظيف
- F#
- ML/OCaml Lisp/Scheme
- XSLT
- SQL
- الرياضيات
مصطلحات البرمجة الوظيفية الأساسية و Concepts
بيانات غير قابلة للتغيير
تعني البيانات غير القابلة للتغيير أنه يجب عليك بسهولة إنشاء هياكل البيانات بدلاً من تعديل الهياكل الموجودة بالفعل.
الشفافية المرجعية
يجب أن تقوم البرامج الوظيفية بتنفيذ العمليات كما لو كانت تقوم بها للمرة الأولى. وبالتالي، ستعرف ما قد يحدث أو لا يحدث أثناء تنفيذ البرنامج، والآثار الجانبية المترتبة على ذلك. وفي مصطلح البرمجة الوظيفية، يُطلق على ذلك الشفافية المرجعية.
نمطية
التصميم المعياري يزيد من الإنتاجية. يمكن ترميز الوحدات الصغيرة بسرعة ولديها فرصة أكبر لإعادة الاستخدام مما يؤدي بالتأكيد إلى تطوير أسرع للبرامج. وبصرف النظر عن ذلك، يمكن اختبار الوحدات بشكل منفصل مما يساعدك على تقليل الوقت المستغرق في اختبار الوحدة وتصحيح الأخطاء.
قابلية الصيانة
تعد قابلية الصيانة مصطلحًا بسيطًا مما يعني أن صيانة برمجة FP أسهل حيث لا داعي للقلق بشأن تغيير أي شيء عن طريق الخطأ خارج الوظيفة المحددة.
وظيفة من الدرجة الأولى
"وظيفة من الدرجة الأولى" هي تعريف يُنسب إلى كيانات لغة البرمجة التي ليس لها أي قيود على استخدامها. لذلك، يمكن أن تظهر وظائف الدرجة الأولى في أي مكان في البرنامج.
إغلاق
الإغلاق هو وظيفة داخلية يمكنها الوصول إلى متغيرات الوظيفة الأصلية، حتى بعد تنفيذ الوظيفة الأصلية.
وظائف ذات ترتيب أعلى
وظائف ذات ترتيب أعلى إما أن تأخذ وظائف أخرى كوسيطات أو ترجعها كنتائج.
تسمح الوظائف ذات الترتيب العالي بالتطبيقات الجزئية أو الكاري. تطبق هذه التقنية دالة على وسيطاتها واحدة تلو الأخرى، حيث يقوم كل تطبيق بإرجاع دالة جديدة تقبل الوسيطة التالية.
وظيفة نقية
"الوظيفة النقية" هي دالة يتم الإعلان عن مدخلاتها كمدخلات ولا يجب إخفاء أي منها. يتم الإعلان عن المخرجات أيضًا كمخرجات.
تعمل الوظائف النقية وفقًا لمعاييرها. إنها ليست فعالة في حالة عدم إرجاع أي شيء. علاوة على ذلك، فهو يقدم نفس الإخراج للمعلمات المحددة
على سبيل المثال:
Function Pure(a,b) { return a+b; }
وظائف غير نقية
وظائف النجاسة هي عكس النقي تماما. لديهم مدخلات أو مخرجات مخفية؛ ويسمى نجساً. لا يمكن استخدام الوظائف غير النقية أو اختبارها بمعزل عن غيرها لأنها تحتوي على تبعيات.
مثال
int z; function notPure(){ z = z+10; }
تكوين الوظيفة
تكوين الوظيفة هو الجمع بين وظيفتين أو أكثر لإنشاء وظيفة جديدة.
الدول المشتركة
تعتبر الحالات المشتركة مفهومًا مهمًا في برمجة OOP. في الأساس، إنها تضيف خصائص إلى الكائنات. على سبيل المثال، إذا كان القرص الصلب عبارة عن كائن، فيمكن إضافة سعة التخزين وحجم القرص كخصائص.
الآثار الجانبية
الآثار الجانبية هي أي تغييرات في الحالة تحدث خارج وظيفة تسمى. الهدف الأكبر لأي لغة برمجة FP هو تقليل الآثار الجانبية، عن طريق فصلها عن بقية كود البرنامج. في برمجة FP، من المهم إزالة الآثار الجانبية من بقية منطق البرمجة الخاص بك.
فوائد البرمجة الوظيفية
- يسمح لك بتجنب المشاكل والأخطاء المربكة في الكود
- أسهل في اختبار وتنفيذ اختبار الوحدة وتصحيح كود FP.
- المعالجة المتوازية والتزامن
- نشر التعليمات البرمجية الساخنة والتسامح مع الخطأ
- يقدم نمطية أفضل مع رمز أقصر
- زيادة إنتاجية المطور
- يدعم الوظائف المتداخلة
- البنيات الوظيفية مثل الخريطة والقوائم الكسولة، وما إلى ذلك.
- يسمح بالاستخدام الفعال لحساب التفاضل والتكامل لامدا
حدود البرمجة الوظيفية
- نموذج البرمجة الوظيفية ليس سهلاً، لذلك يصعب فهمه للمبتدئين
- من الصعب الحفاظ على العديد من الكائنات تتطور أثناء الترميز
- يحتاج إلى الكثير من السخرية والإعداد البيئي الشامل
- إعادة الاستخدام معقدة للغاية وتحتاج إلى إعادة هيكلة مستمرة
- قد لا تمثل الكائنات المشكلة بشكل صحيح
البرمجة الوظيفية مقابل البرمجة الشيئية
البرمجة الوظيفية | OOP |
---|---|
يستخدم FP بيانات غير قابلة للتغيير. | يستخدم OOP البيانات القابلة للتغيير. |
يتبع النموذج القائم على البرمجة التعريفية. | يتبع نموذج البرمجة الحتمية. |
ما يركز عليه هو: "ما تفعله. في البرنامج." | ما يركز عليه هو "كيف تقوم ببرمجتك". |
يدعم البرمجة الموازية. | لا يوجد دعم للبرمجة الموازية. |
وظائفه ليس لها أي آثار جانبية. | الطريقة يمكن أن تنتج العديد من الآثار الجانبية. |
يتم تنفيذ التحكم في التدفق باستخدام استدعاءات الوظائف واستدعاءات الوظائف مع العودية. | تتم عملية التحكم في التدفق باستخدام الحلقات والعبارات الشرطية. |
ترتيب تنفيذ البيانات ليس مهمًا جدًا. | ترتيب تنفيذ البيانات مهم. |
يدعم كلاً من "التجريد فوق البيانات" و"التجريد فوق السلوك". | يدعم فقط "التجريد عبر البيانات". |
وفي الختام
- البرمجة الوظيفية أو FP هي طريقة للتفكير في بناء البرمجيات بناءً على بعض المبادئ الأساسية المحددة
- تركز مفاهيم البرمجة الوظيفية على النتائج، وليس العملية
- الهدف من أي لغة FP هو تقليد الوظائف الرياضية
- بعض أبرز لغات البرمجة الوظيفية: 1)Haskell 2)SM 3) Clojure 4) Scala 5) Erlang 6) Clean
- "الوظيفة النقية" هي دالة يتم الإعلان عن مدخلاتها كمدخلات ولا يجب إخفاء أي منها. يتم الإعلان عن المخرجات أيضًا كمخرجات.
- تعني البيانات غير القابلة للتغيير أنه يجب عليك بسهولة إنشاء هياكل البيانات بدلاً من تعديل الهياكل الموجودة بالفعل
- يسمح لك بتجنب المشاكل والأخطاء المربكة في الكود
- الكود الوظيفي ليس سهلاً، لذلك يصعب فهمه للمبتدئين
- يستخدم FP البيانات غير القابلة للتغيير بينما يستخدم OOP البيانات القابلة للتغيير