"A language that doesn't affect the way you think about programming, is not worth knowing." -- Alan Perlis
أيّ لغة برمجة ليست مجرّد syntax, بل هي تقدّم وسيلة جديدة للتفكير في البرنامج الذي تكتبه. #C هي لغة في سلسلة من اللغات المبنيّة على مباديء البرمجة المعتمدة على الأشياء Object Oriented Programming. و بدون تمكّن من هذه المباديء فلن يستفيد المبرمج حقاً من الـ#C. لذلك يجب أن نتحدث عن الOOP أولاً.
الأشياء و الفصائل
كثير من البرامج يسهل وصفها لو قسّمناها إلى أشياء.
مثلا في Word الأشياء هي شريط الأدوات و القوائم, الكلام الذي تكتبه و الصفحات و الفقرات, اللغات التي يعمل معها المدقق الأملائي, و سائر مكونات البرنامج. و في لعبة مثل ألعاب الحروب فالأشياء التي تكوّن البرنامج هي الوحدات و المباني و الخريطة و عوامل البيئة مثل الحيوانات أو الأنهار.
من كثرة انتشار البرامج التي يتيسّر وصفها لو قسّمناها لأشياء ظهرت طريقة للبرمجة مبنية على فكرة "الشيء" أو الobject. فما معنى "شيء" هنا؟
الشيء هو كائن له "حالة" و له "سلوك". An object has a state and behavior. أما الحالة فهي الوضع الذي عليه الشيء, مثل لون الكلمة في الWord أو مكان الجندي في لعبة الحرب أو عدد العناصر في الArray.و أمّا السلوك فهو التأثيرات التي يحدثها الشيء. مثلا السلوك في Word هو الطريقة التي يُرسم بها الجدول على الشاشة أو الطريقة التي يعمل بها المدقق الأملائي. و في اللعبة فسلوك الوحدة هو الطريقة التي تهاجم بها أو ردّ فعلها عندما تقترب منها وحدة معادية.
يمكن لو أخترنا أن نعبر عن حالة الشيء عن طريق مجموعة من الصفات Attributes و أن نعبر عن سلوكه بواسطة حصر الطُرُق methods التي يتصرّف بها. فلو كنت أصمم برنامج لشئون العاملين مثلا فقد أقول أن البرنامج فيه نوع من الأشياء هم الموظفون, و أن حالتهم تحددها صفات مثل تاريخ التعيين, السن, هل يقومون بالعمل حاليا أم لا, و هكذا. بينما يمكن أن أصف سلوكهم بأنهم يمكنهم أن يعملوا, أن يأخذوا عطلة, أن يترقّوا, أن يغيروا الفرع أو أن يستقيلوا.
نلاحظ أنّ كل "شيء" له عموماً حالته المستقلّة. فكل جندي في اللعبة له صحته و مكانه بغضّ النظر عن أي وحدة أخرى. و لكن تأتي أحيان كثيرة يكون السلوك فيها مشترك بين فئة كبيرة من الوحدات. فجنود المشاة مثلا في اللعبة يهجمون كلهم بنفس الطريقة و يردون على اقتراب الأعداء بنفس الطريقة. طبعاً قد يختلف السلوك باختلاف الحالة (فمثلا الجندي ذو الصحة القليلة قد لا يهاجم) و لكن الخطة العامّة أو "البرنامج" الذي يحرك جندي المشاة قد تكون هي هي لكلّ الجنود.
من أجل هذا فإن بعض لغات البرمجة التي تتعامل مع الobjects (و لكن ليس كلها) قد اختارت أن تقدم مبدءاً جديداً لوصف مجموعة من الأشياء لها سلوك موحّد, و ذلك المبدأ هو الفصيلة class.
الفصيلة هي طريقة لوصف فئة من الأشياء يجمع بينها مجموعة مشتركة من الصفات و سلوك مشترك.
مجموعة مشتركة من الصفات أي أنّ السيّارة في لعبة سباق مثلا لها لون و سرعة و مكان. نعم كل سيّارة منهم لها لون و سرعة و مكان مختلفين لكن يجمع بينهم أن الكل يجب أن تكون هذه الصفات فيه. و سلوك مشترك أي أن كل ال checkboxes في الWindows مثلا تتصرف بنفس الطريقة بأن ترسم علامة حين تختارها و تلغي هذه العلامة حين تلغي اختيارك.
لتوضيح العلاقة بين الشيء و فصيلته انظر هذا المثال:
تخيّل أنه هناك قطة اسمها نميرة. يمكننا أن نقول
اذن كلمة instance معناها العلاقة بين الشيء و فصيلته.
أنواع الـattributes و الـmethods
مع أن كل شيء من الـ"أشياء" له حالة مختلفة إلا أنه يكون أحيانا هناك حالة مشتركة بين كل الأشياء من فصيلة معيّنة. مثلا لو كان في السيارة صفة هي "سعر قطعة الغيار" و كان هذا السعر موحدا فإنه لا معني أن يكون هناك نسخة مستقلة من هذا السعر لكل سيّارة على حدىً. و أيضا لو تغيّر هذا السعر فأنه من المتوقع أن ينعكس هذا التغيير على السيّارات كلها. في هذه الحالة فإن الصفة تظهر و كأنها خاصة بالclass كله و ليس بكل instance على انفراد. حين تكون الصفة خاصة بكل instance منفردة تكون تلك الصفة instance attribute و أمّا حين تكون خاصة بالـclass و مشتركة بين كل الـinstances فهي class attribute.
نفس الموقف بالنسبة للـmethods: فلو كانت الـmethod تصف سلوكا خاصا بالكائن (مثل طريقة هجوم الجندي) فهي instance method و لكن لو كانت تصف سلوكاً لا يرتبط بكائن معين فهي class method. مثال على الclass method أن أكتب code تقوم بحصر عدد الجنود الذين ماتوا في اللعبة. هذا شيء لا يرتبط بجندي معيّن و لكن يشمل فئة الجنود عموماً لهذا هو class method.
الهويّة
لكي نميّز بين "شيء" و آخر فاننا نحتاج أن يكون للأشياء هويّة identity وهي صفة قيمتها متفردة لكل شيء منفصل. في ال#C نستخدم الreference و هو قيمة تعبر (عادةً) عن مكان الـobject في الذاكرة فهي شبيهة بالpointers نوعاً ما. هذه القيمة تحدد أيضا الidentity بمعني أنه لو تساوى اثنان من الـreferences فمعنى هذا أنهما يدلّان على نفس الـobject و لو اختلفا فهما بالتأكيد يدلّان على objects مختلفة.
إعرف هذه المباديء جيداً. سنحتاجها المرة القادمة إن شاء الله حين نبدأ بكتابة code حقيقيّة!
الأشياء و الفصائل
كثير من البرامج يسهل وصفها لو قسّمناها إلى أشياء.
مثلا في Word الأشياء هي شريط الأدوات و القوائم, الكلام الذي تكتبه و الصفحات و الفقرات, اللغات التي يعمل معها المدقق الأملائي, و سائر مكونات البرنامج. و في لعبة مثل ألعاب الحروب فالأشياء التي تكوّن البرنامج هي الوحدات و المباني و الخريطة و عوامل البيئة مثل الحيوانات أو الأنهار.
من كثرة انتشار البرامج التي يتيسّر وصفها لو قسّمناها لأشياء ظهرت طريقة للبرمجة مبنية على فكرة "الشيء" أو الobject. فما معنى "شيء" هنا؟
الشيء هو كائن له "حالة" و له "سلوك". An object has a state and behavior. أما الحالة فهي الوضع الذي عليه الشيء, مثل لون الكلمة في الWord أو مكان الجندي في لعبة الحرب أو عدد العناصر في الArray.و أمّا السلوك فهو التأثيرات التي يحدثها الشيء. مثلا السلوك في Word هو الطريقة التي يُرسم بها الجدول على الشاشة أو الطريقة التي يعمل بها المدقق الأملائي. و في اللعبة فسلوك الوحدة هو الطريقة التي تهاجم بها أو ردّ فعلها عندما تقترب منها وحدة معادية.
يمكن لو أخترنا أن نعبر عن حالة الشيء عن طريق مجموعة من الصفات Attributes و أن نعبر عن سلوكه بواسطة حصر الطُرُق methods التي يتصرّف بها. فلو كنت أصمم برنامج لشئون العاملين مثلا فقد أقول أن البرنامج فيه نوع من الأشياء هم الموظفون, و أن حالتهم تحددها صفات مثل تاريخ التعيين, السن, هل يقومون بالعمل حاليا أم لا, و هكذا. بينما يمكن أن أصف سلوكهم بأنهم يمكنهم أن يعملوا, أن يأخذوا عطلة, أن يترقّوا, أن يغيروا الفرع أو أن يستقيلوا.
نلاحظ أنّ كل "شيء" له عموماً حالته المستقلّة. فكل جندي في اللعبة له صحته و مكانه بغضّ النظر عن أي وحدة أخرى. و لكن تأتي أحيان كثيرة يكون السلوك فيها مشترك بين فئة كبيرة من الوحدات. فجنود المشاة مثلا في اللعبة يهجمون كلهم بنفس الطريقة و يردون على اقتراب الأعداء بنفس الطريقة. طبعاً قد يختلف السلوك باختلاف الحالة (فمثلا الجندي ذو الصحة القليلة قد لا يهاجم) و لكن الخطة العامّة أو "البرنامج" الذي يحرك جندي المشاة قد تكون هي هي لكلّ الجنود.
من أجل هذا فإن بعض لغات البرمجة التي تتعامل مع الobjects (و لكن ليس كلها) قد اختارت أن تقدم مبدءاً جديداً لوصف مجموعة من الأشياء لها سلوك موحّد, و ذلك المبدأ هو الفصيلة class.
الفصيلة هي طريقة لوصف فئة من الأشياء يجمع بينها مجموعة مشتركة من الصفات و سلوك مشترك.
مجموعة مشتركة من الصفات أي أنّ السيّارة في لعبة سباق مثلا لها لون و سرعة و مكان. نعم كل سيّارة منهم لها لون و سرعة و مكان مختلفين لكن يجمع بينهم أن الكل يجب أن تكون هذه الصفات فيه. و سلوك مشترك أي أن كل ال checkboxes في الWindows مثلا تتصرف بنفس الطريقة بأن ترسم علامة حين تختارها و تلغي هذه العلامة حين تلغي اختيارك.
لتوضيح العلاقة بين الشيء و فصيلته انظر هذا المثال:
تخيّل أنه هناك قطة اسمها نميرة. يمكننا أن نقول
Cat is the class of Numaira
القطط هي فصيلة نميرة
و لكن كيف يمكن أن نقول نفس الجملة مع تبديل المبتدأ و الخبر؟القطط هي فصيلة نميرة
Numaira is an instance of Cat
نميرة هي تجسيد لفصيلة القطط
نميرة هي تجسيد لفصيلة القطط
اذن كلمة instance معناها العلاقة بين الشيء و فصيلته.
أنواع الـattributes و الـmethods
مع أن كل شيء من الـ"أشياء" له حالة مختلفة إلا أنه يكون أحيانا هناك حالة مشتركة بين كل الأشياء من فصيلة معيّنة. مثلا لو كان في السيارة صفة هي "سعر قطعة الغيار" و كان هذا السعر موحدا فإنه لا معني أن يكون هناك نسخة مستقلة من هذا السعر لكل سيّارة على حدىً. و أيضا لو تغيّر هذا السعر فأنه من المتوقع أن ينعكس هذا التغيير على السيّارات كلها. في هذه الحالة فإن الصفة تظهر و كأنها خاصة بالclass كله و ليس بكل instance على انفراد. حين تكون الصفة خاصة بكل instance منفردة تكون تلك الصفة instance attribute و أمّا حين تكون خاصة بالـclass و مشتركة بين كل الـinstances فهي class attribute.
نفس الموقف بالنسبة للـmethods: فلو كانت الـmethod تصف سلوكا خاصا بالكائن (مثل طريقة هجوم الجندي) فهي instance method و لكن لو كانت تصف سلوكاً لا يرتبط بكائن معين فهي class method. مثال على الclass method أن أكتب code تقوم بحصر عدد الجنود الذين ماتوا في اللعبة. هذا شيء لا يرتبط بجندي معيّن و لكن يشمل فئة الجنود عموماً لهذا هو class method.
الهويّة
لكي نميّز بين "شيء" و آخر فاننا نحتاج أن يكون للأشياء هويّة identity وهي صفة قيمتها متفردة لكل شيء منفصل. في ال#C نستخدم الreference و هو قيمة تعبر (عادةً) عن مكان الـobject في الذاكرة فهي شبيهة بالpointers نوعاً ما. هذه القيمة تحدد أيضا الidentity بمعني أنه لو تساوى اثنان من الـreferences فمعنى هذا أنهما يدلّان على نفس الـobject و لو اختلفا فهما بالتأكيد يدلّان على objects مختلفة.
إعرف هذه المباديء جيداً. سنحتاجها المرة القادمة إن شاء الله حين نبدأ بكتابة code حقيقيّة!
Summary
- Applications can be composed of objects.
- An object has state (attributes) and behavior (methods).
- Objects of common attributes and behavior can be grouped into classes.
- If C is the class of and object O, then O is an instance of C.
- Instance attributes have a different value for each object, while a class attribute has only one value for the whole class, and does not belong to any particular instance.
- Similarly, an instance method works on a particular object each time it's invoked, but a class method does not work on any particular object but is related to the class as a whole.
- An object reference can be used to determine its identity and uniquely distinguish it from other objects.