السمة (البرمجة)

في البرمجة الكائنية التوجه ، يمكن أن تحتوي الفئات على سمات وأساليب .
يمكن تمثيل السمة في قاعدة البيانات العلائقية كعمود أو حقل.

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

القواعد والكتابة

  • القواعد: لكل سمة مُسماة مجموعة قواعد مرتبطة بها تُسمى العمليات : على سبيل المثال، لا يتم جمع الأحرف أو معالجة مصفوفة أعداد صحيحة بنفس طريقة معالجة كائن صورة. كما لا يتم معالجة النص كما لو كان عددًا عشريًا .
  • أنواع البيانات: يترتب على ذلك أنه يمكن توسيع تعريف الكائن عن طريق فرض أنواع البيانات التي يمكن أن تتكون من تنسيق تمثيل وقيمة افتراضية وعمليات قانونية (قواعد) وقيود (مثل "لا يُسمح بالقسمة على صفر")، وكلها عناصر محتملة في تعريف سمة، أو على العكس من ذلك، يمكن اعتبارها سمات لنوع هذا الكائن.

لا تُفكّ شفرة تنسيقات ملفات الصور (مثل JPEG و PNG و BMP ) باستخدام العمليات نفسها (مهما بدت الصور متشابهة ، فهي جميعها تنسيقات بيانات رسومية). وبالمثل، لا تستخدم لغة البرمجة العمليات نفسها لتقييم عدد عشري وأعداد صحيحة طويلة.

على سبيل المثال، في رسومات الحاسوب، يمكن أن تحتوي عناصر الخطوط على خصائص مثل السُمك (بقيم حقيقية)، واللون (بقيم وصفية مثل البني أو الأخضر، أو قيم مُحددة في نموذج ألوان معين، مثل RGB)، وخصائص التقطيع، وما إلى ذلك. ويمكن تعريف عنصر الدائرة بخصائص مماثلة بالإضافة إلى نقطة الأصل ونصف القطر. وفيما يتعلق بأنظمة الحاسوب، تُعرَّف الخصائص خصيصًا لخصائص القراءة أو الكتابة، وذلك لأغراض قراءة أو كتابة محددة.

استخدام السمة

إذا كان من الممكن اعتبار العنصر المعني خاصية ( CUSTOMER_NAME) لكيان آخر (لنفترض CUSTOMER)، فيمكن أن يكون للعنصر صفر أو أكثر من السمات (الخصائص) الخاصة به ( CUSTOMER_NAMEهو من TYPE = "KINDOFTEXT").

ج

أدخلت لغة C السمات في الإصدار C23 ، بعد الإصدار C++11. [ 1 ]

[[ nodiscard ]] int add ( int a , int b , [[ maybe_unused ]] int c ) { return a + b ; }

لغة سي++

تدعم لغة C++ كلاً من السمات والتعليقات التوضيحية.

أضافت لغة C++11 سمات، وهي مؤشرات للمترجم لبعض المعلومات. ومع ذلك، فهي إما محددة بشكل قياسي أو محددة من قبل التنفيذ، ولا يمكن إنشاء سمات مخصصة. [ 2 ]

class Integer { private : [[ no_unique_address ]] int x ; public : [[ nodiscard ]] bool isPositive () const noexcept { if ( x > 0 ) [[ likely ]] { return true ; } return false ; } };

أضافت لغة C++26 التعليقات التوضيحية التي يمكن إنشاؤها والوصول إليها باستخدام الانعكاس ، مما يسمح بإرفاق بيانات وصفية عشوائية. [ 3 ]

استيراد std ؛باستخدام std :: string ;// بعض التعليقات التوضيحية المُعرَّفة في مساحة الاسم wikipedia::examples باستخدام wikipedia :: examples :: Debug ؛ باستخدام wikipedia :: examples :: EnumFlag ؛ باستخدام wikipedia :: examples :: Rename ؛enum class [[ = EnumFlag ]] Toggle : uint8_t { Off , On };struct [[ = Debug ]] Person { [[ = Rename ( "full name" )]] string fullName ; int age ; };

سي شارب

في لغة البرمجة C# ، تُعدّ السمات بيانات وصفية مُلحقة بحقل أو كتلة من التعليمات البرمجية، مثل التجميعات والأعضاء والأنواع ، وهي تُعادل التعليقات التوضيحية في لغة Java . [ 4 ] يمكن الوصول إلى السمات من قِبل المُصرّف وبرمجيًا عبر الانعكاس . في المقابل، تُعتبر الخصائص، في مصطلحات C#، أعضاءً في فئة، وتُستخدم نحويًا مثل متغيرات النسخة (أو الفئة)، ولكنها تُنفّذ كزوج من دوال الوصول والتعديل. (في حال عدم وجود دالة تعديل، تكون الخصائص للقراءة فقط).

يلاحظ مستخدمو هذه اللغة أمثلة عديدة تُستخدم فيها السمات لمعالجة قضايا شاملة واستخدامات أخرى متعلقة بالآليات أو المنصات. وهذا يُعطي انطباعًا خاطئًا بأن هذا هو الغرض الوحيد المقصود منها.

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

يتم تنفيذ السمات كفئات مشتقة من . وغالبًا ما تستخدمها خدمات CLR ، مثل قابلية التشغيل البيني لـ COM ، والاتصال عن بعد ، والتسلسل ، ويمكن الاستعلام عنها في وقت التشغيل.System.Attribute

يوضح المثال كيفية تعريف السمات في لغة C#:

// يتسبب في ظهور رسالة من المُصرّف تقول أن [Obsolete("استخدم الفئة NewClass بدلاً من ذلك", IsError = true)] public class ObsoleteClass { // ... }public class NewClass { // ... }// ينتهي اسم الفئة بـ "Attribute" // ولكن يمكن استخدامه كـ "Obsolete" public class ObsoleteAttribute : Attribute { public string Message { get ; } public bool IsError { get ; set ; } public ObsoleteAttribute () {...} public ObsoleteAttribute ( string msg ) {...} public ObsoleteAttribute ( string msg , bool error ) {...} }[مهجور] [مهجور("هذا مهجور")] [مهجور("هذا مهجور", خطأ)] [مهجور("هذا مهجور", IsError = خطأ)]

تُعدّ المعاملات الموضعية، مثل المعامل الأول من نوع سلسلة نصية المذكور أعلاه، معاملاتٍ لمنشئ الخاصية. أما معاملات الاسم، مثل المعامل المنطقي في المثال، فهي خاصيةٌ للخاصية ويجب أن تكون قيمتها ثابتة. [ 5 ]

ينبغي مقارنة السمات بوثائق XML التي تحدد أيضًا البيانات الوصفية، ولكنها غير مضمنة في التجميع المترجم وبالتالي لا يمكن الوصول إليها برمجيًا.

HTML وجافا سكريبت

اعرض سمة وخاصية مربع الاختيار المحددة أثناء تغييرها.

< ! doctype html > <html> <body>< input id = "check1" type = "checkbox" checked = " checked" > < label for = "check1" > ضع علامة هنا </ label > <p> </p><script> document.getElementById ( 'check1' ) . addEventListener ( ' change ' , function ( e ) { var input = this ; var p = document.querySelector ( ' p ' ); p.innerHTML = "input.checked : <b> " + ( input.checked ? ' true ' : ' false ' ) + " </b> " } ) ; </script> </body> </html>

جافا

تستخدم لغة جافا التعليقات التوضيحية لحمل البيانات الوصفية على الرموز أو لتنفيذ توليد التعليمات البرمجية، ويمكن الوصول إليها باستخدام الانعكاس. [ 6 ]

فئة مجردة حيوان { دالة عامة مجردة تتحدث ();public String getType () { return "Generic animal" ; } }class Cat extends Animal { @Override public void speak () { System . out . println ( "مواء!" ); }@Override public String getType () { return "Cat" ; } }

قواعد البيانات متعددة القيم

في العديد من أنظمة قواعد البيانات ما بعد العلائقية أو متعددة القيم ، مقارنةً بلغة SQL، تُعتبر الجداول ملفات، والصفوف عناصر، والأعمدة سمات. في كلٍ من قاعدة البيانات والبرمجيات، تُعتبر السمة مرادفةً للخاصية والمتغير، مع إمكانية تعريف السمات بشكلٍ أدق لتشمل القيم والقيم الفرعية.

كانت قاعدة بيانات Pick هي الأولى من بين هذه القواعد . ومن بين المنصات الحالية قاعدة بيانات Universe التابعة لشركة Rocket U2 وقاعدة بيانات Caché التابعة لشركة InterSystems .

بايثون

في لغة بايثون ، تُسمى السمات "المُزخرفات"، وهي أي دالة قابلة للاستدعاء يمكنها توسيع أو تعديل دالة أو متغير أو فئة أخرى دون تغيير شفرتها المصدرية. [ 7 ] يُرمز للمُزخرف بالرمز `<decorator>` @، ويظهر أعلى تعريف الدالة.

من functools استورد wraps، ومن typing استورد Any و Callable و TypeVarT = TypeVar ( "T" )دالة `log_call` ( دالة ` func` : `Callable [ ... , T ]`) -> دالة `Callable [ ... , T ]`: `@wraps ( دالة `func` ) ` دالة ` wrapper` ( * ` args` : `tuple [ int , ... ]`, ** ` kwargs` : `dict [ str , str ]`) -> T` : `print ( f "استدعاء { دالة ` func .__ name__` } مع الوسائط ` args` و` kwargs` ) ` ` return` : T = دالة `func` ( * `args` , ** ` kwargs` ) `print ( f " أعادت { دالة ` func .__ name__` القيمة ` { result } ` )` ) `return result` `return wrapper`@log_call def add ( a : int , b : int ) -> int : return a + b@log_call def greet ( name : str ) -> str : return f "مرحباً، { name } !"

الصدأ

في لغة Rust ، يُوضع تعريف السمة #[attr]على أي رمز، أو حتى على العبارات. تُعدّل السمات طريقة تجميع الكود أو سلوكه من خلال إرفاق بيانات وصفية بالرمز. في Rust، تُعتبر السمات نوعًا من وحدات الماكرو الإجرائية ، التي تعمل على بنية Rust من خلال استهلاك الكود وإنتاجه. [ 8 ]

تُعرَّف العديد من وحدات الماكرو في اللغة، ولكن يتم إنشاء وحدات ماكرو جديدة باستخدام وحدات الماكرو الإجرائية. فيما يلي بعض الأمثلة على استخدام وحدات الماكرو الموجودة: [ 9 ]

// يُشير إلى دالة على أنها مضمنة #[inline] fn add ( a : i32 , b : i32 ) -> i32 { a + b }// يسمح بالمتغيرات غير المستخدمة #[allow(unused_variables)] fn example () { let x = 5 ; }// يتم تجميع الدالة بشكل مشروط إذا كانت المنصة هي Windows #[cfg(target_os = "windows" )] fn windows_only () { println! ( "التشغيل على Windows." ); }

يدعم Rust أيضًا #[derive(Ts...)]، والتي تسمى "وحدات الماكرو المشتقة"، والتي تستخدم لتنفيذ السمات تلقائيًا.

// تُنفذ Point تلقائيًا السمات Debug و Clone و PartialEq #[derive(Debug, Clone, PartialEq)] struct Point { x : i32 , y : i32 , }

سويفت

في لغة Swift ، تُرمز السمات بالحرف @، وتشير إلى بيانات وصفية إضافية للمترجم. ويمكن تجميعها في سمات تعريفية، وسمات أنواع، وأغلفة خصائص، وسمات تزامن، وسمات بناء الواجهات. [ 10 ]

@available ( iOS 17 , * ) func newFeature () { print ( " متوفر فقط على iOS 17+" ) }

XML

في لغة XML ، السمة هي بنية ترميزية تتكون من زوج اسم/قيمة، وتوجد داخل وسم بداية أو وسم عنصر فارغ . تستخدم لغات الترميز، مثل HTML و XML ، السمات لوصف البيانات وتنسيقها.

من الأمثلة الجيدة على ذلك عملية إسناد القيم إلى خصائص (عناصر) XML. لاحظ أن قيمة العنصر تُحدد قبل وسم الإغلاق (المنفصل)، وليس داخل العنصر نفسه. قد يحتوي العنصر نفسه على عدد من السمات المُحددة NAME = "IAMAPROPERTY".

إذا كان من الممكن اعتبار العنصر المعني خاصية ( CUSTOMER_NAME) لكيان آخر (لنفترض CUSTOMER)، فيمكن أن يكون للعنصر صفر أو أكثر من السمات (الخصائص) الخاصة به ( CUSTOMER_NAMEهو من TYPE = "KINDOFTEXT").

انظر أيضاً

مراجع

  1. cppreference.com. "تسلسل مُحدِّد السمة (منذ C23)" . cppreference.com . cppreference.com . تم الاطلاع عليه في 3 مايو 2026 .
  2. cppreference.com. "تسلسل مُحدِّدات السمات (منذ C++11)" . cppreference.com . cppreference.com . تم الاطلاع عليه في 1 مايو 2026 .
  3. وايت تشيلدرز، دان كاتز، باري ريزفين، دافيد فانديفورد (19 يونيو 2025). "شروح للتأمل" . isocpp.org . WG21.{{cite web}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط )
  4. مايكروسوفت ليرن (19 مارس 2025). "الخصائص" . learn.microsoft.com . مايكروسوفت ليرن.
  5. ^ موسنبوك ، هانسبيتر (2002-03-25). ""C# المتقدم: عدد متغير من المعلمات"" (PDF) . معهد برمجيات النظم، جامعة يوهانس كيبلر لينز، Fachbereich Informatik. ص. 44 . تم الاسترجاع 2011/08/08 . 
  6. "التعليقات" . شركة صن مايكروسيستمز . مؤرشف من الأصل بتاريخ 25-09-2011 . تم الاطلاع عليه بتاريخ 30-09-2011 .
  7. مؤسسة برمجيات بايثون (7 أبريل 2026). "مسرد المصطلحات - المُزخرف" . docs.python.org . مؤسسة برمجيات بايثون.
  8. فريق Rust (16 أبريل 2026). "وحدات الماكرو الإجرائية - مرجع Rust" . doc.rust-lang.org . فريق Rust.
  9. فريق Rust (16 أبريل 2026). "السمات - مرجع Rust" . doc.rust-lang.org . فريق Rust.
  10. شركة آبل. "السمات" . docs.swift.org . شركة آبل . تم الاطلاع عليه بتاريخ 8 مايو 2026 .