تحميل الوظائف الزائد
في بعض لغات البرمجة ، يُتيح تحميل الدوال أو تحميل الأساليب إمكانية إنشاء دوال متعددة تحمل الاسم نفسه ولكن بتنفيذات مختلفة. عند استدعاء دالة مُحمّلة، يتم تشغيل تنفيذ مُحدد لتلك الدالة يتناسب مع سياق الاستدعاء، مما يسمح باستدعاء دالة واحدة بأداء مهام مختلفة تبعًا للسياق.
التعريف الأساسي
على سبيل المثال، تُعتبر الدالتان `doTask()` و` doTask(object o)` دالتين مُحمّلتين. لاستدعاء الدالة الثانية، يجب تمرير كائن كمعامل ، بينما لا تتطلب الدالة الأولى أي مُعامل، ويتم استدعاؤها بحقل مُعامل فارغ. من الأخطاء الشائعة تعيين قيمة افتراضية للكائن في الدالة الثانية، مما يؤدي إلى خطأ استدعاء غامض ، حيث لن يعرف المُصرّف أيًّا من الدالتين يجب استخدامه.
مثال آخر هو دالة Print(object o) التي تُنفّذ إجراءات مختلفة بناءً على ما إذا كانت تطبع نصًا أو صورًا. يمكن إعادة تعريف الدالتين على النحو التالي: Print(text_object T)؛ Print(image_object P) . إذا كتبنا دوال الطباعة المُعاد تعريفها لجميع الكائنات التي سيطبعها برنامجنا، فلن نضطر أبدًا للقلق بشأن نوع الكائن، وسيكون استدعاء الدالة الصحيح دائمًا: Print(something) .
اللغات التي تدعم التحميل الزائد
تشمل اللغات التي تدعم تحميل الدوال الزائدة، على سبيل المثال لا الحصر:
- آدا
- قمة
- لغة سي++
- سي شارب
- كلوجر [ 1 ]
- كريستال [ 2 ]
- د
- دلفي [ 3 ]
- إكسير
- سويفت
- فورتران
- كوتلين [ 4 ]
- جافا [ 5 ]
- جوليا
- نيم [ 6 ]
- PostgreSQL [ 7 ] و PL/SQL [ 8 ]
- سكالا
- تايب سكريبت
- فيجوال بيسك (.NET)
- لغة وولفرام
تشمل اللغات التي لا تدعم تحميل الدوال الزائد C و Python و Rust و Zig .
قواعد تحميل الدوال الزائدة
- يتم استخدام نفس اسم الدالة لأكثر من تعريف دالة واحدة في وحدة نمطية أو فئة أو مساحة اسم معينة
- يجب أن يكون للدوال توقيعات أنواع مختلفة ، أي تختلف في عدد أو أنواع معاملاتها الرسمية (كما في لغة C++) أو بالإضافة إلى ذلك في نوع القيمة المرجعة (كما في لغة Ada). [ 9 ]
يرتبط تحميل الدوال عادةً بلغات البرمجة ذات الكتابة الثابتة التي تفرض التحقق من أنواع البيانات عند استدعاء الدوال . الدالة المحملة هي مجموعة من الدوال المختلفة التي يمكن استدعاؤها بنفس الاسم. في كل استدعاء، يحدد المترجم الدالة المحملة التي سيستخدمها ويحسم هذا الأمر أثناء الترجمة . ينطبق هذا على لغات برمجة مثل جافا. [ 10 ]
يختلف تحميل الدوال عن أشكال تعدد الأشكال حيث يتم الاختيار في وقت التشغيل، على سبيل المثال من خلال الدوال الافتراضية ، بدلاً من الاختيار الثابت.
مثال: تحميل الدوال الزائدة في لغة C++
استيراد std ؛// حجم المكعب. int volume ( int s ) { return s * s * s ; }// حجم الأسطوانة. double volume ( double r , int h ) { return std :: numbers :: pi * r * r * static_cast < double > ( h ); }// حجم متوازي المستطيلات (منشور مستطيل). long volume ( long l , int b , int h ) { return l * b * h ; }int main () { std :: println ( "{}" , volume ( 10 )); std :: println ( "{}" , volume ( 2.5 , 8 )); std :: println ( "{}" , volume ( 100l , 75 , 15 )); }في المثال أعلاه، يتم حساب حجم كل مكون باستخدام إحدى الوظائف الثلاث المسماة "الحجم"، مع الاختيار بناءً على العدد والنوع المختلفين للمعلمات الفعلية.
التحميل الزائد للمنشئ
Constructors, used to create instances of an object, may also be overloaded in some object-orientedprogramming languages. Because in many languages the constructor's name is predetermined by the name of the class, it would seem that there can be only one constructor. Whenever multiple constructors are needed, they are to be implemented as overloaded functions. In C++, default constructors take no parameters, instantiating the object members with their appropriate default values, "which is normally zero for numeral fields and empty string for string fields".[11] For example, a default constructor for a restaurant bill object written in C++ might set the tip to 15%:
Bill():tip{0.15},total{0.0}{}The drawback to this is that it takes two steps to change the value of the created Bill object. The following shows creation and changing the values within the main program:
Billcafe;cafe.tip=0.10;cafe.total=4.00;By overloading the constructor, one could pass the tip and total as parameters at creation. This shows the overloaded constructor with two parameters. This overloaded constructor is placed in the class as well as the original constructor we used before. Which one gets used depends on the number of parameters provided when the new Bill object is created (none, or two):
Bill(doubletip,doubletotal):tip{tip},total{total}{}Now a function that creates a new Bill object could pass two values into the constructor and set the data members in one step. The following shows creation and setting the values:
Billcafe(0.10,4.00);This can be useful in increasing program efficiency and reducing code length.
Another reason for constructor overloading can be to enforce mandatory data members. In this case the default constructor is declared private or protected (or preferably deleted since C++11) to make it inaccessible from outside. For the Bill above total might be the only constructor parameter – since a Bill has no sensible default for total – whereas tip defaults to 0.15.
Complications
هناك مشكلتان تتفاعلان مع عملية تحميل الوظائف وتزيدان من تعقيدها: إخفاء الاسم (بسبب النطاق ) والتحويل الضمني للنوع .
إذا تم تعريف دالة في نطاق معين، ثم تم تعريف دالة أخرى بنفس الاسم في نطاق داخلي، فهناك سلوكان طبيعيان محتملان للتحميل الزائد: إما أن يُخفي التعريف الداخلي التعريف الخارجي (بغض النظر عن التوقيع)، أو أن يشمل التحميل الزائد كلاً من التعريف الداخلي والخارجي، بحيث يُخفي التعريف الداخلي التعريف الخارجي فقط في حال تطابق التوقيع. يُعتمد السلوك الأول في لغة C++: "في C++، لا يوجد تحميل زائد عبر النطاقات." [ 12 ] ونتيجة لذلك، للحصول على مجموعة تحميل زائد تتضمن دوالًا مُعرّفة في نطاقات مختلفة، يجب استيراد الدوال صراحةً من النطاق الخارجي إلى النطاق الداخلي باستخدام الكلمة usingالمفتاحية.
يؤدي التحويل الضمني للأنواع إلى تعقيد عملية تحميل الدوال الزائدة لأنه إذا لم تتطابق أنواع المعلمات تمامًا مع توقيع إحدى الدوال المحملة بشكل زائد، ولكن يمكن أن تتطابق بعد تحويل النوع، فإن الحل يعتمد على نوع التحويل الذي تم اختياره.
قد تتداخل هذه الأمور بطرق مربكة: على سبيل المثال، يمكن لتطابق غير دقيق مُعلن عنه في نطاق داخلي أن يخفي تطابقًا دقيقًا مُعلنًا عنه في نطاق خارجي. [ 12 ]
على سبيل المثال، لإنشاء فئة مشتقة تحتوي على دالة مُحمّلة تأخذ قيمة من النوع a doubleأو من النوع an int، باستخدام الدالة التي تأخذ قيمة من النوع an intمن الفئة الأساسية، في لغة C++، يمكن كتابة ما يلي:
class Base { public : void fn ( int i ); };class Derived : public Base { public : using Base :: fn ; void fn ( double d ); };عدم تضمين usingالنتائج في intمعلمة تم تمريرها إلى fnالفئة المشتقة التي يتم تحويلها إلى عدد عشري مزدوج ومطابقة الدالة في الفئة المشتقة، بدلاً من الفئة الأساسية؛ تضمين usingالنتائج في دالة محملة زائدة في الفئة المشتقة وبالتالي مطابقة الدالة في الفئة الأساسية.
محاذير
إذا صُممت دالة بعدد كبير من الصيغ المتعددة، فقد يصعب على المطورين تحديد الصيغة المستخدمة بمجرد قراءة الكود. ويزداد هذا الأمر صعوبةً إذا كانت بعض المعاملات المُحمّلة من أنواع موروثة من معاملات أخرى محتملة (مثل "object"). يمكن لبيئة التطوير المتكاملة (IDE) إجراء عملية تحديد الصيغة المتعددة وعرض الصيغة الصحيحة (أو الانتقال إليها).
قد يؤدي التحميل الزائد القائم على النوع أيضًا إلى إعاقة صيانة الكود، حيث يمكن لتحديثات الكود أن تغير عن طريق الخطأ أي تحميل زائد للطريقة يختاره المترجم. [ 13 ]
انظر أيضاً
الاقتباسات
- ↑ "Clojure - Learn Clojure - Functions" . clojure.org . تم الاطلاع عليه بتاريخ 13-06-2023 .
- ↑ "وثائق كريستال" . crystal-lang.org .
- ↑ "إمباركاديرو دلفي" . embarcadero.com .
- ↑ "مواصفات لغة كوتلين" . kotlinlang.org .
- ↑ بلوخ 2018 ، ص 238-244، §الفصل 8 البند 52: إزالة التحذيرات غير المدققة.
- ↑ "دليل لغة نيم" . nim-lang.org .
- ↑ "37.6. تحميل الدوال الزائد" . وثائق PostgreSQL . 12-08-2021 . تم الاطلاع عليه بتاريخ 29-08-2021 .
- ↑ "دليل المستخدم وقاعدة بيانات PL/SQL" . docs.oracle.com . تم الاطلاع عليه بتاريخ 29-08-2021 .
- ↑ وات، ديفيد أ.؛ فيندلاي، ويليام (1 مايو 2004). مفاهيم تصميم لغات البرمجة . جون وايلي وأولاده، ص 204-207 . ISBN 978-0-470-85320-7.
- ↑ بلوخ 2018 ، ص 238-244، §الفصل 8 البند 52: استخدم التحميل الزائد بحكمة.
- ↑ تشان، جيمي (2017). تعلم لغة سي شارب في يوم واحد وأتقنها جيدًا ( طبعة منقحة). ص 82. ISBN 978-1518800276.
- 1 2 ستروستروب، بيارن . "لماذا لا يعمل التحميل الزائد للفئات المشتقة؟" .
- ↑ براخا، جلعاد (3 سبتمبر 2009). "الحمل الزائد النظامي" . الغرفة 101.
مراجع
- بلوخ، جوشوا (2018). "جافا الفعّالة: دليل لغة البرمجة" ( الطبعة الثالثة). أديسون-ويسلي. ISBN 978-0134685991.
روابط خارجية
- ماير، برتراند (أكتوبر 2001). "التحميل الزائد مقابل تقنية الكائنات" (ملف PDF) . عمود إيفل. مجلة البرمجة الكائنية التوجه . 14 (4). 101 Communications LLC: 3-7 . تاريخ الاسترجاع: 27 أغسطس 2020 .
- طريقة (برمجة الحاسوب)
