الصف (برمجة الكمبيوتر)
في البرمجة الموجهة للكائنات ، تحدد الفئة الجوانب المشتركة للكائنات التي تم إنشاؤها من الفئة. تختلف قدرات الفئة بين لغات البرمجة ، ولكن بشكل عام تتكون الجوانب المشتركة من الحالة ( المتغيرات ) والسلوك ( الطرق ) التي ترتبط كل منها إما بكائن معين أو بكل كائنات تلك الفئة. [1] [2]
قد تختلف حالة الكائن بين كل مثيل للفئة، في حين أن حالة الفئة مشتركة بين جميع المثيلات. تتضمن طرق الكائن الوصول إلى حالة الكائن (عبر معلمة ضمنية أو صريحة تشير إلى الكائن) في حين أن طرق الفئة لا تتضمن ذلك.
إذا كانت اللغة تدعم الميراث ، فيمكن تعريف فئة بناءً على فئة أخرى بكل حالاتها وسلوكها بالإضافة إلى حالات وسلوكيات إضافية تزيد من تخصص الفئة. الفئة المتخصصة هي فئة فرعية ، والفئة التي تعتمد عليها هي فئتها العليا .
صفات
دورة حياة الكائن
كمثال لفئة، يتم إنشاء كائن من فئة عبر إنشاء مثيل . يتم تخصيص ذاكرة وتهيئتها لحالة الكائن ويتم توفير مرجع للكائن للكود المستهلك. يكون الكائن قابلاً للاستخدام حتى يتم تدميره - يتم إلغاء تخصيص ذاكرة حالته .
تسمح معظم اللغات بمنطق مخصص في أحداث دورة الحياة عبر المنشئ والمدمر .
يكتب
يعبر الكائن عن نوع البيانات كواجهة - نوع كل متغير عضو وتوقيع كل دالة عضو (طريقة). تحدد الفئة تنفيذًا لواجهة، ويؤدي إنشاء الفئة إلى كائن يعرض التنفيذ عبر الواجهة. [3] من حيث نظرية النوع، فإن الفئة هي تنفيذ - بنية بيانات ملموسة ومجموعة من البرامج الفرعية - بينما النوع هو واجهة . يمكن للفئات (الملموسة) المختلفة إنتاج كائنات من نفس النوع (المجرد) (حسب نظام النوع). على سبيل المثال، قد يتم تنفيذ مكدس النوع (الواجهة) بواسطة SmallStack وهو سريع للمكدسات الصغيرة ولكنه يتوسع بشكل سيئ و ScalableStack الذي يتوسع جيدًا ولكنه ذو تكلفة إضافية عالية للمكدسات الصغيرة.
بناء

تحتوي الفئة على أوصاف حقول البيانات (أو الخصائص أو الحقول أو عناصر البيانات أو السمات ). هذه عادةً أنواع حقول وأسماء سيتم ربطها بمتغيرات الحالة في وقت تشغيل البرنامج؛ تنتمي متغيرات الحالة هذه إما إلى الفئة أو إلى حالات محددة من الفئة. في معظم اللغات، يحدد الهيكل الذي تحدده الفئة تخطيط الذاكرة المستخدمة بواسطة حالاتها. هناك تنفيذات أخرى ممكنة: على سبيل المثال، تستخدم الكائنات في بايثون حاويات قيمة مفتاحية ارتباطية. [4]
تدعم بعض لغات البرمجة مثل Eiffel تحديد الثوابت كجزء من تعريف الفئة، وتفرضها من خلال نظام النوع. يعد تغليف الحالة ضروريًا للتمكن من فرض ثوابت الفئة.
سلوك
يتم تعريف سلوك الفئة أو مثيلاتها باستخدام الأساليب . الأساليب هي برامج فرعية لها القدرة على العمل على الكائنات أو الفئات. قد تغير هذه العمليات حالة الكائن أو توفر ببساطة طرقًا للوصول إليه. [5] توجد أنواع عديدة من الأساليب، لكن الدعم لها يختلف عبر اللغات. يتم إنشاء بعض أنواع الأساليب واستدعاؤها بواسطة كود المبرمج، بينما يتم إنشاء أساليب خاصة أخرى - مثل المنشئين والمدمرين ومشغلي التحويل - واستدعاؤها بواسطة كود تم إنشاؤه بواسطة المترجم. قد تسمح اللغة أيضًا للمبرمج بتعريف هذه الأساليب الخاصة واستدعائها. [6] [7]
واجهة الفصل
كل فئة تنفذ (أو تحقق ) واجهة من خلال توفير البنية والسلوك. تتكون البنية من البيانات والحالة، ويتكون السلوك من التعليمات البرمجية التي تحدد كيفية تنفيذ الأساليب. [8] هناك تمييز بين تعريف الواجهة وتنفيذ تلك الواجهة؛ ومع ذلك، فإن هذا الخط غير واضح في العديد من لغات البرمجة لأن إعلانات الفئة تحدد وتنفذ واجهة. ومع ذلك، توفر بعض اللغات ميزات تفصل بين الواجهة والتنفيذ. على سبيل المثال، يمكن للفئة المجردة تعريف واجهة دون توفير تنفيذ.
تسمح اللغات التي تدعم وراثة الفئة أيضًا للفئات بوراثة الواجهات من الفئات التي اشتُقت منها.
على سبيل المثال، إذا كانت "الفئة A" ترث من "الفئة B" وإذا كانت "الفئة B" تنفذ الواجهة "الواجهة B"، فإن "الفئة A" ترث أيضًا الوظيفة (إعلان الثوابت والطرق) التي توفرها "الواجهة B".
في اللغات التي تدعم مواصفات الوصول، تعتبر واجهة الفئة عبارة عن مجموعة من الأعضاء العامة للفئة، بما في ذلك كل من الأساليب والسمات (عبر أساليب get وsetter الضمنية )؛ لا يُقصد الاعتماد على أي أعضاء خاصة أو هياكل بيانات داخلية بواسطة كود خارجي وبالتالي فهي ليست جزءًا من الواجهة.
تنص منهجية البرمجة الموجهة للكائنات على أن عمليات أي واجهة من فئة ما يجب أن تكون مستقلة عن بعضها البعض. وينتج عن ذلك تصميم متعدد الطبقات حيث يستخدم عملاء الواجهة الأساليب المعلنة في الواجهة. ولا تفرض الواجهة أي متطلبات على العملاء لاستدعاء عمليات واجهة واحدة بأي ترتيب معين. ويتمتع هذا النهج بفائدة تتمثل في أن كود العميل يمكن أن يفترض أن عمليات الواجهة متاحة للاستخدام كلما كان لدى العميل حق الوصول إلى الكائن. [9] [ بحاجة لمصدر ]
- مثال لواجهة الفصل
الأزرار الموجودة في مقدمة جهاز التلفاز الخاص بك هي الواجهة بينك وبين الأسلاك الكهربائية الموجودة على الجانب الآخر من غلافه البلاستيكي. يمكنك الضغط على زر "الطاقة" لتشغيل التلفاز وإيقاف تشغيله. في هذا المثال، يكون جهاز التلفاز الخاص بك هو المثال، حيث يتم تمثيل كل طريقة بزر، وتشكل جميع الأزرار معًا الواجهة (أجهزة التلفاز الأخرى التي تحمل نفس طراز جهازك سيكون لها نفس الواجهة). في شكلها الأكثر شيوعًا، تكون الواجهة عبارة عن مواصفات لمجموعة من الطرق ذات الصلة دون أي تنفيذ مرتبط للطرق.
يحتوي جهاز التلفاز أيضًا على عدد لا يحصى من السمات ، مثل الحجم وما إذا كان يدعم الألوان، والتي تشكل معًا بنيته. تمثل الفئة الوصف الكامل لجهاز التلفاز، بما في ذلك سماته (بنيته) وأزراره (واجهته).
قد يكون الحصول على العدد الإجمالي لأجهزة التلفاز المصنعة طريقة ثابتة لفئة التلفاز. ترتبط هذه الطريقة بالفئة، ولكنها تقع خارج نطاق كل مثيل للفئة. الطريقة الثابتة التي تجد مثيلًا معينًا من مجموعة كل كائنات التلفاز هي مثال آخر.
إمكانية وصول الأعضاء
فيما يلي مجموعة مشتركة من مواصفات الوصول : [10]
- يقيد الخاص (أو الخاص بالفئة ) الوصول إلى الفئة نفسها. فقط الطرق التي تعد جزءًا من نفس الفئة يمكنها الوصول إلى الأعضاء الخاصين.
- تسمح المحمية (أو المحمية بالفئة ) للفئة نفسها وجميع فئاتها الفرعية بالوصول إلى العضو.
- عام يعني أنه يمكن لأي كود الوصول إلى العضو عن طريق اسمه.
على الرغم من أن العديد من لغات البرمجة الموجهة للكائنات تدعم مواصفات الوصول المذكورة أعلاه، إلا أن دلالاتها قد تختلف.
يستخدم التصميم الموجه للكائنات مواصفات الوصول بالتزامن مع التصميم الدقيق لتطبيقات الطرق العامة لفرض ثوابت الفئة - القيود المفروضة على حالة الكائنات. الاستخدام الشائع لمواصفات الوصول هو فصل البيانات الداخلية للفئة عن واجهتها: يتم جعل البنية الداخلية خاصة، بينما يمكن استخدام طرق الوصول العامة لفحص أو تغيير مثل هذه البيانات الخاصة.
لا تتحكم مواصفات الوصول بالضرورة في الرؤية ، حيث قد تكون حتى الأعضاء الخاصة مرئية للكود الخارجي للعميل. في بعض اللغات، قد تتم الإشارة إلى عضو غير قابل للوصول ولكنه مرئي في وقت التشغيل (على سبيل المثال، بواسطة مؤشر تم إرجاعه من دالة عضو)، ولكن سيتم منع محاولة استخدامه عن طريق الإشارة إلى اسم العضو من كود العميل بواسطة فاحص النوع. [11]
تفرض لغات البرمجة الموجهة للكائنات المختلفة إمكانية وصول الأعضاء ورؤيتهم بدرجات مختلفة، واعتمادًا على نظام نوع اللغة وسياسات التجميع، يتم فرضها إما في وقت التجميع أو وقت التشغيل . على سبيل المثال، لا تسمح لغة Java بتجميع كود العميل الذي يصل إلى البيانات الخاصة لفئة ما. [12] في لغة C++ ، تكون الطرق الخاصة مرئية، ولكن لا يمكن الوصول إليها في الواجهة؛ ومع ذلك، يمكن جعلها غير مرئية من خلال الإعلان صراحةً عن فئات مجردة تمامًا تمثل واجهات الفئة. [13]
تتميز بعض اللغات بمخططات إمكانية الوصول الأخرى:
- إمكانية الوصول إلى المثيل مقابل الفئة : تدعم Ruby مواصفات الوصول الخاصة بالمثيل والمحمية بالمثيل بدلاً من الخاصة بالفئة والمحمية بالفئة على التوالي. وتختلف هذه المواصفات في أنها تقيد الوصول بناءً على المثيل نفسه، وليس فئة المثيل. [14]
- الصديق : يدعم C++ آلية حيث يمكن للدالة المعلنة صراحةً كدالة صديقة للفئة الوصول إلى الأعضاء المعينين على أنهم خاصون أو محميون. [15]
- يعتمد على المسار : يدعم Java تقييد الوصول إلى عضو داخل حزمة Java ، وهو المسار المنطقي للملف. ومع ذلك، فمن الممارسات الشائعة عند توسيع إطار عمل Java تنفيذ الفئات في نفس الحزمة كفئة إطار عمل للوصول إلى الأعضاء المحمية. قد يوجد ملف المصدر في موقع مختلف تمامًا، وقد يتم نشره في ملف .jar مختلف، ومع ذلك يظل في نفس المسار المنطقي فيما يتعلق بـ JVM. [10]
الميراث
من الناحية المفاهيمية، فإن الفئة العليا هي مجموعة عليا من فئاتها الفرعية. على سبيل المثال، يمكن أن تكون GraphicObject فئة عليا من Rectangle و Ellipse ، بينما تكون Square فئة فرعية من Rectangle . هذه كلها علاقات مجموعات فرعية في نظرية المجموعات أيضًا، أي أن جميع المربعات مستطيلات ولكن ليست كل المستطيلات مربعات.
من الأخطاء المفاهيمية الشائعة الخلط بين جزء من العلاقة وفئة فرعية. على سبيل المثال، السيارة والشاحنة نوعان من المركبات وسيكون من المناسب نمذجتهما كفئات فرعية لفئة مركبة. ومع ذلك، سيكون من الخطأ نمذجة أجزاء السيارة كعلاقات بين فئات فرعية. على سبيل المثال، تتكون السيارة من محرك وجسم، ولكن لن يكون من المناسب نمذجة المحرك أو الجسم كفئة فرعية للسيارة.
في النمذجة الموجهة للكائنات، يتم عادةً نمذجة هذه الأنواع من العلاقات كخصائص للكائنات. في هذا المثال، ستحتوي فئة Car على خاصية تسمى parts . سيتم كتابة parts لحمل مجموعة من الكائنات، مثل حالات Body و Engine و Tires وما إلى ذلك. تتضمن لغات النمذجة الكائنية مثل UML إمكانيات لنمذجة جوانب مختلفة من "جزء من" وأنواع أخرى من العلاقات - البيانات مثل عدد الكائنات والقيود المفروضة على قيم الإدخال والإخراج وما إلى ذلك. يمكن استخدام هذه المعلومات بواسطة أدوات المطور لتوليد كود إضافي إلى جانب تعريفات البيانات الأساسية للكائنات، مثل التحقق من الأخطاء في طرق get وset . [16]
أحد الأسئلة المهمة عند نمذجة وتنفيذ نظام من فئات الكائنات هو ما إذا كان يمكن للفئة أن تحتوي على فئة فرعية واحدة أو أكثر. في العالم الحقيقي مع المجموعات الفعلية، سيكون من النادر العثور على مجموعات لم تتقاطع مع أكثر من مجموعة أخرى. ومع ذلك، في حين توفر بعض الأنظمة مثل Flavors وCLOS إمكانية لأكثر من عنصر أساسي للقيام بذلك في وقت التشغيل، فإن ذلك يؤدي إلى تعقيد يعتبره العديد من مجتمع الكائنات الموجهة مناقضا لأهداف استخدام فئات الكائنات في المقام الأول. قد يصبح فهم الفئة التي ستكون مسؤولة عن التعامل مع رسالة معقدًا عند التعامل مع أكثر من فئة فرعية واحدة. إذا تم استخدامها بلا مبالاة، يمكن أن تؤدي هذه الميزة إلى بعض تعقيدات النظام والغموض نفسه الذي تم تصميم فئات لتجنبه. [17]
تتطلب أغلب لغات البرمجة الموجهة للكائنات الحديثة مثل Smalltalk وJava وراثة واحدة في وقت التشغيل. بالنسبة لهذه اللغات، قد تكون الوراثة المتعددة مفيدة للنمذجة ولكن ليس للتنفيذ.
ومع ذلك، فإن كائنات تطبيقات الويب الدلالية تحتوي على عدة فئات عليا. وتتطلب تقلبات الإنترنت هذا المستوى من المرونة، وقد صُممت معايير التكنولوجيا مثل لغة علم مصطلحات الويب (OWL) لدعمها.
هناك مشكلة مماثلة وهي ما إذا كان من الممكن تعديل التسلسل الهرمي للفئات في وقت التشغيل أم لا. تدعم لغات مثل Flavors وCLOS وSmalltalk هذه الميزة كجزء من بروتوكولات الكائنات الفوقية الخاصة بها . نظرًا لأن الفئات هي نفسها كائنات من الدرجة الأولى، فمن الممكن أن تغير هيكلها ديناميكيًا عن طريق إرسال الرسائل المناسبة إليها. لا تسمح اللغات الأخرى التي تركز بشكل أكبر على الكتابة القوية مثل Java وC++ بتعديل التسلسل الهرمي للفئات في وقت التشغيل. تتمتع كائنات الويب الدلالي بالقدرة على إجراء تغييرات وقت التشغيل على الفئات. الأساس المنطقي مشابه لتبرير السماح بوجود فئات عليا متعددة، حيث أن الإنترنت ديناميكي ومرن للغاية لدرجة أن التغييرات الديناميكية في التسلسل الهرمي مطلوبة لإدارة هذا التقلب. [18]
على الرغم من أن العديد من اللغات القائمة على الفئات تدعم الوراثة، إلا أن الوراثة ليست جانبًا جوهريًا للفئات. تدعم لغة تعتمد على الكائنات (مثل Visual Basic الكلاسيكية ) الفئات ولكنها لا تدعم الوراثة.
العلاقات بين الطبقات
قد تدعم لغة البرمجة ميزات مختلفة لعلاقات الفئات.
تكويني
يمكن أن تتكون الفئات من فئات أخرى، وبالتالي إنشاء علاقة تركيبية بين الفئة المحيطة والفئات المضمنة فيها. تُعرف العلاقة التركيبية بين الفئات أيضًا باسم علاقة has-a . [19] على سبيل المثال، يمكن أن تتكون الفئة "Car" من فئة "Engine" وتحتوي عليها. لذلك، تحتوي السيارة على محرك. أحد جوانب التركيب هو الاحتواء، وهو احتواء مثيلات المكونات بواسطة المثيل الذي يحتوي عليها. إذا كان الكائن المحيط يحتوي على مثيلات مكونات حسب القيمة، فإن المكونات والكائن المحيط بها لها عمر افتراضي مماثل . إذا كانت المكونات مضمنة بالإشارة، فقد لا يكون لها عمر افتراضي مماثل. [20] على سبيل المثال، في Objective-C 2.0:
@interface السيارة : NSObject
@property NSString * الاسم ؛ @property المحرك * المحرك @property NSArray * الإطارات ؛
@نهاية
تحتوي فئة Car هذه على مثيل لـ NSString ( كائن سلسلة )، و Engine ، و NSArray (كائن مصفوفة).
هرمي
يمكن اشتقاق الفئات من فئة واحدة أو أكثر موجودة، وبالتالي إنشاء علاقة هرمية بين الفئات المشتقة ( الفئات الأساسية ، أو الفئات الأصلية أوالفئات العليا ) والفئة المشتقة (الفئة الفرعيةأوالفئة الفرعية). تُعرف العلاقة بين الفئة المشتقة والفئات المشتقة منها عادةً باسم علاقة is-a .[21]على سبيل المثال، يمكن اشتقاق الفئة 'Button' من الفئة 'Control'. وبالتالي، فإن الزرهو عنصرتوريثالأعضاء البنيوية والسلوكية للفئات الأصليةبواسطة الفئة الفرعية. يمكن للفئات المشتقة تحديد أعضاء بنيوية إضافية (حقول البيانات) وأعضاء سلوكية (طرق) بالإضافة إلى تلك التيترثهاوبالتالي فهيتخصصاتلفئاتها العليا. أيضًا، يمكن للفئات المشتقةتجاوزالطرق الموروثة إذا سمحت اللغة بذلك.
لا تدعم جميع اللغات الوراثة المتعددة. على سبيل المثال، تسمح Java للفئة بتنفيذ واجهات متعددة، ولكنها ترث من فئة واحدة فقط. [22] إذا سُمح بالوراثة المتعددة، فإن التسلسل الهرمي عبارة عن رسم بياني غير دوري موجه (أو DAG باختصار)، وإلا فهو شجرة . يحتوي التسلسل الهرمي على فئات كعقد وعلاقات وراثة كروابط. من المرجح أن ترتبط الفئات في نفس المستوى أكثر من الفئات في مستويات مختلفة. تسمى مستويات هذا التسلسل الهرمي طبقات أو مستويات تجريد.
مثال (كود Objective-C 2.0 المبسط، من iPhone SDK):
@interface UIResponder : NSObject //... @interface UIView : UIResponder //... @interface UIScrollView : UIView //... @interface UITableView : UIScrollView //...
في هذا المثال، UITableView هو UIScrollView وهو UIView وهو UIResponder وهو NSObject.
النمذجة
في التحليل الموجه للكائنات وفي لغة النمذجة الموحدة (UML)، يمثل الارتباط بين فئتين تعاونًا بين الفئات أو مثيلاتها المقابلة. للارتباطات اتجاه؛ على سبيل المثال، يشير الارتباط ثنائي الاتجاه بين فئتين إلى أن كلتا الفئتين على دراية بعلاقتهما. [23] يمكن تسمية الارتباطات وفقًا لاسمها أو غرضها. [24]
يتم إعطاء دور الارتباط في نهاية الارتباط ويصف دور الفئة المقابلة. على سبيل المثال، يصف دور "المشترك" الطريقة التي تشارك بها مثيلات الفئة "الشخص" في ارتباط "المشترك في" مع الفئة "المجلة". أيضًا، تحتوي "المجلة" على دور "المجلة المشتركة" في نفس الارتباط. تصف تعدد أدوار الارتباط عدد المثيلات التي تتوافق مع كل مثيل للفئة الأخرى من الارتباط. التعددات الشائعة هي "0..1"، "1..1"، "1..*" و"0..*"، حيث يحدد "*" أي عدد من المثيلات. [23]
التصنيف
هناك العديد من فئات الطبقات، بعضها متداخل.
مجردة وملموسة
في لغة تدعم الميراث، تعتبر الفئة المجردة ، أو الفئة الأساسية المجردة ( ABC )، فئة لا يمكن إنشاؤها بشكل مباشر. وعلى النقيض من ذلك، فإن الفئة الملموسة هي فئة يمكن إنشاؤها بشكل مباشر. لا يمكن إنشاء فئة مجردة إلا بشكل غير مباشر، عبر فئة فرعية ملموسة .
يتم وضع علامة على الفئة المجردة على هذا النحو صراحةً أو قد تحدد ببساطة طرقًا مجردة (أو طرقًا افتراضية ). قد توفر الفئة المجردة تنفيذات لبعض الطرق، وقد تحدد أيضًا طرقًا افتراضية عبر التوقيعات التي سيتم تنفيذها بواسطة أحفاد مباشرين أو غير مباشرين للفئة المجردة. قبل أن يتم إنشاء فئة مشتقة من فئة مجردة، يجب تنفيذ جميع الطرق المجردة لفئاتها الأصلية بواسطة بعض الفئات في سلسلة الاشتقاق. [25]
تسمح معظم لغات البرمجة الموجهة للكائنات للمبرمج بتحديد الفئات التي تعتبر مجردة ولن تسمح بإنشاء مثيلات لها. على سبيل المثال، في Java و C# و PHP ، يتم استخدام الكلمة الأساسية abstract . [26] [27] في C++ ، الفئة المجردة هي فئة تحتوي على طريقة مجردة واحدة على الأقل يتم إعطاؤها بواسطة بناء الجملة المناسب في تلك اللغة (دالة افتراضية بحتة في لغة C++). [25]
تُسمى الفئة التي تتكون من طرق افتراضية خالصة فقط بفئة أساسية مجردة خالصة (أو ABC خالصة ) في لغة C++ وتُعرف أيضًا باسم واجهة من قبل مستخدمي اللغة. [13] تدعم لغات أخرى، ولا سيما Java وC#، نوعًا مختلفًا من الفئات المجردة يُسمى واجهة عبر كلمة أساسية في اللغة. في هذه اللغات، لا يُسمح بالوراثة المتعددة ، ولكن يمكن للفئة تنفيذ واجهات متعددة. لا يمكن أن تحتوي هذه الفئة إلا على طرق مجردة يمكن الوصول إليها علنًا. [22] [28] [29]
محلي وداخلي
في بعض اللغات، يمكن إعلان الفئات في نطاقات أخرى غير النطاق العالمي. هناك أنواع مختلفة من هذه الفئات.
الطبقة الداخلية هي طبقة محددة داخل طبقة أخرى. يمكن أيضًا التعامل مع العلاقة بين الطبقة الداخلية والطبقة التي تحتويها كنوع آخر من ارتباط الطبقة. لا ترتبط الطبقة الداخلية عادةً بمثيلات الطبقة المحيطة ولا يتم إنشاؤها مع فئتها المحيطة. اعتمادًا على اللغة، قد يكون من الممكن أو لا يكون من الممكن الإشارة إلى الطبقة من خارج الطبقة المحيطة. المفهوم ذو الصلة هو الأنواع الداخلية ، والمعروفة أيضًا باسم نوع البيانات الداخلي أو النوع المتداخل ، وهو تعميم لمفهوم الطبقات الداخلية. C++ هو مثال للغة تدعم كل من الطبقات الداخلية والأنواع الداخلية (عبر إعلانات typedef ). [30] [31]
الفئة المحلية هي فئة محددة داخل إجراء أو وظيفة. يحد هذا الهيكل من الإشارات إلى اسم الفئة ضمن النطاق الذي تم فيه إعلان الفئة. اعتمادًا على القواعد الدلالية للغة، قد تكون هناك قيود إضافية على الفئات المحلية مقارنة بالفئات غير المحلية. أحد القيود الشائعة هو عدم السماح لأساليب الفئة المحلية بالوصول إلى المتغيرات المحلية للوظيفة المحيطة. على سبيل المثال، في C++، قد تشير الفئة المحلية إلى المتغيرات الثابتة المعلنة داخل الوظيفة المحيطة بها، ولكن قد لا تتمكن من الوصول إلى المتغيرات التلقائية للوظيفة . [32]
ميتاكلاس
الفئة الوصفية هي فئة حيث تكون الحالات عبارة عن فئات. [33] تصف الفئة الوصفية بنية مشتركة لمجموعة من الفئات ويمكنها تنفيذ نمط تصميم أو وصف أنواع معينة من الفئات. غالبًا ما تُستخدم الفئات الوصفية لوصف الأطر . [34]
في بعض اللغات، مثل Python أو Ruby أو Smalltalk ، تكون الفئة أيضًا كائنًا؛ وبالتالي فإن كل فئة هي مثال لفئة ميتا فريدة مدمجة في اللغة. [4] [35] [36] يوفر نظام كائنات Common Lisp (CLOS) بروتوكولات ميتا كائنات (MOPs) لتنفيذ تلك الفئات والفئات الميتا. [37]
مختوم
لا يمكن إنشاء فئة فرعية للفئة المختومة. فهي في الأساس عكس الفئة المجردة ، والتي يجب اشتقاقها لاستخدامها. الفئة المختومة ملموسة ضمناً .
فئة تم إعلانها كمختومة عبر الكلمة الأساسية sealedفي C# أو finalفي Java أو PHP. [38] [39] [40]
على سبيل المثال، تم وضع علامة على فئة Java Stringباعتبارها نهائية . [41]
قد تسمح الفئات المختومة للمترجم بإجراء تحسينات غير متاحة للفئات التي يمكن تقسيمها إلى فئات فرعية. [42]
يفتح
يمكن تغيير الفئة المفتوحة. عادةً، لا يمكن للعملاء تغيير البرنامج القابل للتنفيذ . يمكن للمطورين غالبًا تغيير بعض الفئات، ولكن لا يمكنهم عادةً تغيير الفئات القياسية أو المضمنة. في Ruby ، تكون جميع الفئات مفتوحة. في Python ، يمكن إنشاء الفئات في وقت التشغيل، ويمكن تعديلها جميعًا بعد ذلك. [43] تسمح فئات Objective-C للمبرمج بإضافة طرق إلى فئة موجودة دون الحاجة إلى إعادة تجميع تلك الفئة أو حتى الوصول إلى كود المصدر الخاص بها.
ميكسين
تتمتع بعض اللغات بدعم خاص للمزيجات ، ولكن في أي لغة ذات وراثة متعددة، يكون المزيج ببساطة فئة لا تمثل علاقة is-a-type-of. تُستخدم المزيجات عادةً لإضافة نفس الأساليب إلى فئات متعددة؛ على سبيل المثال، قد توفر فئة UnicodeConversionMixin طريقة تسمى unicode_to_ascii عند تضمينها في الفئات FileReader و WebPageScraper التي لا تشترك في أصل مشترك.
جزئي
لا يستشهد هذا القسم بأي مصادر . ( أبريل 2012 ) |
في اللغات التي تدعم هذه الميزة، تكون الفئة الجزئية عبارة عن فئة يمكن تقسيم تعريفها إلى عدة أجزاء، داخل ملف كود مصدر واحد أو عبر ملفات متعددة. [44] يتم دمج الأجزاء في وقت التجميع، مما يجعل ناتج المترجم هو نفسه بالنسبة للفئة غير الجزئية.
الدافع الأساسي لتقديم الفئات الجزئية هو تسهيل تنفيذ مولدات التعليمات البرمجية ، مثل المصممين المرئيين . [44] بخلاف ذلك، يعد تطوير مولدات التعليمات البرمجية التي يمكنها إدارة التعليمات البرمجية الناتجة عندما يتم تداخلها مع التعليمات البرمجية المكتوبة بواسطة المطور تحديًا أو حل وسط. باستخدام الفئات الجزئية، يمكن لمولد التعليمات البرمجية معالجة ملف منفصل أو فئة جزئية غير دقيقة داخل ملف، وبالتالي يتم تخفيفه من التدخل المعقد في التعليمات البرمجية الناتجة من خلال التحليل المكثف، مما يزيد من كفاءة المترجم ويزيل المخاطر المحتملة لإفساد تعليمات برمجية للمطور. في تنفيذ بسيط للفئات الجزئية، يمكن للمترجم إجراء مرحلة ما قبل التجميع حيث "يوحد" جميع أجزاء الفئة الجزئية. بعد ذلك، يمكن أن يستمر التجميع كالمعتاد.
تتضمن الفوائد والآثار الأخرى لميزة الفئة الجزئية ما يلي:
- يتيح فصل واجهة الفئة وكود التنفيذ بطريقة فريدة.
- يسهل التنقل عبر الفئات الكبيرة داخل المحرر .
- يتيح فصل الاهتمامات بطريقة مشابهة للبرمجة الموجهة للجوانب ولكن دون استخدام أي أدوات إضافية.
- يتيح للمطورين المتعددين العمل على فئة واحدة في وقت واحد دون الحاجة إلى دمج الكود الفردي في ملف واحد في وقت لاحق.
كانت الفئات الجزئية موجودة في Smalltalk تحت اسم Class Extensions لفترة طويلة. ومع وصول إطار عمل .NET 2 ، قدمت Microsoft الفئات الجزئية، المدعومة في كل من C# 2.0 و Visual Basic 2005. كما يدعم WinRT الفئات الجزئية.
غير قابل للثبات
تسمح الفئات غير القابلة للإنشاء للمبرمجين بتجميع الحقول والطرق الخاصة بكل فئة معًا والتي يمكن الوصول إليها في وقت التشغيل دون وجود مثيل للفئة. في الواقع، يُحظر إنشاء مثيلات لهذا النوع من الفئات.
على سبيل المثال، في C#، لا يمكن إنشاء مثيل للفئة التي تحمل علامة "static"، ولا يمكن أن تحتوي إلا على أعضاء ثابتة (حقول، طرق، أخرى)، ولا يمكن أن تحتوي على منشئي مثيلات ، وهي مختومة . [45]
لم يتم ذكر اسمه
لا ترتبط الفئة غير المسماة أو الفئة المجهولة باسم أو معرف عند التعريف. [46] [47] وهذا مشابه للوظائف المسماة مقابل الوظائف غير المسماة .
فوائد
تنقسم فوائد تنظيم البرامج في فئات كائنية إلى ثلاث فئات: [48]
- التطور السريع
- سهولة الصيانة
- إعادة استخدام الكود والتصاميم
تسهل فئات الكائنات التطوير السريع لأنها تقلل الفجوة الدلالية بين الكود والمستخدمين. يمكن لمحللي النظام التحدث إلى كل من المطورين والمستخدمين باستخدام نفس المفردات بشكل أساسي، والتحدث عن الحسابات والعملاء والفواتير وما إلى ذلك. غالبًا ما تسهل فئات الكائنات التطوير السريع لأن معظم البيئات الموجهة للكائنات تأتي مع أدوات تصحيح واختبار قوية. يمكن فحص حالات الفئات في وقت التشغيل للتحقق من أن النظام يعمل كما هو متوقع. أيضًا، بدلاً من الحصول على تفريغات للذاكرة الأساسية، تحتوي معظم البيئات الموجهة للكائنات على قدرات تصحيح أخطاء مفسرة بحيث يمكن للمطور تحليل مكان حدوث الخطأ بالضبط في البرنامج ويمكنه رؤية الأساليب التي تم استدعاؤها لأي وسيطات وبأي وسيطات. [49]
تسهل فئات الكائنات سهولة الصيانة من خلال التغليف. عندما يحتاج المطورون إلى تغيير سلوك كائن ما، يمكنهم توطين التغيير على هذا الكائن وأجزائه المكونة فقط. وهذا يقلل من احتمالية حدوث آثار جانبية غير مرغوب فيها من تحسينات الصيانة.
إن إعادة استخدام البرامج هي أيضًا من الفوائد الرئيسية لاستخدام فئات الكائنات. تسهل الفئات إعادة الاستخدام عبر الميراث والواجهات. عندما يكون هناك حاجة إلى سلوك جديد، يمكن تحقيق ذلك غالبًا عن طريق إنشاء فئة جديدة وجعل هذه الفئة ترث السلوكيات والبيانات الافتراضية لفئتها العليا ثم تخصيص بعض جوانب السلوك أو البيانات وفقًا لذلك. تحدث إعادة الاستخدام عبر الواجهات (المعروفة أيضًا بالطرق) عندما يريد كائن آخر استدعاء (بدلاً من إنشاء نوع جديد من) فئة كائن. تزيل هذه الطريقة لإعادة الاستخدام العديد من الأخطاء الشائعة التي يمكن أن تشق طريقها إلى البرامج عندما يعيد برنامج ما استخدام التعليمات البرمجية من برنامج آخر. [50]
تمثيل وقت التشغيل
This Runtime representation needs additional citations for verification. (May 2024) |
كنوع من أنواع البيانات، عادة ما يتم اعتبار الفئة بمثابة بناء وقت التجميع. [51] قد تدعم اللغة أو المكتبة أيضًا كائنات ميتا نموذجية أو مصنعية تمثل معلومات وقت التشغيل حول الفئات، أو حتى تمثل بيانات وصفية توفر الوصول إلى مرافق البرمجة العاكسة (الانعكاس) والقدرة على معالجة تنسيقات بنية البيانات وقت التشغيل. تميز العديد من اللغات هذا النوع من معلومات نوع وقت التشغيل حول الفئات عن فئة على أساس أن المعلومات ليست مطلوبة وقت التشغيل. لا تضع بعض اللغات الديناميكية تمييزًا صارمًا بين بنيات وقت التشغيل ووقت التجميع، وبالتالي قد لا تميز بين الكائنات الميتا والفئات.
على سبيل المثال، إذا كان Human عبارة عن كائن ميتا يمثل فئة Person، فمن الممكن إنشاء مثيلات من فئة Person باستخدام إمكانيات الكائن الميتا Human .
البرمجة المبنية على النموذج الأولي
على النقيض من إنشاء كائن من فئة، تدعم بعض سياقات البرمجة إنشاء الكائن عن طريق نسخ (استنساخ) كائن النموذج الأولي . [52]
انظر أيضا
- مخطط الفئة – مخطط يصف البنية الثابتة لنظام برمجي
- متغير الفئة - متغير محدد في فئة تمتلك جميع كائناتها نفس النسخة
- متغير المثيل - متغير عضو في فئة تمتلك جميع كائناتها نسخة منه
- قائمة لغات البرمجة الموجهة للكائنات
- السمة (برمجة الكمبيوتر) - مجموعة من الأساليب التي تعمل على توسيع وظائف الفئة
ملحوظات
- ^ جاما وآخرون. 1995، ص 14.
- ^ بروس 2002، 2.1 الكائنات والفئات وأنواع الكائنات، https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18.
- ^ جاما وآخرون. 1995، ص 17.
- ^ ab "3. نموذج البيانات". مرجع لغة بايثون . مؤسسة برمجيات بايثون . تم الاسترجاع في 2012-04-26 .
- ^ بوتش 1994، ص 86-88.
- ^ "الفصول (I)". دروس لغة C++ . cplusplus.com . تم الاسترجاع في 2012-04-29 .
- ^ "Classes (II)". دروس لغة C++ . cplusplus.com . تم الاسترجاع في 2012-04-29 .
- ^ بوتش 1994، ص 105.
- ^ بارسونز، جون جامريتش (22 يونيو 2015). وجهات نظر جديدة حول مفاهيم الكمبيوتر 2016، شامل . بوسطن، ماساتشوستس: سينجيج ليرنينج. رقم ISBN 9781305271616. OCLC 917155105.
- ^ "التحكم في الوصول إلى أعضاء الفئة". دروس Java . Oracle . تم الاسترجاع في 2012-04-19 .
- ^ "OOP08-CPP. لا تعيد مراجع إلى بيانات خاصة". CERT C++ Secure Coding Standard . جامعة كارنيجي ميلون. 2010-05-10. مؤرشف من الأصل في 2015-10-03 . تم الاسترجاع في 2012-05-07 .
- ^ بن أري، مردخاي (2007-01-24). "2.2 Identifiers" (PDF) . Compile and Runtime Errors in Java . مؤرشف (PDF) من الأصل في 2011-10-18 . تم الاسترجاع في 2012-05-07 .
- ^ ab Wild, Fred. "C++ Interfaces". Dr. Dobb's . UBM Techweb . تم الاسترجاع في 2012-05-02 .
- ^ توماس؛ هانت. "الفئات والكائنات والمتغيرات". برمجة روبي: دليل المبرمج البراجماتي . Ruby-Doc.org . تم الاسترجاع في 2012-04-26 .
- ^ "الصداقة والميراث". برنامج تعليمي للغة C++ . cplusplus.com . تم الاسترجاع في 2012-04-26 .
- ^ بيرفيلد، ماريا (2 ديسمبر 2008). "تحويل UML إلى Java في إصدارات IBM Rational Software Architect والبرامج ذات الصلة". IBM . تم الاسترجاع في 20 ديسمبر 2013 .
- ^ جاكوبسن ، إيفار. ماغنوس كريسترسون؛ باتريك جونسون؛ غونار أوفرجارد (1992). هندسة البرمجيات الشيئية. مطبعة أديسون ويسلي ACM. ص 43-69. رقم ISBN 0-201-54435-0.
- ^ Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Wallace, Evan (2006-03-09). "A Semantic Web Primer for Object-Oriented Software Developers". W3C . تم الاسترجاع في 2008-07-30 .
- ^ بوتش 1994، ص 180.
- ^ بوتش 1994، ص 128-129.
- ^ بوتش 1994، ص 112.
- ^ ab "Interfaces". دروس Java . Oracle . تم الاسترجاع في 2012-05-01 .
- ^ ab Bell, Donald. "أساسيات UML: مخطط الفئة". developer Works . IBM . تم الاسترجاع في 2012-05-02 .
- ^ بوتش 1994، ص 179.
- ^ ab "Polymorphism". C++ Language Tutorial . cplusplus.com . تم الاسترجاع في 2012-05-02 .
- ^ "الأساليب والفئات المجردة". دروس Java . Oracle . تم الاسترجاع في 2012-05-02 .
- ^ "تجريد الفئة". دليل PHP . مجموعة PHP . تم الاسترجاع في 2012-05-02 .
- ^ "الواجهات (دليل برمجة C#)". دليل برمجة C# . مايكروسوفت . تم الاسترجاع في 2013-08-15 .
- ^ "الوراثة (دليل برمجة سي شارب)". دليل برمجة سي شارب . مايكروسوفت . تم الاسترجاع في 2012-05-02 .
- ^ "الفئات المتداخلة (C++ فقط)". XL C/C++ V8.0 لنظام AIX . IBM . تم الاسترجاع في 2012-05-07 .
- ^ "أسماء الأنواع المحلية (C++ فقط)". XL C/C++ V8.0 لنظام AIX . IBM . تم الاسترجاع في 2012-05-07 .
- ^ "الفئات المحلية (C++ فقط)". XL C/C++ V8.0 لنظام AIX . IBM . تم الاسترجاع في 2012-05-07 .
- ^ بوتش 1994، ص 133-134.
- ^ "13 Classes and metaclasses". pharo.gforge.inria.fr . مؤرشف من الأصل في 2021-02-24 . تم الاسترجاع في 2016-10-31 .
- ^ توماس؛ هانت. "الفئات والكائنات". برمجة روبي: دليل المبرمج البراجماتي . Ruby-Doc.org . تم الاسترجاع في 2012-05-08 .
- ^ بوتش 1994، ص 134.
- ^ "MOP: Concepts". The Common Lisp Object System MetaObject Protocol . Association of Lisp Users. مؤرشف من الأصل في 2010-11-15 . تم الاسترجاع في 2012-05-08 .
- ^ "sealed (C# Reference)". C# Reference . Microsoft . تم الاسترجاع في 2012-05-08 .
- ^ "كتابة الفئات والطرق النهائية". دروس Java . Oracle . تم الاسترجاع في 2012-05-08 .
- ^ "PHP: Final Keyword". دليل PHP . مجموعة PHP . تم الاسترجاع في 2014-08-21 .
- ^ "String (Java Platform SE 7)". Java Platform, Standard Edition 7: API Specification . Oracle . تم الاسترجاع في 2012-05-08 .
- ^ Brand, Sy (2 مارس 2020). "فوائد الأداء للفصول النهائية". مدونة فريق Microsoft C++ . Microsoft . تم الاسترجاع في 4 أبريل 2020 .
- ^ "9. Classes". The Python Tutorial . Python.org . تم الاسترجاع في 3 مارس 2018 .
كما هو الحال بالنسبة للوحدات النمطية، تشارك الفئات في الطبيعة الديناميكية لبايثون: يتم إنشاؤها وقت التشغيل، ويمكن تعديلها بعد الإنشاء.
- ^ ab mairaw; BillWagner; tompratt-AQ (2015-09-19)، "الفئات والطرق الجزئية"، دليل برمجة C# ، Microsoft ، تم الاسترجاع في 2018-08-08
- ^ "الفئات الثابتة وأعضاء الفئة الثابتة (دليل برمجة C#)". دليل برمجة C# . مايكروسوفت . تم الاسترجاع في 2012-05-08 .
- ^ "الفئات المجهولة (دروس Java > تعلم لغة Java > الفئات والكائنات)". docs.oracle.com . تم الاسترجاع في 2021-05-13 .
- ^ "PHP: Anonymous classes - Manual". www.php.net . تم الاسترجاع في 2021-08-11 .
- ^ "ما هو الكائن؟". oracle.com . Oracle Corporation . تم الاسترجاع في 13 ديسمبر 2013 .
- ^ Booch, Grady; Robert A. Maksimchuk; Michael W. Engle; Bobbi J. Young Ph.D.; Jim Conallen; Kelli A. Houston (April 30, 2007). التحليل والتصميم الموجه للكائنات مع التطبيقات. Addison-Wesley Professional. ص. 1-28. ISBN 978-0-201-89551-3تم الاسترجاع في 20 ديسمبر 2013.
هناك عوامل أساسية تحد من الإدراك البشري؛ ويمكننا معالجة هذه القيود من خلال استخدام التحليل والتجريد والتسلسل الهرمي.
- ^ جاكوبسن ، إيفار. ماغنوس كريسترسون؛ باتريك جونسون؛ غونار أوفرجارد (1992). هندسة البرمجيات الشيئية. مطبعة أديسون ويسلي ACM. رقم ISBN 0-201-54435-0.
- ^ "المعيار الدولي للغة البرمجة C++" (PDF) . مسودة عمل، معيار للغة البرمجة C++ . ISO/IEC JTC1/SC22 WG21. مؤرشف (PDF) من الأصل في 2017-12-09 . تم الاسترجاع في 5 يناير 2020 .
- ^ أمير، مسرور (25 مارس 2023). "البرمجة الشيئية الموجهة - المفاهيم | اللغات | الفوائد [2023]". The Geeks Bot | موقع علوم الكمبيوتر للمهوسين . تم الاسترجاع في 2023-04-04 .
مراجع
- بوتش، جرادي (1994). الكائنات والتصميم مع التطبيقات، الطبعة الثانية . بنيامين/كومينجز.
- جاما؛ هيلم؛ جونسون؛ فليسيدس (1995). أنماط التصميم: عناصر البرمجيات الموجهة للكائنات القابلة لإعادة الاستخدام . أديسون ويسلي. رقم ISBN 9780201633610.
- بروس، كيم ب. (2002). أساسيات اللغات الموجهة للكائنات: الأنواع والدلالات. كامبريدج، ماساتشوستس: مطبعة معهد ماساتشوستس للتكنولوجيا. رقم ISBN 978-0-262-02523-2.
قراءة إضافية
- عبادي؛ كارديلي: نظرية الأشياء
- ISO/IEC 14882:2003 لغة البرمجة C++، المعيار الدولي
- حرب الطبقات: الطبقات مقابل النماذج الأولية، بقلم بريان فوت
- ماير، ب.: "بناء البرمجيات الموجهة للكائنات"، الطبعة الثانية، برنتيس هول، 1997، ISBN 0-13-629155-4
- Rumbaugh et al.: "النمذجة والتصميم الموجه للكائنات"، برنتيس هول، 1991، ISBN 0-13-630054-5
