سمة (برمجة الحاسوب)
في برمجة الحاسوب ، السمة هي مفهوم لغوي يمثل مجموعة من الأساليب التي يمكن استخدامها لتوسيع وظائف فئة معينة . [ 1 ] [ 2 ]
الأساس المنطقي
في البرمجة كائنية التوجه، قد تتشارك بعض الفئات غير المرتبطة ببعضها سلوكيات معينة. على سبيل المثال، قد تحتوي فئات غير مرتبطة على دوال لتحويل الكائنات إلى JSON . تاريخيًا، وُجدت عدة طرق لحل هذه المشكلة دون تكرار الكود في كل فئة تحتاج إلى هذا السلوك. تشمل الطرق الأخرى الوراثة المتعددة والمزيجات ، لكن لهذه الطرق عيوبها: فقد يتغير سلوك الكود بشكل غير متوقع إذا تغير ترتيب تطبيق المزيجات، أو إذا أُضيفت دوال جديدة إلى الفئات الأصلية أو المزيجات.
تُحلّ السمات هذه المشكلات من خلال تمكين الأصناف من استخدامها والحصول على السلوك المطلوب. إذا استخدم صنفٌ ما أكثر من سمة، فإن ترتيب استخدامها لا يُهم. تتمتع الطرق التي توفرها السمات بوصول مباشر إلى بيانات الصنف.
صفات
تجمع السمات بين جوانب البروتوكولات (الواجهات) والمزيجات . وكما هو الحال في الواجهة، تُعرّف السمة توقيعًا واحدًا أو أكثر من توقيعات الدوال ، والتي يجب على الفئات المُنفِّذة توفير تطبيقات لها. وكما هو الحال في المزيج، تُضيف السمة سلوكًا إضافيًا للفئة المُنفِّذة.
في حال تعارض أسماء الدوال المُقدمة من سمات مختلفة، يجب على المبرمج تحديد أي من هذه الدوال سيتم استخدامها في الصنف بشكل صريح؛ وبالتالي حل مشكلة الوراثة المتعددة المعقدة يدويًا . يختلف هذا عن طرق التركيب الأخرى في البرمجة كائنية التوجه، حيث يتم حل تعارض الأسماء تلقائيًا بواسطة قواعد النطاق .
العمليات التي يمكن إجراؤها باستخدام السمات تشمل: [ 3 ] [ 4 ]
- المجموع المتناظر : عملية تدمج سمتين منفصلتين لإنشاء سمة جديدة
- التجاوز (أو الجمع غير المتماثل ): عملية تُنشئ سمة جديدة بإضافة طرق إلى سمة موجودة، وقد تتجاوز بعض طرقها.
- الاسم المستعار : عملية تُنشئ سمة جديدة بإضافة اسم جديد لطريقة موجودة
- الاستبعاد : عملية تُنشئ سمة جديدة عن طريق إزالة طريقة من سمة موجودة. (يؤدي دمج هذا مع عملية الاسم المستعار إلى عملية إعادة تسمية سطحية ).
إذا تم استبعاد دالة من سمة ما، فيجب أن توفرها الفئة التي تستخدم السمة، أو فئة أصلية لتلك الفئة. وذلك لأن الدوال التي توفرها السمة قد تستدعي الدالة المستبعدة.
تركيب الصفات هو تركيب تبادلي (أي إذا كانت لدينا الصفات A و B ، فإن A + B تساوي B + A ) وتركيب ترابطي (أي إذا كانت لدينا الصفات A و B و C ، فإن ( A + B ) + C تساوي A + ( B + C )). [ 1 ]
القيود
على الرغم من أن السمات توفر مزايا كبيرة مقارنة بالعديد من البدائل، إلا أنها لها حدودها الخاصة.
الطرق المطلوبة
إذا كانت السمة تتطلب من الفئة المستهلكة توفير طرق معينة، فلا يمكن للسمة معرفة ما إذا كانت تلك الطرق مكافئة دلاليًا لاحتياجاتها. في بعض اللغات الديناميكية، مثل بيرل، لا يمكن تحديد الطريقة المطلوبة إلا من خلال اسمها، وليس من خلال توقيعها الكامل ، مما يجعل من الصعب ضمان ملاءمة الطريقة المطلوبة.
باستثناء الطرق
إذا تم استبعاد طريقة من سمة ما، فإن تلك الطريقة تصبح طريقة "مطلوبة" للسمة لأن الطرق الأخرى للسمة قد تستدعيها.
اللغات المدعومة
تنشأ السمات في لغة البرمجة Self [ 5 ] وتدعمها لغات البرمجة التالية:
- AmbientTalk : يجمع بين خصائص سمات Self (الوراثة المتعددة القائمة على الكائنات) وسمات Squeak في Smalltalk (التي تتطلب تركيب السمات بشكل صريح من قِبل المبرمج). وهو يعتمد على الأبحاث المتعلقة بالسمات ذات الحالة والقابلة للتجميد لتمكين الحالة داخل السمات، وهو ما لم يكن مسموحًا به في التعريفات الأولى. [ 6 ]
- لغة سي شارب : منذ الإصدار 8.0، تدعم لغة سي شارب أساليب الواجهة الافتراضية ، [ 7 ] والتي لها بعض خصائص السمات. [ 8 ]
- C++ : تُستخدم في مكتبة القوالب القياسية ومكتبة C++ القياسية لدعم فئات الحاويات العامة [ 9 ] [ 10 ] وفي مكتبة Boost TypeTraits . [ 11 ]
- Curl : تسمح الفئات المجردة كمزيجات بتنفيذ الأساليب، وبالتالي تشكل سمات باسم آخر.
- الحصن [ 12 ]
- Groovy : منذ الإصدار 2.3 [ 13 ]
- هاسكل : السمات هي فئات أنواع مسماة .
- هاكس : منذ الإصدار 2.4.0. [ 14 ] يُطلق عليه اسم الامتداد الثابت [ 15 ] في الدليل، ويستخدم
usingالكلمة المفتاحية - جافا : منذ الإصدار 8، تدعم جافا الطرق الافتراضية ، [ 16 ] التي تتمتع ببعض خصائص السمات. [ 17 ] [ 18 ] [ 19 ] [ 20 ]
- جافا سكريبت : يمكن تطبيق السمات عبر الدوال والتفويضات [ 21 ] أو من خلال المكتبات التي توفر السمات. [ 22 ] [ 23 ] [ 24 ]
- جوليا : العديد من الحزم تنفذ السمات، على سبيل المثال، [ 25 ]
- Kotlin : تُسمى السمات بالواجهات [ 26 ] منذ الإصدار M12. [ 27 ]
- لاسو [ 28 ]
- موجو : منذ الإصدار 0.6.0 [ 29 ]
- OCaml : يمكن تنفيذ السمات باستخدام مجموعة متنوعة من ميزات اللغة: تضمين الوحدة النمطية ونوع الوحدة النمطية، والدوال وأنواع الدوال، والفئة ووراثة نوع الفئة، وما إلى ذلك.
- بيرل : الأدوار المسماة ، وهي مُطبقة في مكتبات بيرل مثل Moose وRole::Tiny وRole::Basic. تُعد الأدوار جزءًا من لغة Raku الشقيقة . [ 30 ] مع قبول اقتراح كورينا للبرمجة الكائنية [ 31 ]، ستتضمن بيرل أدوارًا أصلية كجزء من نظام برمجة كائنية حديث.
- PHP : منذ الإصدار 5.4، [ 32 ] [ 33 ] يسمح PHP للمستخدمين بتحديد القوالب التي توفر القدرة على "الوراثة" من أكثر من فئة (سمة) واحدة، كوراثة متعددة زائفة .
- بايثون : عبر مكتبة خارجية، [ 34 ] [ 35 ] أو عبر فئات المزج ذات الترتيب الأعلى [ 36 ]
- Racket : يدعم السمات كمكتبة ويستخدم وحدات الماكرو والهياكل والفئات من الدرجة الأولى لتنفيذها. [ 37 ]
- روبي : يمكن استخدام مزيج الوحدات لتنفيذ السمات. [ 38 ]
- الصدأ [ 39 ]
- Scala [ 40 ] [ 41 ] السمة مدمجة مدعومة بالكلمة الرئيسية
trait. - سمول توك : يتم تطبيق السمات في لهجتين من سمول توك، وهما سكويك [ 1 ] وفارو . [ 42 ]
- Swift : يمكن تنفيذ السمات باستخدام امتدادات البروتوكول . [ 43 ]
أمثلة
سي شارب
في لغة C# 8.0، من الممكن تعريف التنفيذ كعضو في واجهة.
باستخدام النظام ؛namespace CSharp8NewFeatures ;interface ILogger { // طرق الواجهة التقليدية void Log ( string message ); void LogError ( Exception exception );// دالة الواجهة الافتراضية void LogWarning ( string message ) { Console . WriteLine ( message ); } }class Logger : ILogger { public void Log ( string message ) { Console . WriteLine ( message ); }public void LogError ( Exception exception ) { Console . WriteLine ( exception . ToString ()); } }public class Program { static void Main ( string [] args ) { ILogger logger = new Logger ();logger.LogWarning ( "رسالة تحذيرية ما" ) ; } }PHP
يستخدم هذا المثال سمة لتحسين فئات أخرى:
// السمة القالبية TSingleton { private static $_instance = null ;private function __construct () {} // يجب أن يكون المُنشئ الافتراضي خاصًا، ويجب الانتباه إلى عدم فتحه في الفئة.public static function getInstance () { if ( null === self :: $_instance ) { self :: $_instance = new self (); }return self :: $_instance ; } }class FrontController { use TSingleton ; }// يمكن استخدامها أيضًا في الفئات الموسعة مسبقًا class WebSite extends SomeClass { use TSingleton ; }وهذا يسمح بمحاكاة جوانب الوراثة المتعددة:
السمة TBounding { عامة $x ، $y ، $width ، $height ؛ }trait TMoveable { public function moveTo ( $x , $y ) { // … } }trait TResizeable { public function resize ( $newWidth , $newHeight ) { // … } }class Rectangle { use TBounding , TMoveable , TResizeable ;public function fillColor ( $color ) { // … } }الصدأ
تُعرّف السمة في لغة Rust مجموعة من الطرق التي يجب على نوع معين تنفيذها. [ 44 ] تتطلب مُجمّعات Rust شرح السمات، مما يضمن سلامة الأنواع العامة في Rust.
// يجب أن يحتوي النوع T على السمة "Ord" // حتى يمكن إجراء عمليات ">" و "<" fn max < T : Ord > ( a : & [ T ]) -> Option <& T > { let mut result = a.first ( ) ?; for n in a { if * n > * result { result = & n ; } } Some ( result ) }لتبسيط عملية تنفيذ السمات المملة والمتكررة مثل Debugو Ord، deriveيمكن استخدام الماكرو لطلب من المترجمات توليد تطبيقات معينة تلقائيًا. [ 45 ] تشمل السمات المشتقة: Clone، Copy، ، Debug، Default، PartialEq، Eq، PartialOrdو Ord.Hash
انظر أيضاً
مراجع
- 1 2 3 شارلي، ناثانيل؛ دوكاس، ستيفان؛ نيرستراز، أوسكار ؛ بلاك، أندرو ب. (2003). "السمات: وحدات سلوكية قابلة للتركيب" (ملف PDF) . وقائع المؤتمر الأوروبي حول البرمجة كائنية التوجه (ECOOP) . سلسلة محاضرات في علوم الحاسوب. المجلد 2743. سبرينغر. الصفحات 248-274 . CiteSeerX 10.1.1.1011.8 . doi : 10.1007/978-3-540-45070-2_12 . ISBN 978-3-540-45070-2.
- ↑ دوكاس، ستيفان؛ نيرستراز، أوسكار؛ شارلي، ناثانيل؛ وويتس، رويل؛ بلاك، أندرو ب. (مارس 2006). "السمات: آلية لإعادة الاستخدام الدقيق". معاملات ACM في لغات البرمجة والأنظمة . 28 (2): 331-388 . CiteSeerX 10.1.1.64.2480 . doi : 10.1145/1119479.1119483 . S2CID 16434119 .
- ↑ فيشر، كاثلين ؛ ريبي، جون (2003). السمات المصنفة بشكل ثابت (ملف PDF) (تقرير). جامعة شيكاغو . مؤرشف (ملف PDF) من الأصل في 17 مايو 2004.
- ↑ فيشر، كاثلين؛ ريبي، جون (2004). حساب مُصنَّف للسمات (ملف PDF) . ورشة العمل الحادية عشرة حول أسس البرمجة كائنية التوجه . جامعة شيكاغو .
- ↑ كاري، غايل؛ باير، لاري؛ ليبكي، دانيال؛ لي، بروس (1982). السمات: منهج لتصنيف الفئات الفرعية متعددة الوراثة . مؤتمر SIGOA لأنظمة معلومات المكاتب. فيلادلفيا، بنسلفانيا، الولايات المتحدة الأمريكية: مطبعة ACM. الصفحات 1-9 . doi : 10.1145/966873.806468 .
- ↑ فان كوتسم، توم؛ بيرجل، ألكسندر؛ دوكاس، ستيفان؛ دي موتر، وولفغانغ (2009). إضافة التحكم في الحالة والرؤية إلى السمات باستخدام التداخل المعجمي (ملف PDF) . المؤتمر الأوروبي للبرمجة كائنية التوجه (ECOOP 2009). سلسلة محاضرات في علوم الحاسوب. المجلد 5653. سبرينغر-فيرلاغ. الصفحات 220-243 . CiteSeerX 10.1.1.372.1265 . doi : 10.1007/978-3-642-03013-0_11 . ISBN 978-3-642-03012-3.
- ↑ "أساليب الواجهة الافتراضية" . ما الجديد في C# 8.0 . مايكروسوفت . تم الاطلاع عليه بتاريخ 29 نوفمبر 2019 .
- ↑ "تحديث شامل للواجهات في لغة C# 8.0" . التنفيذ الافتراضي في الواجهات في لغة C# 8.0 . Talking Dotnet. 9 سبتمبر 2019. تاريخ الاطلاع: 29 نوفمبر 2019 .
- ↑ "iterator_traits < Iterator > " . مكتبة القوالب القياسية . SGI.
- ↑ مايرز، ناثان سي. (يونيو 1995). "السمات: تقنية قوالب جديدة ومفيدة" . تقرير C++ . تم الاطلاع عليه في 23 يناير 2016 .
- ↑ أبراهامز، ديفيد. "تقنيات البرمجة العامة: السمات" . مكتبات Boost C++ . تم الاطلاع عليه بتاريخ 23 يناير 2016 .
- ↑ ستيل، جاي ؛ مايسن، جان ويليم (11 يونيو 2006). "دليل لغة برمجة فورتريس" (ملف PDF) . صن مايكروسيستمز . تم الاطلاع عليه في 23 يناير 2016 .
- ↑ "البرمجة الكائنية: السمات" . لغة برمجة Groovy . تم الاطلاع عليه بتاريخ 23 يناير 2016 .
- ↑ "Haxe 2.4.0 - Haxe - مجموعة أدوات متعددة المنصات" . Haxe - مجموعة أدوات متعددة المنصات . تم الاطلاع عليه بتاريخ 12 سبتمبر 2017 .
- ↑ "دليل - هاكس - مجموعة أدوات متعددة المنصات" . هاكس - مجموعة أدوات متعددة المنصات . تم الاطلاع عليه بتاريخ 12-09-2017 .
- ↑ "الأساليب الافتراضية" . دروس جافا . أوراكل . تم الاطلاع عليه في 23 يناير 2016 .
- ↑ ليكوري، لويجي؛ سبيواك، أرنو (2008). "FeatherTrait: امتداد بسيط لـ Featherweight Java" . معاملات ACM في لغات البرمجة والأنظمة . 30 (2): 11:1. doi : 10.1145/1330017.1330022 . S2CID 17231803 .
- ↑ ليكوري، لويجي؛ سبيواك، أرنو (2008). "توسيع مكتبة FeatherTrait Java باستخدام الواجهات" . علوم الحاسوب النظرية . 398 ( 1-3 ): 243-260 . doi : 10.1016/j.tcs.2008.01.051 . S2CID 12923128 .
- ↑ بونو، فيفيانا؛ مينسا، إنريكو؛ ناديو، ماركو (سبتمبر 2014). البرمجة الموجهة بالسمات في جافا 8. المؤتمر الدولي حول مبادئ وممارسات البرمجة على منصة جافا: الآلات الافتراضية واللغات والأدوات (PPPJ '14) . الصفحات 181-186 . CiteSeerX 10.1.1.902.161 . doi : 10.1145/2647508.2647520 .
- ↑ فورسلوند، إميل (3 فبراير 2016). "تعريف نمط السمة في جافا" . عصر جافا . مؤرشف من الأصل في 4 أغسطس 2016. تم الاسترجاع في 3 فبراير 2016 .
- ↑ سيليجر، بيتر (11 أبريل 2014). "مواهب جافا سكريبت المتعددة" . تم الاطلاع عليه في 23 يناير 2015 .
- ↑ "Traits.js: سمات جافا سكريبت" . تم الاطلاع عليه بتاريخ 23 يناير 2016 .
- ↑ فان كوتسم، توم؛ ميلر، مارك س. (2012). "تركيب السمات القوي لجافا سكريبت" (ملف PDF) . مجلة علوم برمجة الحاسوب . تم الاطلاع عليه بتاريخ 23 يناير 2016 .
- ↑ "CocktailJS" . تم الاطلاع عليه بتاريخ 23 يناير 2016 .
- ↑ ماورو فيردر. "SimpleTraits.jl" . جيت هاب . تم الاطلاع عليه في 23 مارس 2017 .
- ↑ "الواجهات" . مرجع كوتلين . جيت برينز . تم الاطلاع عليه في 23 يناير 2016 .
- ↑ بريسلاف، أندريه (29 مايو 2015). "إصدار Kotlin M12 متوفر الآن!" . مدونة Kotlin . JetBrains . تم الاطلاع عليه في 23 يناير 2016 .
- ^ “السمات” . دليل اللغة لاسو . لاسوسوفت. 6 يناير 2014 . تم الاسترجاع في 23 كانون الثاني (يناير) 2016 .
- ↑ "Modular Docs - سجل تغييرات Mojo" . docs.modular.com . تم الاطلاع عليه بتاريخ 13-12-2023 .
- ↑ كروماتيك (30 أبريل 2009). "لماذا أدوار بيرل؟" . تم الاطلاع عليه في 23 يناير 2016 .
- ↑ كورتيس "أوفيد" بو. "مقترح كورينا للبرمجة الكائنية" . طلب تعليقات كورينا . تم الاطلاع عليه في 30 سبتمبر 2022 .
- ↑ "السمات" . وثائق PHP . مجموعة PHP . تم الاطلاع عليه في 23 يناير 2016 .
- ↑ مار، ستيفان (9 يناير 2011). "طلب تعليقات: إعادة الاستخدام الأفقي في PHP" . ويكي PHP.net . مجموعة PHP . تم الاطلاع عليه في 31 يناير 2011 .
- ↑ بيرا، تيبو. "توثيق py3traits" . تم الاسترجاع في 23 كانون الثاني (يناير) 2016 .
- ^ بيرا ، تيبو (25/03/2015). "py2traits" . جيثب . تم الاسترجاع في 23 كانون الثاني (يناير) 2016 .
- ↑ "صفوف المزج من الدرجة العليا" . مؤرشف من الأصل بتاريخ 2016-10-09.
- ↑ "السمات" . مرجع المضرب . تم الاسترجاع في 23 يناير 2016 .
- ↑ ديفيد ناسيبي (14 فبراير 2004). "السمات في روبي" . روبي ناسيبي . تم الاطلاع عليه في 23 يناير 2016 .
- ↑ "السمات" . لغة برمجة Rust . تم الاطلاع عليه في 30 سبتمبر 2019 .
- ^ “السمات” . جولة في سكالا . مدرسة البوليتكنيك الفيدرالية في لوزان . تم الاسترجاع في 23 كانون الثاني (يناير) 2016 .
- ↑ نيوارد، تيد (29 أبريل 2008). "دليل مطور جافا المشغول إلى سكالا: حول السمات والسلوكيات" . IBM developerWorks . IBM . تم الاطلاع عليه في 23 يناير 2016 .
- ↑ "السمات في 10 دقائق" . فارو: كتاب التعاون النشط . تم الاطلاع عليه في 23 يناير 2016 .
- ^ هولمانز ، ماتياس (22 يوليو 2015). "الخلطات والسمات في Swift 2.0" . تم الاسترجاع في 23 كانون الثاني (يناير) 2016 .
- ↑ "السمات - مقدمة في البرمجة باستخدام لغة Rust" . مؤرشف من الأصل بتاريخ 29-05-2023.
- ↑ "السمات - لغة برمجة Rust" .
روابط خارجية
- "السمات: وحدات سلوكية قابلة للتركيب" . مجموعة تأليف البرمجيات . جامعة برن.
- لغة سي++
- مواضيع لغات البرمجة
- نظرية الأنواع
