بما أن شركة أوراكل قد قدمت بعض البنى الوظيفية في جافا SE 8، فإن معظم المقابلات الآن تهتم بطرح بعض الأسئلة حول البرمجة الوظيفية. كمطور جافا/غروفي/سكالا أو أي مطور برمجة وظيفية آخر، يجب علينا أن نتعلم الأسئلة والأجوبة التالية لتمرير المقابلات:
- ما هي البرمجة الوظيفية؟
- ما هي “المزايا والعيوب” في البرمجة الوظيفية؟
- ما هي الفروقات بين البرمجة الوظيفية والبرمجة الإمبراطورية؟
- ما هي الفروقات بين البرمجة الوظيفية والبرمجة الموجهة للكائنات؟
- ما هي الفروقات بين البرمجة الوظيفية، والبرمجة الإمبراطورية (IP)، والبرمجة الموجهة للكائنات؟
- ما هي المزايا الرئيسية للبرمجة الوظيفية على البرمجة الإمبراطورية أو البرمجة الموجهة للكائنات؟
- متى يجب استخدام البرمجة الوظيفية؟
- متى يجب استخدام البرمجة الموجهة للكائنات؟
- ما هي عيوب البرمجة الموجهة للكائنات؟
- ما هي عيوب الميراث في البرمجة الموجهة للكائنات؟ … والمزيد
في هذه المقالة، سنناقش الأنماط البرمجية الثلاثة الشهيرة التالية واحدة تلو الأخرى ونجيب أيضًا على الأسئلة أعلاه:
- البرمجة الوظيفية (FP)
- البرمجة الإمبراطورية (IP)
- البرمجة الموجهة للكائنات (OOP)
ما هو البرمجة الوظيفية؟
ببساطة، البرمجة الوظيفية (FP) هي واحدة من الأنماط الشهيرة للبرمجة، التي تقوم بالحسابات مثل الوظائف الرياضية بدون تغيير الحالة و تحويل البيانات. في البرمجة الوظيفية، تكون الوظائف مرشحين من الدرجة الأولى. نقوم بكتابة البرامج عن طريق تعريف مجموعة من الوظائف والبيانات غير القابلة للتغيير. أمثلة على لغات البرمجة الوظيفية:- سكالا، هاسكيل، إيرلانج وغيرها من لغات البرمجة الوظيفية الشهيرة. Java SE 8 لديها أيضًا بعض الهياكل الوظيفية (يرجى الرجوع إلى منشورات Java 8 لمزيد من التفاصيل)
ما هي خصائص البرمجة الوظيفية؟
تتميز لغات البرمجة الوظيفية مثل سكالا بالخصائص التالية
- الدولة لا توجد.
برامج FP لا تحتوي على حالة. وهذا يعني أن جميع البيانات هي بيانات لا يمكن تغييرها والوظائف لا يمكن أن تغير الحالة.2. أهمية منخفضة لترتيب التنفيذ
في لغات FP ، نكتب البرامج باستخدام مجموعة من الوظائف المستقلة. تحتوي الوظائف على مجموعة من البيانات. في FP ، ترتيب تنفيذ تلك الوظائف ليس له أهمية كبيرة لأنها لا تحتوي على حالة وتعمل جميع الوظائف بشكل مستقل. حتى إذا قمنا بتغيير ترتيب التنفيذ ، فإنها لا تزال تنتج نفس النتائج.3. نموذج برمجة بلا حالة
جميع برامج FP تستخدم بيانات لا يمكن تغييرها ووظائف لا يمكن أن تعدل تلك البيانات. وهذا يعني أن لغات FP تدعم نموذج برمجة بلا حالة.4. الوظائف هي مواطنون من الدرجة الأولى
في لغات FP ، الوظائف هي كائنات من الدرجة الأولى. الوظائف هي وحدات مستقلة ، يمكننا تنفيذها بأي ترتيب.5. وحدات التلاعب الرئيسية
في لغات FP ، الوحدات الرئيسية للتلاعب هي الوظائف وهياكل البيانات لأن جميع البرامج تتكون باستخدام هذه الوحدات.6. البرمجة الموديلية
في لغات FP ، نحتاج إلى كتابة وحدات صغيرة ومستقلة ، تسمى الوظائف النقية ، لدعم نموذج البرمجة بلا حالة. وهذا يعني أن FP يدعم التجزئة الأفضل من OOP.7. وظائف الدرجة العالية والتقدير الكسلي
يجب أن تدعم لغات البرمجة الوظيفية وظائف الدرجة العالية وميزات التقدير الكسلي.8. مراقبة التدفق الرئيسية
لا تستخدم لغات FP مراقبات التدفق مثل حلقة For…Loop ، Do…While Loop ، While…Loop إلخ ، ولا تستخدم أيضًا عبارات الشرط مثل If…Else أو Switch Statements. جميع لغات FP تكتب البرامج باستخدام الأشياء التالية:
- الوظائف
- المكالمات الوظيفية
- المكالمات الوظيفية مع التكرار
- التجريد، التغليف، الوراثة والتعددية
مثل لغات البرمجة الوظيفية، تدعم كل من مفاهيم الـ 4: التجريد، التغليف، الوراثة والتعددية. تدعم لغات البرمجة الوظيفية الوراثة بواسطة فئات الأنواع أو البيانات الضمنية. تدعم التعددية بمساعدة العاملين. وتُعرف أيضًا باسم التعددية المعلمة.
ما هو التركيز الرئيسي للبرمجة الوظيفية؟
على عكس لغات البرمجة الشيئية، تركز جميع برامج لغات البرمجة الوظيفية بشكل رئيسي على “ما الذي تقوم به” أو “ما يجب القيام به”. تركز أساسًا على الأمور التالية:
- المعلومات المرغوبة وهي المدخلات.
- التحويلات المطلوبة وهي المنطق الفعلي.
وهذا يعني أن البرمجة الوظيفية تركز بشكل أساسي على “ما يجب القيام به” . لا تركز كثيرًا على “كيف يجب القيام به” . لهذا يمكننا كتابة البرمجة الوظيفية تمامًا مثل وصف نطاق المشكلة. لذلك، لا يمكن للمطورين فقط ولكن أيضًا للأشخاص الآخرين فهم رمز البرمجة الوظيفية بسهولة. الآن سنناقش حول “المزايا والعيوب” (الميزات والعيوب) للبرمجة الوظيفية.
ما هي مزايا البرمجة الوظيفية؟
لغات البرمجة الوظيفية لها الفوائد التالية:
- رمز خالي من الأخطاء
بما أن لغات FP لا تدعم الحالة، فهي لا تثير أي آثار جانبية، وهذا يعني أنه يمكننا كتابة رمز خالي من الأخطاء أو رمز خالي من العلل أو رمز أقل عرضة للأخطاء.-برمجة متوازية فعالة
بما أن لغات FP لا تحتوي على حالة قابلة للتغيير، فإنها لا تثير أي مشاكل في تغيير الحالة. وهذا يعني أنها تستخدم بيانات غير قابلة للتغيير فقط. تستخدم وحدات مستقلة لكتابة البرامج وهي “الوظائف”. يمكننا كتابة برمجة متوازية أو متزامنة فعالة للغاية لأنها تعمل بشكل مستقل دون تغيير الحالة.-أداء أفضل
نظرًا لأن برامج FP تتكون من وحدات مستقلة جميعها، يمكن أن تعمل بشكل متواز أو متزامن. ولهذا السبب، تحصل تطبيقات FP على أداء أفضل.-تجميع أفضل
على عكس OOP، تدعم FP تجميعًا أفضل باستخدام الوظائف النقية. الوظائف النقية تعني بدون آثار جانبية.-دعم الوظائف المتداخلة
الوظائف المتداخلة تعني تكوين وظائف داخل وظائف أخرى لحل المشاكل. تدعم FP الوظائف المتداخلة.-زيادة قابلية إعادة الاستخدام
نظرًا لأن برامج FP مكونة من وحدات مستقلة هي “الوظائف”، يمكننا إعادة استخدامها بسهولة.-تجميع أفضل
في لغات FP، نحتاج إلى كتابة وحدات صغيرة ومستقلة، تسمى الوظائف النقية لدعم نموذج البرمجة الخالي من الحالة. وهذا يعني أن FP يدعم تجميعًا أفضل من OOP.-التقدير الكسول السهل
في لغات FP، من السهل جدًا كتابة التقدير الكسول. إذا يدعمون هياكل FP الوظيفية الكسولة مثل القوائم الكسولة، والخرائط الكسولة وما إلى ذلك.-زيادة قراءة وصيانة الأكواد
البرمجة الوظيفية (FP) تعزز أيضًا قراءة الأكواد وصيانتها لأنها تعمل بشكل مستقل ولا تغير الحالة.-زيادة قابلية الاختبار
بما أننا نكتب برامج FP الخاصة بنا باستخدام وحدات مستقلة هي “الوظائف”، يمكننا اختبارها بسهولة.-دعم التجريد عن السلوك
على عكس OOP، تدعم FP كل من “التجريد عن البيانات” و “التجريد عن السلوك”. لأن العالم الحقيقي يحتوي على كلاهما.-دعم لـ BigData
بما أن FP يدعم البرمجة المتوازية والأداء الأفضل، فإن FP جيد جدًا لتطوير تطبيقات BigData.-رمز قوي وموثوق به
بما أن FP يستخدم بيانات لا تتغير، يمكننا بسهولة تطوير رمز قوي وموثوق به باستخدام FP.
سلبيات البرمجة الوظيفية؟
بجانب الفوائد الكبيرة، تحتوي لغات البرمجة الوظيفية أيضًا على عدد قليل جدًا أو ضئيل أو يمكن تجاهله من العيوب. لديها فقط العيوب التالية:
- تتطلب الكثير من الذاكرة لا تتضمن البرمجة الوظيفية الحالة. إنها تنشئ دائمًا كائنات جديدة لأداء الإجراءات بدلاً من تعديل الكائنات الحالية. وبسبب ذلك، تستهلك تطبيقات البرمجة الوظيفية الكثير من الذاكرة. – لا تركز على استبدال ليسكوف
ما هي المفاهيم الرئيسية للبرمجة الوظيفية؟
المفاهيم التالية هي المفاهيم الرئيسية والهامة في البرمجة الوظيفية.
- الدوال من الدرجة الأولى.
- التقييم الكسلاني.
- الدوال من الرتبة العليا.
- عدم التغير (البيانات غير القابلة للتغيير).
- التعداد.
- لا تأثيرات جانبية.
- التقييم الكسلاني.
- استدعاءات الدوال التكرارية.
ما هو البرمجة الإمبراطورية؟
البرمجة الإمبراطورية (IP) هي إحدى الأنماط البرمجية الشهيرة التي تنفذ سلسلة من الخطوات/التعليمات/البيانات بترتيب معين. أمثلة على لغات البرمجة الإمبراطورية:- جافا، سي، سي++ وما إلى ذلك
السمات الرئيسية للبرمجة الإمبراطورية؟
يمكن أن تحتوي أي لغة برمجة إمبراطورية (IP) على السمات التالية:
- تسلسل البيانات.
- ترتيب تنفيذ البيانات مهم جداً.
- تحتوي على حالة.
- تستخدم كل من البيانات الثابتة والمتغيرة.
- يمكن أن تغير الحالة.
- قد تحتوي على آثار جانبية.
- نموذج برمجي ذي حالة.
- تغيير مباشر لحالة البرنامج.
- تمثل الحالة باستخدام حقول البيانات.
ما هي البرمجة الشيئية؟
البرمجة الشيئية هي نوع آخر من نماذج البرمجة. تمثل كل شيء على أنه كائن. يحتوي كل كائن على بعض حقول البيانات والأساليب. تحتوي جميع برامج الـ OOP على حالة. يتم استخدام البيانات القابلة للتغيير وهياكل البيانات. مثل FP ، يمكننا كتابة برمجيات كاملة باستخدام بيانات لا تتغير ، لكنها لا تفرض هذا القاعدة. البرمجة الشيئية (OOP) هي مجموعة فائقة من البرمجة الإرشادية. يتبع جميع سمات IP مع بعض الميزات الإضافية. تلك الميزات الإضافية هي:
- كل شيء هو كائن.
- كل كائن يحتوي على بعض حقول البيانات والأساليب.
- مفاهيم OOP: التجريد، التغليف، الوراثة والتعددية
على عكس لغات البرمجة الوظيفية، تركز لغات OOP بشكل رئيسي على “كيف يجب أن يتم ذلك”. وهذا يعني أننا كمطورين نركز على “كيفية القيام بذلك”. علاوة على ذلك، تجمع OOP بين كل من “ما تقوم به” و “كيفية القيام بذلك”. ولهذا السبب لا يمكننا كتابة كود موجز وأكثر قراءة. يمكن للمطورين فقط فهم الكود، ولا يمكن للأشخاص الآخرين فهم الكود بشكل أكبر ويمكنهم الحصول على المزيد من الالتباس لفهم كود التطبيق، لا يمكنهم فهمه.
ما هي عيوب البرمجة الشيئية (OOP)؟
على الرغم من أن OOP تحل العديد من المشاكل في الوقت الفعلي، لا تزال لديها العيوب التالية (عند مقارنتها بـ FP):
- لا تدعم القابلية الكاملة لإعادة الاستخدام.
- لا يوجد تمامًا تمدين.
- إنه يكسر مفهوم التغليف.
- الوراثة لديها الكثير من العيوب.
العيوب الرئيسية للوراثة:
- يكسر مبدأ التغليف
- عندما تزيد مستويات الوراثة ، يصبح من الصعب جدًا الحفاظ على الكود وإنشاء الكائنات.
متى يجب استخدام البرمجة الوظيفية؟
يجب أن نلجأ إلى البرمجة الوظيفية (FP) في الحالات التالية:
- عندما نقوم بأداء العديد من العمليات المختلفة على البيانات التي تحتوي على قيم ثابتة.
- وبعبارة أخرى ، عندما يكون لدينا قليل من الأشياء مع مزيد من العمليات.
متى يجب استخدام البرمجة الشيئية؟
يجب أن نلجأ إلى البرمجة الشيئية (OOP) في الحالات التالية:
- عندما نقوم بأداء عدد قليل من العمليات على الكثير من الأشكال المختلفة التي لديها سلوك مشترك.
- بمعنى آخر، عندما يكون لدينا المزيد من الأشياء مع قليل من العمليات.
ملاحظة:- هنا الأشياء هي أشياء حقيقية في العالم والعمليات هي أفعال حقيقية. على سبيل المثال، في جافا نمثل هذه الأشياء الحقيقية باستخدام “الفئات” والأفعال الحقيقية باعتبارها الطرق (العمليات).
الفروق بين البرمجة الوظيفية وبرمجة الكائنات؟
Functional Programming | OOP |
---|---|
Does not exist State | Exists State |
Uses Immutable data | Uses Mutable data |
It follows Declarative Programming Model | It follows Imperative Programming Model |
Stateless Programming Model | Stateful Programming Model |
Main Fcous on: “What you are doing” | Main focus on “How you are doing” |
Good for Parallel (Concurrency) Programming | Poor for Parallel (Concurrency) Programming |
Good for BigData processing and analysis | NOT Good for BigData processing and analysis |
Supports pure Encaspulation | It breaks Encaspulation concept |
Functions with No-Side Effects | Methods with Side Effects |
Functions are first-class citizens | Objects are first-class citizens |
Primary Manipulation Unit is “Function” | Primary Manipulation Unit is Objects(Instances of Classes) |
Flow Controls: Function calls, Function Calls with Recursion | Flow Controls: Loops, Conditional Statements |
It uses “Recursion” concept to iterate Collection Data. | It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java |
Order of execution is less importance. | Order of execution is must and very important. |
Supports both “Abstraction over Data” and “Abstraction over Behavior”. | Supports only “Abstraction over Data”. |
We use FP when we have few Things with more operations. | We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java. |
هذا كل شيء عن ثلاثة نماذج شهيرة للبرمجة. ملاحظة:- أنا في الأساس من عالم برمجة الكائنات، ولكنني بدأت العمل في البرمجة الوظيفية قبل عام فقط. لذا إذا وجد خبراء البرمجة الوظيفية أي أخطاء في هذه المشاركة، يرجى تقديم مداخلاتكم القيمة. يرجى ترك تعليق إذا كنت تحب مشاركتي أو لديك أي شكوك أو اقتراحات.