ونة حزن
07-13-2006, 03:48 AM
اسس البرمجة الموجهة بالكائنات...
سنخطو بهذه المقالة خطوة الى داخل عالم البرمجة الموجّهة بالكائنات... (البرمجة الموجهة بالكائنات هو ترجمة للمصطلح Object-Oriented Programming - OOP) . وسنساعدك في في فهم اسس هذه المبدأ المهم في البرمجة الحديثة.
يُقال عن لغات برمجة كثيرة مثل سي++ وفجوال بيزك, أنها لغات تدعم البرمجة الموجهة بالكائنات, لكن في الحقيقة القليل من اللغات تدعم كل خصائص هذه البرمجة. لغة سي# هي من هذه اللغات القليلة, فهي مبنيّة من الاساس لتكون لغة موجهة بالاغراض حقيقية.
كما ذكرنا لغات كثيرة من المفترض ان تكون موجهة بالكائنات لكن الحقيقة ان القليل من هذه اللغات هي بالفعل كذلك, لغة سي++ ليست من هذه اللغات, أي هي ليست موجهة بالاغراض حقيقيّة(قد يعترض البعض فنقول: حاولت سي++ دعم هذا التوجّه لكنها ليست 100% لغة موجهة بالكائنات), وذلك لأن جذورها تمتد الى داخل لغة سي, هذه الحقيقة لا يمكن تغييرها. هناك اسس كثيرة من صميم البرمجة الموجهة بالكائنات قامت لغة سي++ بالتضحية بها في سبيل دعم جذورها في لغة سي, حتى لغة جافا,مع جودتها, لديها بعض النواقص التي تحول بينها وبين كونها لغة برمجة موجّهة بالكائنات. لن ندخل في مقارنة اللغات المختلفة ومدى دعمها لهذا المبدأ. لهذا سندخل لشرح هذا المبدأ وأسسه.
ملاحظة: اذا كنت صاحب خبرة في البرمجة غير الموجهة باكائنات, فعليك ان تعلم ان البرمجة الموجّهة بالكائنات هي طريقة تفكير تختلف كليا عن اساليب البرمجة الاخرى.
كل شيء هو كائن
في اللغة الموجّهة بالكائنات يتم التعبير عن كل عناصر نطاق المشكلة بواسطة الكائنات (نطاق المشكلة – هو ترجمة حرفية لمصطلح يصف المشكلة التي نحن بصددها ونريد حلها , وكل ما يخص هذه المشكلة مثل درجة التعقيد ... الخ). كما تتوقّع فان استعمال الكائنات هو الفكرة المركزيّة من وراء البرمجة الموجّه بالكائنات.
بشكل عام,وفي الحياة العاديّة, الانسان لا يبني أفكاره على اشياء مثل: مباني البيانات, أو رزمة بيانات, أو استدعاء دوال, أو مؤشرات... بل طبيعة تفكير الانسان هي حول كائنات... سنورد مثالا حول الموضوع:
لو اردت أن تصمم برنامجا لاستصدار فواتير , والمطلوب من البرنامج جمع كل اسطر "السعر" واعطاءك مجموع الفاتورة. ما هو اسلوب التفكير البديهي من وجهة نظر الزبون؟
•تناول المشكلة بإسلوب غير موجّه بالكائتات:
سوف أقوم ببناء مبنى بيانات يمثّل عنوان الفاتورة. وسيحتوي عنوان الفاتورة على على قائمة مترابطة link list يمثل كل عنصر منها سطر من الفاتورة, ويحتوي كل عنصر طبعا على بند السعر . لذا فعندما اريد الحصول على مجموع الفاتورة سأعرف متغيّر وأسمّيه مثلا : InvoiceSum واضع له قيمة ابتدائية 0 ...وبعدها أحصل على مؤشّر لمبنى البيانات الذي يمثل عنوان الفاتورة.. وأحصل ايضا على بداية القائمة المترابطة, وبعد كل هذا لاسأقوم بمسح لجميع عناصر القائمة , وأحصل على المتغيّر الذي يمثل السعر, واضيفه الى InvoiceSum وعند الانتهاء من عملية المسح هذه سيكون عندي في InvoiceSum مجموع اسعار الفاتورة... وهو المطلوب...
•تناول المشكلة بإسلوب موجّه بالكائتات:
يكون عندي كائن (فاتورة) وسأبعث له رسالة تطلب منه مجموع الفاتورة. لا يجدر بي التفكير في كيفية عمل هذا الكائن, لا يهمني كيف قام الكائن بعملية الجمع ... الكائن في هذه الحالة يحتفظ داخله بـ"أسرار المهنة" بمعنى البرنامج الذي يطلب من الكائن المجموع, لا يحق له الاطّلاع على كيفية عمل الكائن من الداخل, فهذه اسرار المهنة.. ما يهم البرنامج هو الحصول على النتيجة... الكيفية لا تهم البرنامج.
------------------------- انتهى المثال ---------------------
لا شك أن التوجّه الموجّه بالكائنات هو البديهي, والقريب جدا الى اسلوب تفكير الانسان. في الحل الثاني .. (موجّه بالكائنات) لم نهتم بالمتغيرات التي استخدمها الكائن , ولا بآليان عمله الداخلية... وهذا من أهم اسس البرمجة الموجّهة بالكائنات, الا وهو الاحتواء, أو الكبسلة encabsulation وهو باختصار قدرة الكائن على اخفاء متغيراته ودوالّه الداخلية.. ويظهر فقط الدوال التي تسمح لنا بالحصول على نتائج, وهي تسمّى دوال الواجهة.
تشبيه: نشبّه هنا الكائن بفرن لبيع الخبز الطازج, الزبون الذي سيشتري هو البرنامج الذي سيستخدم الكائن.
عندما تذهب الى الفرّان لتشتري خبز.. سيناولك الفران ما طلبت, لا يحق لك أن تسأله كيف أعدّ لك الخبز, وما هي الخلطة السحرية التي تجعل خبزه لذيذا.. وايضا الفران لن يسمح لك بمقابلة العمال الذين يعملون داخل الفرن (لألا يخبروك ياسرار المهنة...) ما يهمك هو الحصول من الفران على الخبز...
حسنٌ المثال مطابق تماما لعمل الكائن حيث أن:
الفرّان : هو دالة واجهة.. تمكن البرنامج من التعامل مع الكائن.
العمال الداخليين: هم الدوال الداخلية للكائن, لا يمكنك بلوغها مباشرة , رغم انك تأكل الخبز الذي صنعوه هم.
الخلطة السحريّة.. والطحين والخميرة ... هي متغيرات داخلية للكائن لا يمكنك بلوغها..
------------------ انتهى التشبيه -------------------------
الكائن والفئة : Class & Object
الفرق بين الفئة |class والكائن object هو أمر مربك وغامض بالنسبة للكثيرين, الذين يتعاملون للمرة الاولى مع البرمجة الموجّهة بالكائنات..
باختصار شديد:
يمكنك التفكير في الفئة على انها توع بيانات مثل ال int وفي الكائن على انها متغيّر من هذا النوع.
وهناك من يحبون التعريف التالي: الفئة هي "الخارطة" التي تحدد للكائن كيفية عمله.. أو السيناريو الذي يعمل حسبه الكائن...
Instantiation :
تعريف كائن من الفئة يسمّى Instantiation .
من المعروف انك عندما تبني فئة, فهذه الفئة لن تأخذ مكانا في الذاكرة’ لأنها مجرد قالب, منه تستنسخ الكائنات.
عند تعريفك لكائن من هذه الفئة فالان انت حجزت مكان في الذاكرة بحجم الكائن.
سنخطو بهذه المقالة خطوة الى داخل عالم البرمجة الموجّهة بالكائنات... (البرمجة الموجهة بالكائنات هو ترجمة للمصطلح Object-Oriented Programming - OOP) . وسنساعدك في في فهم اسس هذه المبدأ المهم في البرمجة الحديثة.
يُقال عن لغات برمجة كثيرة مثل سي++ وفجوال بيزك, أنها لغات تدعم البرمجة الموجهة بالكائنات, لكن في الحقيقة القليل من اللغات تدعم كل خصائص هذه البرمجة. لغة سي# هي من هذه اللغات القليلة, فهي مبنيّة من الاساس لتكون لغة موجهة بالاغراض حقيقية.
كما ذكرنا لغات كثيرة من المفترض ان تكون موجهة بالكائنات لكن الحقيقة ان القليل من هذه اللغات هي بالفعل كذلك, لغة سي++ ليست من هذه اللغات, أي هي ليست موجهة بالاغراض حقيقيّة(قد يعترض البعض فنقول: حاولت سي++ دعم هذا التوجّه لكنها ليست 100% لغة موجهة بالكائنات), وذلك لأن جذورها تمتد الى داخل لغة سي, هذه الحقيقة لا يمكن تغييرها. هناك اسس كثيرة من صميم البرمجة الموجهة بالكائنات قامت لغة سي++ بالتضحية بها في سبيل دعم جذورها في لغة سي, حتى لغة جافا,مع جودتها, لديها بعض النواقص التي تحول بينها وبين كونها لغة برمجة موجّهة بالكائنات. لن ندخل في مقارنة اللغات المختلفة ومدى دعمها لهذا المبدأ. لهذا سندخل لشرح هذا المبدأ وأسسه.
ملاحظة: اذا كنت صاحب خبرة في البرمجة غير الموجهة باكائنات, فعليك ان تعلم ان البرمجة الموجّهة بالكائنات هي طريقة تفكير تختلف كليا عن اساليب البرمجة الاخرى.
كل شيء هو كائن
في اللغة الموجّهة بالكائنات يتم التعبير عن كل عناصر نطاق المشكلة بواسطة الكائنات (نطاق المشكلة – هو ترجمة حرفية لمصطلح يصف المشكلة التي نحن بصددها ونريد حلها , وكل ما يخص هذه المشكلة مثل درجة التعقيد ... الخ). كما تتوقّع فان استعمال الكائنات هو الفكرة المركزيّة من وراء البرمجة الموجّه بالكائنات.
بشكل عام,وفي الحياة العاديّة, الانسان لا يبني أفكاره على اشياء مثل: مباني البيانات, أو رزمة بيانات, أو استدعاء دوال, أو مؤشرات... بل طبيعة تفكير الانسان هي حول كائنات... سنورد مثالا حول الموضوع:
لو اردت أن تصمم برنامجا لاستصدار فواتير , والمطلوب من البرنامج جمع كل اسطر "السعر" واعطاءك مجموع الفاتورة. ما هو اسلوب التفكير البديهي من وجهة نظر الزبون؟
•تناول المشكلة بإسلوب غير موجّه بالكائتات:
سوف أقوم ببناء مبنى بيانات يمثّل عنوان الفاتورة. وسيحتوي عنوان الفاتورة على على قائمة مترابطة link list يمثل كل عنصر منها سطر من الفاتورة, ويحتوي كل عنصر طبعا على بند السعر . لذا فعندما اريد الحصول على مجموع الفاتورة سأعرف متغيّر وأسمّيه مثلا : InvoiceSum واضع له قيمة ابتدائية 0 ...وبعدها أحصل على مؤشّر لمبنى البيانات الذي يمثل عنوان الفاتورة.. وأحصل ايضا على بداية القائمة المترابطة, وبعد كل هذا لاسأقوم بمسح لجميع عناصر القائمة , وأحصل على المتغيّر الذي يمثل السعر, واضيفه الى InvoiceSum وعند الانتهاء من عملية المسح هذه سيكون عندي في InvoiceSum مجموع اسعار الفاتورة... وهو المطلوب...
•تناول المشكلة بإسلوب موجّه بالكائتات:
يكون عندي كائن (فاتورة) وسأبعث له رسالة تطلب منه مجموع الفاتورة. لا يجدر بي التفكير في كيفية عمل هذا الكائن, لا يهمني كيف قام الكائن بعملية الجمع ... الكائن في هذه الحالة يحتفظ داخله بـ"أسرار المهنة" بمعنى البرنامج الذي يطلب من الكائن المجموع, لا يحق له الاطّلاع على كيفية عمل الكائن من الداخل, فهذه اسرار المهنة.. ما يهم البرنامج هو الحصول على النتيجة... الكيفية لا تهم البرنامج.
------------------------- انتهى المثال ---------------------
لا شك أن التوجّه الموجّه بالكائنات هو البديهي, والقريب جدا الى اسلوب تفكير الانسان. في الحل الثاني .. (موجّه بالكائنات) لم نهتم بالمتغيرات التي استخدمها الكائن , ولا بآليان عمله الداخلية... وهذا من أهم اسس البرمجة الموجّهة بالكائنات, الا وهو الاحتواء, أو الكبسلة encabsulation وهو باختصار قدرة الكائن على اخفاء متغيراته ودوالّه الداخلية.. ويظهر فقط الدوال التي تسمح لنا بالحصول على نتائج, وهي تسمّى دوال الواجهة.
تشبيه: نشبّه هنا الكائن بفرن لبيع الخبز الطازج, الزبون الذي سيشتري هو البرنامج الذي سيستخدم الكائن.
عندما تذهب الى الفرّان لتشتري خبز.. سيناولك الفران ما طلبت, لا يحق لك أن تسأله كيف أعدّ لك الخبز, وما هي الخلطة السحرية التي تجعل خبزه لذيذا.. وايضا الفران لن يسمح لك بمقابلة العمال الذين يعملون داخل الفرن (لألا يخبروك ياسرار المهنة...) ما يهمك هو الحصول من الفران على الخبز...
حسنٌ المثال مطابق تماما لعمل الكائن حيث أن:
الفرّان : هو دالة واجهة.. تمكن البرنامج من التعامل مع الكائن.
العمال الداخليين: هم الدوال الداخلية للكائن, لا يمكنك بلوغها مباشرة , رغم انك تأكل الخبز الذي صنعوه هم.
الخلطة السحريّة.. والطحين والخميرة ... هي متغيرات داخلية للكائن لا يمكنك بلوغها..
------------------ انتهى التشبيه -------------------------
الكائن والفئة : Class & Object
الفرق بين الفئة |class والكائن object هو أمر مربك وغامض بالنسبة للكثيرين, الذين يتعاملون للمرة الاولى مع البرمجة الموجّهة بالكائنات..
باختصار شديد:
يمكنك التفكير في الفئة على انها توع بيانات مثل ال int وفي الكائن على انها متغيّر من هذا النوع.
وهناك من يحبون التعريف التالي: الفئة هي "الخارطة" التي تحدد للكائن كيفية عمله.. أو السيناريو الذي يعمل حسبه الكائن...
Instantiation :
تعريف كائن من الفئة يسمّى Instantiation .
من المعروف انك عندما تبني فئة, فهذه الفئة لن تأخذ مكانا في الذاكرة’ لأنها مجرد قالب, منه تستنسخ الكائنات.
عند تعريفك لكائن من هذه الفئة فالان انت حجزت مكان في الذاكرة بحجم الكائن.