السلام عليكم و رحمة الله
سنناقش في هذا الجزء مخطط الفئات و أهم خصائصه . لمتابعة الجزء الأول :
[عزيزي الزائر يتوجب عليك التسجيل لمشاهدة الرابط للتسجيل اضغط هنا].
2. مخطط الفئات Diagramme de Classes :
يعتبر هذه المخطط أهم مخططات UML و هو المخطط الذي لا ينبغي أن يغيب عن أي نمذجة لأي نظام يعتمد على البرمجة كائنية المنحى.
و في حين أن مخطط حالات الاستخدام يوضح لنا النظام من وجهة نظر الممثلين Les acteurs, فإن مخطط الفئات يوضح لنا البنية الداخلية للنظام.هذا المخطط يوفر لنا تمثيلا مجردا لكائنات النظام التي تتفاعل فيما بينها من أجل تنفيذ مخططات حالات الاستخدام.
1.2. تمثيل الفئة في مخطط الفئات :
الفئة تمثل في هذا المخطط بالشكل التالي :
الشكل مقسم إلى ثلاث أجزاء , في الجزء الأول نقوم بكتابة اسم الفئة و يكون اسم الفئة دال على الوظيفة التي تؤديها , في الجزء الثاني نقوم بسرد جميع الصفات التي تتصف بها فئتنا و في الجزء الأخير نقوم بإدراج جميع الطرائق أو العمليات التي تقوم بها الفئة .
2.2. مجال الرؤية La visibilité: ربما قد لاحظت علامة + و – و # , هذه العلامات تبين لنا إمكانية الوصول إلى الـ Attribut أو الـméthode التي بداخل الفئة , و هي تعرف بمحددات الوصول :
محدد الوصول(+) Public : أي عنصر من الفئة أو من خارج الفئة يمكنه رؤية الخاصية (الصفة Attributs أو العملية opération ) التي تُسبق بهذا المحدد.
محدد الوصول Private(-): لا يمكن رؤية الخاصية التي تُسبق بهذا المحدد إلا من داخل الفئة نفسها.
محدد الوصول Protected (#): لا يمكن رؤية الخاصية التي تسبق بهذا المحدد إلا من داخل الفئة أو من فئة أخرى ورثت هذه الفئة.
مثال : لنأخذ على سبيل المثال فئة السيارة , سيكون تمثيلها في مخطط الفئات كما يلي:

هذه الفئة لديها ثلاث صفات هي النوعية La marque, الطراز Le modèle , المسافة التي قطعتها La distance écoulée, إضافة إلى العملية Conduire() و التي تمثل سلوك القيادة , و من المعلوم أن السيارة كلما قطعت مسافة معينة يقوم عداد خاص في السيارة بحساب هذه المسافة , أي أن هذه العملية تقوم بالتأثير أو التعديل على الصفة DistanceEcoulée حيث و في كل مرة يتم استدعاء العملية Conduire نقوم بإضافة قيمة Km إلى قيمة DistanceEcoulée القديمة .
و ربما تلاحظ أن الصفة DistanceEcoulée مسبوقة بمحدد الوصول Private ذلك لنمنع أي تعديل لهذه الصفة من خارج الفئة Voiture , و نحصر هذا التعديل فقط من خلال استدعاء العملية Conduire() و هذا ما يمكن أن نترجمه في الواقع إلى أن المسافة التي تقطعها السيارة لا يمكنها أن تتغير إلا إذا تحركت هذه السيارة فعلا.
3.2. العلاقات بين الفئات :
1.3.2. التعميم و الوراثة Généralisation et Héritage :
سبق لنا و أن شرحنا مفهوم الوراثة في البرمجة كائنية المنحى . في مخطط الفئات نمثل علاقة الوراثة بين فئتين بسهم رأسه مثلث يشير إلى الفئة الموروثة و بدايته من الفئة الوارثة , الفئة الوارثة تحتوي جميع خصائص الفئة الموروثة ماعدا الخصائص الخاصة أي التي تكون مسبوقة بمحدد الوصول Private . المثال التالي يبين لنا هذه العلاقة بين الفئة Personne و الفئتين Étudiant و Enseignant
يمكننا القول أن الفئة Personne أعم من الفئتين Étudiant و Enseignant أو الفئتين السالفتين الذكر أخص من الفئة Personne أي كلما اتجهنا إلى الأعلى زاد التعميم و كلما اتجهنا إلى الأسفل زاد التخصيص و يظهر هذا جليا في حالة كون هناك أكثر من علاقة تعميم واحدة كالمثال التالي :
2.3.2. الروابط AssociationsLes:
الروابط توضح لنا طريقة ارتباط الفئات فيما بينها و العلاقات التي تجمع بين مختلف الفئات.
مثلا في المثال التالي فئة المضلع Polygone معرفة على الأقل بثلاث نقاط أو أكثر أي بينها و بين الفئة Point رابطة Défini par (معرف بـ)
- نهاية الرابطة Terminaison d'association :
عرفنا فيما سبق أن الفئة تحتوي على صفات Attributs هذه الصفات يمكن أن تكون عبارة عن متغير من نوع سلسلة حروف string أو متغير صحيح int أو أي نوع من المتغيرات التي نعرفها في لغات البرمجة , الجديد هنا هو أن الـ Attribut يمكن أن يكون نوعا جديدا من المتغيرات قمنا نحن بإنشائه كأن يكون نسخة من فئة عرّفناها سابقا , و عليه يمكننا تمثيل هذا المتغير لما نستعمله في مخطط الفئات بوضع اسمه نهاية الرابطة بجانب الفئة التي استنسخناه منها , و بالعودة للمثال السابق الفئة polygone تحتوي ثلاث نسخ أو أكثر من الفئة Point تشكل رؤوسا Les sommetsلهذا الـ polygone , و يمكننا تمثيل هذه العلاقة في مخطط الفئات كما يلي :
و لكي تبسط الفكرة أكثر الكود التالي المكتوب بلغة السي شارب يوضح طريقة تحويل المخطط السابق إلى كود برمجي. سنقوم بالتطرق لهذا الموضوع في الأخير:
class Polygone
}
public Point[] Sommets = new Point[X];//X >=3
{
و التمثيل السابق مطابق للتمثيل التالي :- التعدد La multiplicité :
ربما لاحظت في المثال السابق أن فئة polygone أمامها رقم 1 و فئة Point أمامها المجال 3..* في الحقيقة هذه هي الـ Multiplicité أي أنه أي نسخة من فئة الPolygone (أي كائن من الكائنات التي يمكننا إنشائها من هذه الفئة) يمكنه أن يحتوي ثلاث نسخ من الفئة Point فأكثر تشكل رؤوس هذا الـpolygone و أن أي نسخة من الفئة Point تنتمي إلى نسخة واحدة و وحيدة من الفئة Polygone.
و هذه بعض الأمثلة حول ال multiplicité :
- نسخة واحدة فقط:1 أو 1..1
- صفر نسخة أو أكثير: * أو *..0
- على الأقل نسخة واحدة: *..1
- من واحد إلى ستة نسخ : 6..1
- اتجاه الرابطة La navigabilité
في الحالة العامة اتجاه الرابطة يكون في الجهتين , لكن يمكننا تحديد الاتجاه في حالة كون فئة ما تستعمل فئة أخرى و الفئة الثانية لا يمكنها استعمال الفئة الأولى , و هذا ما نلاحظه في المثال السابق حيث أن ال Polygone معرف بثلاث نقاط بينما النقطة من المستحيل أن تكون معرفة ب Polygone وهذا ما يدل عليه اتجاه السهم في نهاية الرابطة .
يجدر بي الإشارة إلى أن الرابطة لا تكون فقط بين فئتين اثنين بل يمكنها أن تتعدى ذلك إلى ثلاث فئات أو أكثر و تسمى في هذه الحالة رابطة متعددة Association n-aire, بينما تسمى في الحالة الأولى Association binaire رابطة ثنائية.
- الفئة-الرابطة La classe-association :
الفئة-الرابطة تجمع بين خصائص الفئات و خصائص الروابط معا, فهي تقوم بربط فئتين أو أكثر و تحتوي صفات و عمليات Des attributs et des opérations مثل أي فئة أخرى .
تمثل الفئة-الرابطة بخط متقطع بين الفئة و الرابطة التي تمثلها و هذا شكلها العام:
حيث أن الفئة C هي الفئة-الرابطة.
- التجميع L'agrégation:
التجميع هي حالة خاصة من الرابطة تعبر عن علاقة احتواء , هذه العلاقة لا تحتاج لتسمية فهي تعني >>يحتوي<< أو >>مشكل من>> . تمثل هذه العلاقة بمعين فارغ يشير إلى الفئة الحاوية.
هذا مخطط عام هذه العلاقة :
- التركيب La composition :
التركيب أقوى من التجميع إذ أن الكائن المشكل من تركيب عدة كائنات أخرى لا يمكنه الاستغناء عن كائن واحد من هذه الكائنات التي تشكله. تمثل هذه العلاقة بمعين ممتلئ يشير إلى الفئة المركبَة.
مثال ذلك السيارة مركبة من محرك moteur و أربع عجلات quatre roues , فإذا نزعنا مركب من هذه المركبات من السيارة لا يمكننا القول عنها أنها سيارة كاملة .
3.2. إعداد مخطط الفئات:
من أجل بناء مخطط الفئات علينا إتباع الخطوات التالية :
جد فئات المجال الذي أنت بصدد دراسته : هذه المرحلة تتم غالبا باستشارة خبير في هذا المجال فهو يزودك بأدق التفاصيل و يعطيك كل المعلومات التي تحتاجها من أجل استخراج الفئات و خصائصها , و يتم ذلك غالبا عن طريق استعمال دفتر الشروط Cahier des charges تكتب فيه جميع معلومات المشروع التي نستقيها من المستخدم .و في حالتنا نحن علينا الاتصال بصاحب المحل الذي يزودنا بكل المعلومات اللازمة لنكتبها هنا في المنتدى في فقرة نص المشروع , بعدها علينا التمحيص في هذه المعلومات و استخلاص الفئات التي نحتاجها .
جد العلاقات أو الروابط بين الفئات : العلاقات دوما تستخرج من أفعال أو من جمل فعلية تدل على ارتباط فئة بفئة أخرى أو بعدد من الفئات , مثل <<est composé de>> (مركب من ) , <<Possède>> (يملك) , <<Travail pour >> (يعمل لدى) ...
جد خصائص الفئات: الصفات Attributs غالبا ما تكون عبارة عن أسماء أو جمل سمية كسرعة السيارة مثلا
<<la vitesse d'une voiture>> ,أو سعر منتج <<Prix d'un produit>> .
بالنسبة للعمليات فيمكننا جمعها من خلال معرفة مختلف الوظائف التي يؤديها كائن ما , كإضافة منتج جديد Ajouter produit , تعديل منتج ...
نظم و بسط النموذج : و ذلك عن طريق إزالة الفئات المكررة و استخدام الوراثة.
لا يمكننا بناء مخطط فئات كامل من أول وهلة بل سنضطر في كل مرة تظهر لنا فيها مستجدات للعودة إلى هذا المخطط أو أي مخطط آخر للتعديل عليه و إضافة كل ما هو جديد. و عليه فإن النمذجة كائنية المنحى هي عبارة عن عملية تكرارية و ليست خطية , سنضطر فيها للعودة للوراء حال اضطرارنا لذلك.
4.2. تحويل مخطط الفئات إلى تعليمات برمجية :
لكل من التصاميم و الرسومات السابقة ترجمة في لغات البرمجة , فهدفنا في النهاية الوصول إلى البرنامج الذي نحن بصدد دراسته و هذا لا يكون إلا باستعمال لغة من لغات البرمجة , طبعا كائنية المنحى . في القسم الموالي سأقوم بذكر كيفية تحويل مخطط الفئات في لغة البرمجة كائنية المنحى سي شارب (C#) :
تحويل فئة:

class ClasseA
}
;public string Attribut1
;private int Attribut2
;protected double Attribut3
...
;
public void opération1
;
private string opération2
...
{
تحويل علاقة وراثة
class ClasseA:ClasseB
}
...
...
{
تحويل رابطة 1 مقابل 1:

class ClasseA
}
;()public ClasseB b = new ClasseB
{
class ClasseB
}
;()public ClasseA a = new ClasseA
{
تحويل رابطة 1 مقابل 1 ذات اتجاه واحد:
class ClasseA
}
;()private ClasseB b = new ClasseB
{
class ClasseB
}
// A هذه الفئة لا تحتوي على نسخ من الفئة
...
{
class ClasseA
}
;()private ArrayList<ClasseB> b = new ArrayList
{
class ClasseB
}
;()public ClasseA a = new ClasseA
{
تحويل رابطة 1 مقابل * ذات اتجاه واحد:
class ClasseA
}
;()private ArrayList<ClasseB> b = new ArrayList
{
class ClasseB
}
هذه الفئة لا تحتوي نسخ من الفئة A//
{
تحويل رابطة 1 مقبل قيمة محددة :
class ClasseA
}
;[private ClasseB[] b = new ClasseB[8
{
class ClasseB
}
;()public ClasseA a = new ClasseA
{
تحويل رابطة التجميع :

يكون تحويل هذه الرابطة كتحويل أي رابطة عادية
تحويل رابطة التركيب :

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