إرهاق المشغل

في برمجة الحاسوب ، يُعدّ تحميل المعاملات الزائد ، والذي يُطلق عليه أحيانًا تعدد الأشكال المخصص للمعاملات ، حالةً خاصةً من تعدد الأشكال ، حيث يكون للمعاملات المختلفة تطبيقات مختلفة تبعًا لوسائطها. ويتم تعريف تحميل المعاملات الزائد عمومًا بواسطة لغة البرمجة أو المبرمج أو كليهما.

الأساس المنطقي

يُعدّ تحميل المعاملات الزائد اختصارًا نحويًا ، ويُستخدم لأنه يسمح بالبرمجة باستخدام رموز أقرب إلى المجال المستهدف [ 1 كما يُتيح للأنواع المُعرّفة من قِبل المستخدم مستوى دعم نحوي مماثل للأنواع المُدمجة في اللغة. وهو شائع، على سبيل المثال، في الحوسبة العلمية، حيث يسمح بمعالجة التمثيلات الحاسوبية للكائنات الرياضية بنفس الصيغة المستخدمة في الكتابة الورقية.

لا يؤثر تحميل المعاملات الزائد على القدرة التعبيرية للغة (التي تحتوي على دوال)، إذ يمكن محاكاته باستخدام استدعاءات الدوال. على سبيل المثال، لنفترض وجود متغيرين a، bو cمن نوع مُعرَّف من قِبل المستخدم، مثل المصفوفات :

a + b * c

في لغة تدعم تحميل المعاملات الزائدة، ومع الافتراض المعتاد بأن المعامل له أسبقية* أعلى من المعامل، فإن هذه طريقة مختصرة للكتابة:+

Add(a, Multiply(b, c))

ومع ذلك، فإن الصيغة السابقة تعكس الاستخدام الرياضي الشائع.

أمثلة

في هذه الحالة، يتم تحميل عامل الجمع بشكل زائد للسماح بالجمع على نوع معرف من قبل المستخدم Timeفي لغة C++ :

دالة الوقت + ( الوقت الثابت & الجانب الأيسر ، الوقت الثابت & الجانب الأيمن ) { الوقت المؤقت = الجانب الأيسر ؛ الوقت المؤقت.الثواني + = الجانب الأيمن.الثواني ؛ الوقت المؤقت.الدقائق + = الوقت المؤقت.الثواني / 60 ؛ الوقت المؤقت.الثواني % = 60 ؛ الوقت المؤقت.الدقائق + = الجانب الأيمن.الدقائق ؛ الوقت المؤقت.الساعات + = الوقت المؤقت.الدقائق / 60 ؛ الوقت المؤقت.الدقائق % = 60 ؛ الوقت المؤقت.الساعات + = الجانب الأيمن.الساعات ؛ إرجاع الوقت المؤقت ؛ }

الجمع عملية ثنائية ، أي أنها تتضمن مُعاملين . في لغة C++، تُعتبر الوسائط المُمررة هي المُعاملات، بينما tempيُمثل الكائن القيمة المُعادة.

يمكن تعريف العملية أيضًا كطريقة فئة، مع استبدال الوسيط lhsالمخفي this؛ ومع ذلك، فإن هذا يجبر المعامل الأيسر على أن يكون من النوع Time:

// تعني كلمة "const" قبل القوس المعقوف المفتوح أن `this` لا يتم تعديله. Time Time :: operator + ( const Time & rhs ) const { Time temp = * this ; // يجب عدم تعديل `this`، لذا قم بإنشاء نسخة منه. temp . seconds += rhs . seconds ; temp . minutes += temp . seconds / 60 ; temp . seconds %= 60 ; temp . minutes += rhs . minutes ; temp . hours += temp . minutes / 60 ; temp . minutes %= 60 ; temp . hours += rhs . hours ; return temp ; }

لاحظ أن العامل الأحادي المعرف كطريقة فئة لن يتلقى أي وسيط ظاهر (فهو يعمل فقط من this):

bool Time :: operator ! () const { return hours == 0 && minutes == 0 && seconds == 0 ; }

غالبًا ما يتم استخدام عامل المقارنة (<) بشكل زائد لترتيب بنية أو فئة:

class IntegerPair { private : int x ; int y ; public : explicit IntegerPair ( int x = 0 , int y = 0 ) : x { x }, y { y } {}bool operator < ( const IntegerPair & p ) const { if ( x == p . x ) { return y < p . y ; } return x < p . x ; } };

كما هو الحال في الأمثلة السابقة، يتم في المثال الأخير إعادة تعريف المعاملات داخل الفئة. في لغة C++، بعد إعادة تعريف معامل أصغر من ( operator<)، يمكن استخدام دوال الفرز القياسية لفرز بعض الفئات.

ابتداءً من C++20 مع تقديم عامل المقارنة الثلاثي ( operator<=>)، أصبح بالإمكان تعريف جميع عوامل الترتيب بمجرد تعريف هذا العامل. يتوفر عامل المقارنة الثلاثي في ​​العديد من اللغات، بما في ذلك C++ و Python و Rust و Swift و PHP . بينما تستخدم لغات أخرى، مثل Java و C#، طريقةً أخرى Comparable.compareTo().

استيراد std ؛باستخدام std :: strong_ordering ؛class IntegerPair { private : int x ; int y ; public : explicit IntegerPair ( int x = 0 , int y = 0 ) : x { x }, y { y } {}// يمكن توليدها تلقائيًا باستخدام = افتراضيًا؛ عامل الترتيب القوي < ( const IntegerPair & p ) const { if ( strong_ordering cmp = x <=> p . x ; cmp != strong_ordering :: equal ) { return cmp ; } return y <=> p . y ; } };

الانتقادات

تعرض تحميل المعاملات الزائد لانتقادات [ 2 ] لأنه يسمح للمبرمجين بإعادة تعيين دلالات المعاملات بناءً على أنواع معاملاتهم. على سبيل المثال، يؤدي استخدام المعامل <<في لغة C++ إلى إزاحة البتات في المتغير بمقدار بتات إذا كان كل من `x` و` y` من نوع عدد صحيح، ولكن إذا كان `y` عبارة عن دفق إخراج، فسيحاول الكود أعلاه كتابة `y` إلى الدفق. ولأن تحميل المعاملات الزائد يسمح للمبرمج الأصلي بتغيير الدلالات المعتادة للمعامل ومفاجأة أي مبرمجين لاحقين، يُعتبر من الممارسات الجيدة استخدام تحميل المعاملات الزائد بحذر (قرر مبتكرو لغة Java عدم استخدام هذه الميزة، [ 3 ] وإن لم يكن بالضرورة لهذا السبب ).a<<bababab

ثمة مشكلة أخرى، أكثر دقة، تتعلق بالمعاملات، وهي إمكانية توقع بعض القواعد الرياضية بشكل خاطئ أو افتراضها دون قصد. على سبيل المثال، لا تنطبق خاصية التبديل للدالة + (أي أن √(√) √(√) دائمًا؛ ويحدث هذا عندما تكون المعاملات سلاسل نصية، حيث تُستخدم الدالة + عادةً لدمج السلاسل النصية ( أي أن √ ( ) √(√) √(√) بينما √(√ ) ...a + b == b + a"bird" + "song""birdsong""song" + "bird""songbird"

الكتالوج

يتم تصنيف بعض لغات البرمجة الشائعة وفقًا لما إذا كان من الممكن تحميل عوامل التشغيل الخاصة بها بشكل زائد من قبل المبرمج وما إذا كانت عوامل التشغيل تقتصر على مجموعة محددة مسبقًا.

المشغلونغير قابل للتحميل الزائدقابل للتحميل الزائد
جديد قابل للتحديد [ 4 ]
مجموعة محدودة

الجدول الزمني لزيادة حمولة المشغل

الستينيات

سمحت مواصفات ALGOL 68 بتحميل المشغل الزائد. [ 36 ]

مقتطف من مواصفات لغة ALGOL 68 (الصفحة 177) حيث تم تعريف المعاملات المحملة بشكل زائد ¬، =، ≠، و abs :

10.2.2. العمليات على المعاملات المنطقية أ) op ∨ = ( bool a, b) bool :( a | true | b ); ب) op ∧ = ( bool a, b) bool : ( a | b | false ); ج) op ¬ = ( bool a) bool : ( a | false | true ); د) op == ( bool a, b) bool :( a∧b ) ∨ ( ¬b∧¬a ); هـ) op ≠ = ( bool a, b) bool : ¬(a=b); و) op abs = ( bool a) int : ( a | 1 | 0 );

لاحظ أنه لا حاجة إلى تعريف خاص لإعادة تعريف عامل ما، ويحق للمبرمج إنشاء عوامل جديدة. بالنسبة للعوامل الثنائية، يمكن تحديد أولويتها مقارنةً بالعوامل الأخرى.

الأولوية القصوى = 9؛ op max = ( int a, b) int : ( a>b | a | b ); op ++ = ( ref int a ) int : ( a +:= 1 );

ثمانينيات القرن العشرين

تدعم لغة آدا إعادة تعريف المعاملات منذ نشأتها، مع نشر معيار لغة آدا 83. ومع ذلك، اختار مصممو اللغة منع تعريف معاملات جديدة. يُسمح فقط بإعادة تعريف المعاملات الموجودة في اللغة، وذلك بتعريف دوال جديدة بمعرفات مثل "+" و"*" و"&" وما إلى ذلك. حافظت المراجعات اللاحقة للغة (في عامي 1995 و2005) على هذا القيد المقتصر على إعادة تعريف المعاملات الموجودة.

في لغة C++ ، يكون تحميل المعاملات أكثر دقة مما هو عليه في لغة ALGOL 68. [ 37 ]

التسعينيات

اختار مصممو لغة جافا في شركة صن مايكروسيستمز حذف خاصية التحميل الزائد. [ 38 ] [ 39 ] [ 40 ] وعندما سُئل برايان غوتز من شركة أوراكل عن التحميل الزائد للمعاملات، أجاب قائلاً: " أنواع القيم أولاً، ثم يمكننا التحدث عنها."، مما يشير إلى إمكانية إضافتها بعد مشروع فالهالا . [ 41 ]

تسمح لغة بايثون بتحميل المعاملات الزائدة من خلال تنفيذ الدوال بأسماء خاصة. [ 42 ] على سبيل المثال، يمكن تحميل معامل الجمع (+) الزائد من خلال تنفيذ الدالة obj.__add__(self, other).

تسمح لغة روبي بتحميل المعاملات الزائدة كاختصار برمجي لاستدعاءات الطرق البسيطة.

تسمح لغة Lua بتحميل المعاملات الزائدة كاختصار نحوي لاستدعاءات الأساليب مع ميزة إضافية تتمثل في أنه إذا لم يحدد المعامل الأول هذا المعامل، فسيتم استخدام الأسلوب الخاص بالمعامل الثاني.

العقد الأول من القرن الحادي والعشرين

أضافت مايكروسوفت خاصية تحميل المعاملات الزائدة إلى لغة C# في عام 2001 وإلى Visual Basic .NET في عام 2003. وتتشابه خاصية تحميل المعاملات الزائدة في لغة C# بشكل كبير في بناء الجملة مع خاصية تحميل المعاملات الزائدة في لغة C++: [ 43 ]

public class Fraction { private int numerator ; private int denominator ;// ...public static Fraction operator + ( Fraction lhs , Fraction rhs ) => new Fraction ( lhs . numerator * rhs . denominator + rhs . numerator * lhs . denominator , lhs . denominator * rhs . denominator ); }

تتعامل لغة سكالا مع جميع المعاملات كطرق، وبالتالي تسمح بتحميل المعاملات بشكل زائد عن طريق الوكيل.

العقد الثاني من القرن الحادي والعشرين

في راكو ، يُعهد بتعريف جميع المعاملات إلى الدوال المعجمية، وبالتالي، باستخدام تعريفات الدوال، يمكن إعادة تعريف المعاملات أو إضافة معاملات جديدة. على سبيل المثال، الدالة المُعرَّفة في مصدر راكودو لزيادة كائن التاريخ بمقدار " +" هي:

multi infix:<+> ( Date:D $d , Int:D $x ) { Date . new-from-daycount ( $d . daycount + $x ) } 

بما أنه تم استخدام "multi"، تُضاف الدالة إلى قائمة الدوال المرشحة للإرسال المتعدد ، ولا +يتم تحميل " " إلا في حالة استيفاء قيود النوع في توقيع الدالة. وبينما تشمل إمكانية التحميل الزائد +و *و >=واللاحقة والمصطلحi وما إلى ذلك، فإنها تسمح أيضًا بتحميل عوامل الأقواس المختلفة: [x, y]و x[y]و x{y}و و x(y).

لقد دعمت لغة Kotlin تحميل المعاملات الزائدة منذ إنشائها عن طريق إعادة كتابة وظائف ذات أسماء خاصة (مثل plus()، inc()، rangeTo()، إلخ.) [ 44 ]

صنف البيانات Point ( القيمة x : عدد صحيح ، القيمة y : عدد صحيح ) { دالة عامل الجمع ( الآخر : نقطة ): نقطة { إرجاع نقطة ( هذا . x + الآخر . x ، هذا . y + الآخر . y ) } }

لأن كلاً من Kotlin و Java يتم تجميعهما إلى .class ، فعند تحويلهما مرة أخرى إلى Java، سيتم تمثيل ذلك ببساطة على النحو التالي:

public class Point { // الحقول والدالة البانية...public Point plus ( Point other ) { return new Point ( this . x + other . x , this . y + other . y ); } }

يتم تحقيق تحميل المعاملات الزائدة في لغة Rust عن طريق تنفيذ السمات في std::ops. [ 45 ]

استخدم std :: ops :: Add ؛#[derive(Debug)] struct Point { x : i32 , y : i32 }impl Point { pub fn new ( x : i32 , y : i32 ) -> Self { Point { x , y } } }impl Add for Point { type Output = Point ;fn add ( self , other : Point ) -> Point { Point { x : self . x + other . y , y : self . y + other . y } } }fn main () { let p1 : Point = Point :: new ( 1 , 2 ); let p2 : Point = Point :: new ( 3 , 4 ); let sum : Point = p1 + p2 ; println! ( "مجموع p1 و p2: {:?}" , sum ); }

انظر أيضاً

مراجع

  1. ستروستروب، بيارن . "تحميل المعاملات الزائد" . الأسئلة الشائعة حول لغة C++ . مؤرشف من الأصل في 14 أغسطس 2011. تم الاطلاع عليه في 27 أغسطس 2020 .
  2. فيشر، تشارلز ن. (2008). "قضايا التحميل الزائد" (ملف PDF) . جامعة ويسكونسن-ماديسون .
  3. "لا مزيد من تحميل المعاملات الزائد" . بيئة لغة جافا . شركة أوراكل .
  4. يمكن إضافة عوامل تشغيل جديدة تمامًا.
  5. "Predicate op/3" .
  6. "برتراند ماير: آليات لغة إيفل الأساسية" . se.ethz.ch. تم الاطلاع عليه بتاريخ 7 أبريل 2021 .
  7. "وظائف المعامل في F90" . www.mathcs.emory.edu . مؤرشف من الأصل بتاريخ 11 أغسطس 2021. تم الاطلاع عليه بتاريخ 7 أبريل 2021 .
  8. تم تقديمه في فورتران 90.
  9. سميث، كريس (9 أكتوبر 2012). برمجة F# 3.0: دليل شامل لكتابة أكواد بسيطة لحل المشكلات المعقدة . دار نشر أورايلي ميديا. رقم ISBN 978-1-4493-2604-3.
  10. استخدام فئات الأنواع بدلاً من التحميل الزائد.
  11. "تحميل المعاملات الزائد في لغة جوليا" . geeksforgeeks.org . تم الاطلاع عليه بتاريخ 14 مارس 2025 .
  12. "المشغلون - لغة R باختصار، الطبعة الثانية [ كتاب ] " . www.oreilly.com . تم الاطلاع عليه بتاريخ 7 أبريل 2021 .
  13. "المشغلون" . جولة في سكالا .
  14. هانت، جون (6 ديسمبر 2012). سمول توك والبرمجة كائنية التوجه: مقدمة . سبرينغر ساينس آند بيزنس ميديا. ISBN 978-1-4471-0961-7.
  15. "Swift: Advanced Operators" .
  16. "لماذا لا تدعم لغة Go التحميل الزائد للأساليب والمعاملات؟" . تم الاطلاع عليه بتاريخ 4 سبتمبر 2011 .
  17. "مقدمة" . freepascal.org . تم الاطلاع عليه بتاريخ 30 سبتمبر 2020 .
  18. "تحميل زائد للمشغل" . جيت هاب . تم الاسترجاع في 28 سبتمبر 2018 .
  19. "6.6 التحميل الزائد للمشغلين" . دليل مرجعي مشروح للغة آدا .
  20. ^ درايتون، بيتر. البحاري، بن؛ نيوارد، تيد (2003). C# باختصار . O'Reilly Media، Inc. ISBN 978-0-596-00526-9.
  21. "تحميل عوامل التشغيل في لغة C++" .
  22. "تحميل المعاملات الزائد - لغة البرمجة D" . dlang.org . تم الاطلاع عليه بتاريخ 10 أكتوبر 2020 .
  23. "جولة في لغة دارت" . dart.dev . تم الاطلاع عليه بتاريخ 30 سبتمبر 2020 .
  24. "لغة برمجة أباتشي جروفي - عوامل التشغيل" . groovy-lang.org . تم الاطلاع عليه بتاريخ 30 سبتمبر 2020 .
  25. "تحميل زائد للمشغل" . كوتلين . تم الاسترجاع في 24 يونيو 2018 .
  26. "دليل استخدام الأساليب الوصفية" . ويكي مستخدمي لغة لوا .
  27. "تنفيذ عوامل التشغيل لفئتك" . مؤرشف من الأصل في 14 يونيو 2024. تم الاطلاع عليه في 1 أكتوبر 2013 .
  28. "تحميل المشغل الزائد" . دليل Free Pascal . تم الاطلاع عليه في 1 ديسمبر 2014 .
  29. "تحميل المشغل الزائد" . دليل دلفي . تم الاطلاع عليه في 1 ديسمبر 2014 .
  30. "أساليب PHP السحرية التي تتجاوز خصائص الفئة" . مؤرشف من الأصل في 4 مارس 2016. تم الاطلاع عليه في 7 أبريل 2015 .
  31. أوروانت، جون (4 نوفمبر 2002). علوم الحاسوب وبرمجة بيرل: أفضل ما في مجلة بيرل . دار نشر أورايلي ميديا، ص 347 وما بعدها. رقم ISBN  978-0-596-00310-4.
  32. "3. نموذج البيانات" . مرجع لغة بايثون .
  33. "الأساليب" . الأسئلة الشائعة الرسمية حول لغة روبي .
  34. "تحميل المعاملات الزائد" . رست بالأمثلة .
  35. "كيفية: تعريف عامل (فيجوال بيسك)" . 15 سبتمبر 2021.
  36. ^ فان فيجنجاردن، أ. مايلوكس، باري J.؛ بيك, جون إل ; الأماكن القريبة : وآخرون . (أغسطس 1968). "تقرير عن اللغة الخوارزمية ALGOL 68، القسم 10.2.2" (PDF) . تم الاسترجاع 1 أبريل 2007 . 
  37. ستروستروب، بيارن . "تاريخ لغة C++: 1979-1991" (ملف PDF) . ص 12. تم الاطلاع عليه في 1 أبريل 2007 . 
  38. "سؤال الأسئلة الشائعة رقم 6.9: لماذا لا يوجد تحميل زائد للمعاملات؟" . قائمة الأسئلة الشائعة الخاصة بـ comp.lang.java .
  39. "java.sun.com" . مؤرشف من الأصل في 7 مارس 2009. تم الاطلاع عليه في 26 مارس 2009 .
  40. ^ هولزنر ، ستيفن (2001). ج++: الكتاب الأسود . سكوتسديل، أريزونا: مجموعة كوريوليس. ص. 387. ردمك  1-57610-777-9إحدى أجمل ميزات البرمجة الكائنية في لغة C++ هي أنه يمكنك تحميل عوامل التشغيل للتعامل مع كائنات فئاتك (لا يمكنك فعل ذلك في بعض لغات البرمجة الكائنية الأخرى، مثل Java) .
  41. @BrianGoetz (11 يناير 2017). "أنواع القيم أولاً، ثم يمكننا التحدث عنها" ( تغريدة ) عبر تويتر .
  42. "3. نموذج البيانات، أسماء الطرق الخاصة" . مرجع لغة بايثون .
  43. "تحميل المعاملات الزائد - معاملات أحادية، وحسابية، ومساواة، ومقارنة مُعرَّفة مسبقًا" . learn.microsoft.com . مايكروسوفت ليرن. 13 يونيو 2025.
  44. "تحميل المعاملات الزائد في لغة كوتلين" . kotlinlang.org . JetBrains sro . تم ​​الاطلاع عليه بتاريخ 15 أكتوبر 2025 .
  45. "تحميل المعاملات الزائد - رست بالأمثلة" . doc.rust-lang.org . لغة برمجة رست . تم الاطلاع عليه بتاريخ 15 أكتوبر 2025 .