# البرمجة المعتمدة على الأصناف

البرمجة المعتمدة على الأصناف (Class-based programming)، أو بما يعرف بشكل شائع بـ البرمجة الموجهة بالفئات (class-orientation)، هي أسلوب في البرمجة كائنية التوجه (OOP) حيث يحدث التوريث من خلال تعريف صنف للكائنات ، بدلاً من أن يحدث التوريث من خلال الكائنات نفسها (قارن بالبرمجة القائمة على النماذج الأولية "prototype-based programming").
النموذج الأكثر شيوعًا وتطورًا في OOP هو النموذج المعتمد على الصنف، بدلاً من النموذج المعتمد على الكائن. في هذا النموذج، تعتبر الكائنات كيانات تجمع بين الحالة (أي البيانات)، والسلوك (أي الإجراءات أو الأساليب )، والهوية (الوجود الفريد بين جميع الكائنات الأخرى). يتم تحديد بنية وسلوك الكائن من خلال الصنف ، والتي تعتبر تعريفًا أو مخططًا لجميع الكائنات من نوع معين. يجب إنشاء كائن بشكل صريح استنادًا إلى فئة، ويعتبر الكائن الذي تم إنشاؤه بهذه الطريقة بمثابة مثيل لتلك الفئة. يعتبر الكائن مشابهًا للهيكل ، مع إضافة مؤشرات الطريقة، والتحكم في وصول الأعضاء، وعضو البيانات الضمني الذي يحدد مواقع مثيلات الصنف (أي كائنات الصنف) في التسلسل الهرمي للصنف (ضروري لميزات التوريث وقت التشغيل).

## التغليف

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

## التوريث

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

## نقد

لقد تعرضت اللغات القائمة على الأصناف، أو بشكل أكثر دقة، اللغات المكتوبة ، حيث يكون التقسيم الفرعي للأصناف هو الطريقة الوحيدة للتصنيف الفرعي ، لانتقادات بسبب خلط التنفيذات والواجهات — المبدأ الأساسي في البرمجة كائنية التوجه. يقول المنتقدون أنه من الممكن إنشاء صنف حقيبي يخزن مجموعة من الكائنات، ثم توسيعه لإنشاء صنف جديد يسمى صنف المجموعة حيث يتم التخلص من تكرار الكائنات. الآن، قد تتوقع الطريقة التي تأخذ كائنًا من الصنف الحقيبي أن إضافة كائنين يزيد حجم الحقيبة بمقدار اثنين، ومع ذلك، إذا مررت كائنًا من صنف المجموعة، فإن إضافة كائنين قد يزيد أو لا يزيد حجم الحقيبة بمقدار اثنين. تنشأ المشكلة على وجه التحديد لأن التقسيم الفرعي يعني التقسيم الفرعي للأنواع حتى في الحالات التي لا ينطبق فيها مبدأ التقسيم الفرعي للأنواع، المعروف باسم مبدأ استبدال ليسكوف . وقد صاغت باربرا ليسكوف وجانيت وينج المبدأ بشكل موجز في ورقة بحثية عام 1994 على النحو التالي:
   متطلبات النوع الفرعي : $\phi (x)$ تكون خاصية قابلة للإثبات فيما يتعلق بالكائنات $x$ من النوع $T$ . $\phi (y)$ أن يكون صحيحًا بالنسبة للكائنات $y$ من النوع $S$ حيث $S$ هو نوع فرعي من $T$.
وهكذا، فمن الطبيعي أن نميز بين التصنيف الفرعي والتصنيف الفرعي للأصناف. تميز معظم لغات البرمجة كائنية التوجه الحالية بين التصنيف الفرعي والتصنيف الفرعي للأصناف، إلا أن بعض الأساليب في التصميم لا تفعل ذلك.
بالإضافة إلى ذلك، هناك مثال شائع آخر وهو أن كائن الشخص الذي تم إنشاؤه من صنف فرعي لا يمكن أن يصبح كائنًا من صنف أصلي لأن الصنف الفرعي والصنف الأصلي يرث صنف الشخص، ولكن اللغات القائمة على الصنف لا تسمح في الغالب بتغيير نوع صنف الكائن في وقت التشغيل. بالنسبة للغات القائمة على الصنف، يعد هذا القيد ضروريًا للحفاظ على رؤية موحدة للصنف لمستخدميه. لا ينبغي للمستخدمين أن يهتموا بما إذا كان أحد تنفيذات الطريقة يتسبب في حدوث تغييرات تؤدي إلى كسر ثوابت الصنف. يمكن إجراء مثل هذه التغييرات عن طريق تدمير الكائن وبناء آخر مكانه. يمكن استخدام تعدد الأشكال للحفاظ على الواجهات ذات الصلة حتى عند إجراء مثل هذه التغييرات، لأن الكائنات تُعرض على أنها تجريدات صندوق أسود ويمكن الوصول إليها عبر هوية الكائن. ومع ذلك، عادةً ما يتم تغيير قيمة مراجع الكائنات التي تشير إلى الكائن، مما يسبب تأثيرات على كود العميل.

## مثال على اللغات

على الرغم من أن Simula قدمت تجريد الصنف، فإن المثال الأساسي للغة القائمة على الصنف هو Smalltalk . وتشمل اللغات الأخرى بي إتش بي ، وسي++ ، وجافا ، و سي شارب ، و سي-الكائنية .

## انظر أيضا

* البرمجة القائمة على النماذج الأولية (التباين)
* أنماط البرمجة
* صنف (برمجة الكمبيوتر)

## مراجع

* ↑ Kiselyov، Oleg. "Subtyping, Subclassing, and Trouble with OOP". مؤرشف من الأصل في 2015-10-08. اطلع عليه بتاريخ 2012-10-07.
* ↑ Ducasse، Stéphane. "A set cannot be a subtype of a bag". مؤرشف من الأصل في 2016-03-04. اطلع عليه بتاريخ 2012-10-07.
* بوابة علم الحاسوب