تعدد الأشكال المخصص
في لغات البرمجة ، يُعدّ التعدد الشكلي المخصص [ 1 ] نوعًا من التعدد الشكلي حيث يمكن تطبيق الدوال متعددة الأشكال على وسائط من أنواع مختلفة، لأن الدالة متعددة الأشكال يمكن أن تُشير إلى عدد من التطبيقات المتميزة، وربما غير المتجانسة، اعتمادًا على نوع الوسيط (الوسائط) التي تُطبق عليها. عند تطبيقه على مفاهيم البرمجة الكائنية أو الإجرائية، يُعرف أيضًا باسم تحميل الدوال الزائد أو تحميل المعاملات الزائد . مصطلح "مخصص" في هذا السياق ليس المقصود منه الانتقاص؛ بل يشير ببساطة إلى أن هذا النوع من التعدد الشكلي ليس سمة أساسية لنظام الأنواع . وهذا على عكس التعدد الشكلي البارامتري ، حيث تُكتب الدوال متعددة الأشكال دون ذكر أي نوع محدد، وبالتالي يمكنها تطبيق تطبيق مجرد واحد على أي عدد من الأنواع بطريقة شفافة. وقد قدم كريستوفر ستراشي هذا التصنيف عام 1967.
الارتباط المبكر
التعدد الشكلي المخصص هو آلية إرسال : حيث يتم توجيه التحكم من دالة مُسماة إلى دوال أخرى متعددة دون الحاجة إلى تحديد الدالة المُستدعاة بدقة. يسمح التحميل الزائد بتعريف دوال متعددة تأخذ أنواعًا مختلفة بنفس الاسم؛ ويضمن المُترجم أو المُفسر تلقائيًا استدعاء الدالة الصحيحة. بهذه الطريقة، يمكن كتابة دوال لإلحاق قوائم من الأعداد الصحيحة ، وقوائم من السلاسل النصية ، وقوائم من الأعداد الحقيقية ، وما إلى ذلك، واستدعاء جميعها باسم append - وسيتم استدعاء دالة append الصحيحة بناءً على نوع القوائم المُلحقة. يختلف هذا عن التعدد الشكلي البارامتري، حيث يجب كتابة الدالة بشكل عام للعمل مع أي نوع من القوائم. باستخدام التحميل الزائد، من الممكن أن تؤدي دالة ما وظيفتين مختلفتين تمامًا بناءً على نوع المُدخلات المُمررة إليها؛ وهذا غير ممكن مع التعدد الشكلي البارامتري (ولكن يجب تحقيقه عن طريق تبديل النوع داخل الدالة العامة). هناك طريقة أخرى للنظر إلى التحميل الزائد وهي أن الروتين يتم تحديده بشكل فريد ليس من خلال اسمه، ولكن من خلال مزيج من اسمه وعدد وترتيب وأنواع معلماته.
يُعدّ هذا النوع من تعدد الأشكال شائعًا في لغات البرمجة كائنية التوجه ، حيث يسمح العديد منها بإعادة تعريف المعاملات بطريقة مشابهة للدوال (انظر إعادة تعريف المعاملات ). بعض اللغات غير الديناميكية الكتابة والتي تفتقر إلى تعدد الأشكال المخصص (بما في ذلك فئات الأنواع) لها أسماء دوال أطول مثل print_int`f` print_stringو`f` و`f` وما إلى ذلك. يمكن اعتبار هذا ميزة (أكثر وصفًا) أو عيبًا (إسهابًا مفرطًا) حسب وجهة النظر.
من المزايا التي قد تُكتسب أحيانًا من التحميل الزائد ظهورُ التخصيص، فمثلاً، يمكن تنفيذ دالة تحمل الاسم نفسه بطرقٍ متعددة ومختلفة، كلٌ منها مُحسَّن لأنواع البيانات المحددة التي تعمل عليها. وهذا يُوفِّر واجهةً ملائمةً للتعليمات البرمجية التي تحتاج إلى تخصيصها لحالاتٍ متعددة لأسبابٍ تتعلق بالأداء. أما الجانب السلبي فهو أن نظام الأنواع لا يضمن اتساقَ التطبيقات المختلفة.
بما أن التحميل الزائد يتم في وقت الترجمة، فإنه ليس بديلاً عن الربط المتأخر كما هو موجود في تعدد الأشكال الفرعية .
الربط المتأخر
بغض النظر عن القسم السابق، توجد طرق أخرى يمكن من خلالها تطبيق تعدد الأشكال المخصص . لنأخذ لغة سمول توك كمثال. في سمول توك ، يتم التحميل الزائد أثناء التشغيل، حيث تُحدد الطرق ("تنفيذ الدالة") لكل رسالة محملة زائدة ("دالة محملة زائدة") عند تنفيذها. يحدث هذا أثناء التشغيل، بعد تجميع البرنامج. لذلك، يُوفر تعدد الأشكال من خلال تعدد الأشكال الفرعي كما هو الحال في اللغات الأخرى، كما يُوسع نطاق وظائفه من خلال تعدد الأشكال المخصص أثناء التشغيل.
بالتدقيق، يتضح أن لغة Smalltalk توفر نوعًا مختلفًا قليلًا من تعدد الأشكال المخصص . نظرًا لاعتماد Smalltalk على نموذج تنفيذ مرتبط بالوقت، ولأنها تتيح للكائنات إمكانية معالجة الرسائل غير المفهومة، فمن الممكن تنفيذ وظائف باستخدام تعدد الأشكال دون الحاجة إلى تحميل رسالة معينة بشكل صريح. قد لا يُنصح بهذا الأسلوب في البرمجة اليومية، ولكنه قد يكون مفيدًا جدًا عند تنفيذ الوكلاء.
كذلك، على الرغم من أن تحميل الدوال والمنشئات المشتركة في الأصناف لا يُعتبر عمومًا تعدد أشكال، إلا أن هناك لغات أكثر تجانسًا تُعامل فيها الأصناف ككائنات عادية. ففي لغة سمول توك، على سبيل المثال، تُعامل الأصناف ككائنات عادية. وهذا يعني بدوره إمكانية تحميل الرسائل المُرسلة إلى الأصناف، كما يُمكن إنشاء كائنات تتصرف كأصناف دون أن ترث أصنافها من التسلسل الهرمي للأصناف. تُعد هذه تقنيات فعّالة يُمكن استخدامها للاستفادة من إمكانيات الانعكاس القوية في سمول توك . كما يُمكن تطبيق ترتيبات مماثلة في لغات مثل سيلف ونيوسبيك .
مثال
تخيل عامل تشغيل +يمكن استخدامه بالطرق التالية:
1 + 2 = 33.14 + 0.0015 = 3.14151 + 3.7 = 4.7[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6][true, false] + [false, true] = [true, false, false, true]"bab" + "oon" = "baboon"
للتعامل مع استدعاءات الدوال الستة هذه، يلزم أربعة أجزاء مختلفة من التعليمات البرمجية (أو ثلاثة، إذا اعتبرت السلاسل قوائم من الأحرف):
- في الحالة الأولى، يجب استدعاء عملية جمع الأعداد الصحيحة .
- في الحالتين الثانية والثالثة، يجب استدعاء عملية الجمع ذات الفاصلة العائمة (مع ترقية النوع ، أو إجبار النوع ، في الحالة الثالثة).
- في الحالتين الرابعة والخامسة، يجب استدعاء عملية دمج القوائم .
- في الحالة الأخيرة، يجب استدعاء عملية دمج السلاسل النصية .
لذا، يشير الاسم +في الواقع إلى ثلاث أو أربع وظائف مختلفة تمامًا. وهذا مثال على التحميل الزائد ، أو تحديدًا، التحميل الزائد للمعاملات .
لاحظ الغموض في أنواع السلاسل النصية المستخدمة في الحالة الأخيرة. لنفترض "123" + "456"أن المبرمج قد يفترض الجمع بدلاً من الربط. قد يتوقع "579"بدلاً من "123456". بالتالي، يمكن أن يوفر التحميل الزائد معاني أو دلالات مختلفة للعملية، بالإضافة إلى تطبيقات مختلفة.
انظر أيضاً
- إرهاق المشغل
- فئة النوع
- تعدد الأشكال (علوم الحاسوب) (أنواع أخرى من تعدد الأشكال)
- تعدد الأشكال البارامتري
مراجع
- ↑ سي. ستراشي، المفاهيم الأساسية في لغات البرمجة . ملاحظات محاضرة للمدرسة الصيفية الدولية في برمجة الحاسوب، كوبنهاغن، أغسطس 1967
- تعدد الأشكال (علوم الحاسوب)
- مواضيع لغات البرمجة
- نظرية الأنواع
