السلام عليكــم ورحمـة الله وبركاتــة ،،
Object Oriented Programming (OOP)
لنتوضيح مفهوم البرمجة بالاهداف OOp لنرجع الي الخلف قليلا و نتحدث عن Structured programming
وما قبلها من لغات البرمجة
في بداية ظهو لغات البرمجة كان المبرمجون يكتبون البرنامج كله قطعة واحدة وكان ذلك يؤدي الي صعوبات كثيرة في التعامل مع الكود ويؤدي ايضا الي صعوبة فهم الكود والاخطاء الكثيرة.
ظهر بعدها ما يسمى ب Structured programming والتي غيرت الكثير في البرمجة حيث اصبح المبرمج يقوم بتقسيم البرنامج الي اجزاء
ويعطي لكل جزء اسم خاص به ثم يقوم بعد ذلك باستدعاء اسم ذلك الجزء في الدالة الرئيسية ليقوم بتنفيذ هذا الجزء حيث كل جزء يقوم بعمل معين ويسمى هذا الجزء دالة Function
اذا Structured programming هي عبارة عن مجموعة من الدوال Functions والدالة تتكون من مجموعة من البيانات والاوامر
مع استمرار تطور البرمجة وزيادة التعقيدات في البرامج كان من اللازم تطوير المفاهيم مثل Structured programming
وجاء ذلك التطوير في شكل جديد وهو البرمجة بالاهداف Object Oriented Programming (OOP)
لنأخذ مثال
لنفرض ان لدينا لعبة المكعبات ونريد بناء منزل
في البداية نبدا بتحديد عناصر المنزل مثل مكعبات البناء ونماذك الشبابيك ونموذج الباب .. الخ
بعد ذلك نقوم بتجميع كل العناصر التي قمنا باختيارها كل في دوره بالحجم المطلوب
هذا المثال يمثل تماما الكيفية التي نبني بها البرامج باستخدام البرمجة بالاهداف فنحن نعتبر كل عنصر مثل مكعبات البناء هدف object
البرنامج هو عبارة عن مجموعة من الاهداف تتفاعل مع بعضها البعض
الاختلاف الوحيد بين مثال لعبة المكعبات و بناء برنامج بالاهداف هو اننا لا نستطيع صنع اي مكعب فنحن نشتريه من البائع كما هو والذي يستطيع صنع اي عنصر من المكعبات
والذي لابد ان يكون لديه قالب الذي يصب فيه المادة الخام لصناعة هذه العناصر
اذا لابد ان يكون لكل عنصر قالب حتى نستطيع بناء عناصر متشابهة في كل الصفات والشكل
وهذا القالب في البرمجة بالاهداف OOP يسمى Class
لحسن الحظ ان كنت لا تستطيع صنع عنصر من عناصر لعبة المكعبات الا انك في البرمجة بالاهداف OOP تستطيع ان تصنع اي عنصر وذلك عن طريق انشاء قالب class
ينتمي اليها وفي الحقيقة انك لا تستطيع استخدام اي عنصر ما قبل ان تنشء له قالب class
مما سبق نستنتج التالي ::
في البرمجة بالاهداف OOP يوجد لدينا Class ومن هذه الفصيلة نستطيع ان ننشء اي عدد من الاهداف objects.
أهمية البرمجة بالاهدافOOP
كما وضحنا في المثال السابق ان كل الاشياء حولنا هى عبارة عن Objects وباستخدام البرمجة بالاهداف OOP نستطيع ان نمثل هذه الاشياء
ونستطيع ان نستعملها بدون الحاجة الي معرفة مما تتكون هذه الاشياء فانت مثلا تستخدم الثلاجة دون الحاجة الي معرفة مما تتركب منه ولا كيفية عمل الانظمة الداخلية لها
ولكن ما يهمك هو معرفة وظائف الثلاجة و كيف تجعلها تؤدي تلك الوظائف مثل التحكم في درجة الحرارة و درجة التجميد.
في البرمجة بالاهداف OOP نحن نهتم بالوظيفة التي تؤديها الClass دون الاهتمام بكيفية بناء هذه الفصيلة
بعد معرفتنا بوظائف هذه ال Class استطيع انشاء منها اي عدد اريده من objects.
مما سبق نستنتج التالي::
1- يمكنني انشاء اي Class اريده كقالب.
2- يمكنني استخدام اي Class قام مبرمجون آخرون بكتابتها وكل ما احتاج ان اعرفه هو الوظائف التي تقوم بها هذه ال Class
3- ال Class تتكون من دوال Functions وبيانات Data
في الواقع لغة جافا بكاملها هي مجموعة من الفصائل Classes منظمة في حزم Packages
وكل ما تحتاج ان تعرف ال Class التي تؤدي الوظيفة التي تريد عملها في برنامجك وتأخذ منها Object وتتعامل مع وظائقها.
فوائد البرمجة بالاهداف OOP
1- حماية البيانات
فالمبرمج الذي يستخدم ال Class لا يرى غالبا الكود المبني به هذه ال Class حتى لا يستطيع احد التغيير ولو عن طريق الخطأ
2- الكبسلة Encapsulation
فان كنا في Structured programming نقوم ببناء الدوال ونستدعيها الا اننا في البرمجة بالاهداف OOp نقوم بعملية تعبئة للبيانات والدوال معا
وتغليفهم في Class بحيث لا يرى الكود المكون لتلك الدوال والبيانات
ولكي تتعامل مع تلك الفصائل Classes يتم ذلك من خلال Objects التي تنتنمي لهذه الفصيلة
وفي الحقيقة ان عملية اخفاء البيانات تخضع لقواعد يضعها المبرمج أثناء تصميم ال Class وفيها يتحكم في طرق الوصول الي البيانات والدوال
التي بداخل الفصيلة .
3- الوراثة Inheritance
كان في السابق عندما اريد تطوير برنامج موجود بالفعل واريد ان ادخل عليه مزيد من الوظائف ( تطوير ) فاننا امام خيارين
1- الحصول على الشيفرة المصدرية للبرنامج واقوم بالتغيير فيها وهذا بالطبع صعب جدا لان من يصنع البرامج لا يقوم باعطاء المستخدمين
الشيفرة المصدري Source Code
2- ان اقوم باعادة كتابة البرنامج بأكمله وهذا يؤدي الي اضاعة الوقت وانفاق المزيد من المال
اذن ما الحل ؟؟؟؟
الحل باستخدام مبدأ من مبادئ البرمجة بالاهداف OOp وهو الوراثة لان كل البرامج المبنية باستخدام البرمجة بالاهداف OOp تتكون من Classes
وكما قلنا ان ال Classes التي بناها اخرون لا استطيع رؤية الكود ولكن استطيع التوصل الي البيانات والدوال الموجودة في هذه ال Classes
وعلى ذلك استطيع ان اكتب فصيلة جديدة اضيف اليها الدوال والبيانات الجديدة فقط مع استخدام الدوال والبيانات الموجودة في الكلاس القديم باستخدام الوراثة.
لنفترض انا هناك class تمثل سيارة اسمها car وبداخلها توجد بيانات مثل اللون و الحجم ووظائف تمثل السرعة و الفرامل .
ثم اردنا بعد ذلك ان نبتكر سيارة بها ميزة جديدة وهي الدفع الرباعي مثلا واسمها car2
ما الحل ؟
ان السيارة الجديدة هي تماما كالسيارة القديمة ولكن بها وظيفة جديدة هي الدفع الرباعي هنا يأتي دور الوراثة وتقول لنا اننا من الممكن استخدام وظائف و بيانات
السيارة العادية car مع اضافة الوظيفة الجديدة باستخدام الوراثة في فصيلة جديدة car2.
4- تعدد الاشكال Polymorphism
تعدد الاشكال يعني اننا نستطيع ان نجعل دالة ما تؤدي اكثر من وظيفة طبقا للهدف المرتبطة به.
لنفرض لدينا فصيلة مهمتها الرسم وبداخلها دالة مهمتها رسم دائرة ونفترض ان اخذنا من هذه الفصيلة اثنان من الاهداف
واردنا ان نجعل الهدف الاول يرسم دائرة والهدف الثاني يرسم مربع.
الان بعدما تعرفنا على ما هي الفصيلة class والهدف Instance Object
تعال لنتعرف على تفاصيل اكثر ::
ان اي class في لغة الجافا تتكون من جزئين اساسيين
1- الخصائص Attributes وهي البيانات او المتغيرات
2- السلوك او الوظيفة وهي الدوال Functions
لنأخذ مثال الانسان
الانسان له خصائص مثل الطول والعرض والوزن و لون الجلد و لون العينيين والجنس وجائع و شبعان
وله وظائف مثل يأكل و يشرب و يبصر ويقرا وينام
تعال معي الان للنشئ فصيلة الانسان
الاكواد مفهومة لذلك سنتقل الي الدالة main لتوضيح ماحدث بها
قمنا بانشاء هدف instance object ينتمي الي القالب Human وذلك لكي نستطيع التعامل مع ال class
فنحن لا نستخدم ال class بل عنصر منها والقاعدة لانشاء عنصر من class كالتالي
وهو موضح في المثال السابق
واسم الهدف object قد يكون اي اسم نختاره المهم ان يتبع القاعدة السابقة
كما قلنا ان ال object ياخد خصائص وسلوك ال class وهذا ما توضحه السطور التالية
فالهدف له خاصية تسمى name ولكي تربط هذه الخاصية بالهدف h1 فذلك يتبع القاعدة التالية
وهكذا في السطور اللتي تليه والتي تحدد ال age و weight و sex
اما بالنسبة للسلوك والذي هو عبارة عن method
فقد قمنا بتحديد اثنان من الدوال في الclass
وهما feedHuman() و showinfo()
ولكي نربط الهدف h1 بالدالة نتبع القاعدة التالية
تقوم الدالة الاولى باختبار h1 هل هو جائع ام لا
والثانية تقوم بعرض خصائص وسلوك الهدف من خلال البيانات التي تم تسجيلها من خلال الدوال
مثال على الوراثة
من المثال السابق نلاحظ ان
لتحقيق عملية الوراثة وتوريث class قديمة ل class جديدة عند انشائها نقوم بكتابة اسم ال class ثم كلمة extends
التي تعني ان هذه الفصيلة امتداد للفصيلة القديمة التي نكتب اسمها بعدها كما هو موضح في المثال
ال class المسمى son هو امتداد لل class المسمى Father وبالتالي ترث كل خصائصه وصفاته
وكذلك ال class المسمى Baby يرث من ال class المسمى son
Father
^
|
|
Son
^
|
|
Baby
ويمكن للكلاس baby استخدام متغيرات ودوال موجودة في son و Father
ال class المسمى Father يطلق عليه اسم Superclass
ال class المسمى son يطلق عليه اسم subclass
Father هي Superclass لـ son
Son هي Subclass من Father
كذلك الحال مع son و Baby
son هي SuperClass لـ Baby
Baby هي Subclass من son
ان شاء الله الشرح بيكون واضح
اي استفسار انا جاهز
Object Oriented Programming (OOP)
لنتوضيح مفهوم البرمجة بالاهداف OOp لنرجع الي الخلف قليلا و نتحدث عن Structured programming
وما قبلها من لغات البرمجة
في بداية ظهو لغات البرمجة كان المبرمجون يكتبون البرنامج كله قطعة واحدة وكان ذلك يؤدي الي صعوبات كثيرة في التعامل مع الكود ويؤدي ايضا الي صعوبة فهم الكود والاخطاء الكثيرة.
ظهر بعدها ما يسمى ب Structured programming والتي غيرت الكثير في البرمجة حيث اصبح المبرمج يقوم بتقسيم البرنامج الي اجزاء
ويعطي لكل جزء اسم خاص به ثم يقوم بعد ذلك باستدعاء اسم ذلك الجزء في الدالة الرئيسية ليقوم بتنفيذ هذا الجزء حيث كل جزء يقوم بعمل معين ويسمى هذا الجزء دالة Function
اذا Structured programming هي عبارة عن مجموعة من الدوال Functions والدالة تتكون من مجموعة من البيانات والاوامر
مع استمرار تطور البرمجة وزيادة التعقيدات في البرامج كان من اللازم تطوير المفاهيم مثل Structured programming
وجاء ذلك التطوير في شكل جديد وهو البرمجة بالاهداف Object Oriented Programming (OOP)
لنأخذ مثال
لنفرض ان لدينا لعبة المكعبات ونريد بناء منزل
في البداية نبدا بتحديد عناصر المنزل مثل مكعبات البناء ونماذك الشبابيك ونموذج الباب .. الخ
بعد ذلك نقوم بتجميع كل العناصر التي قمنا باختيارها كل في دوره بالحجم المطلوب
هذا المثال يمثل تماما الكيفية التي نبني بها البرامج باستخدام البرمجة بالاهداف فنحن نعتبر كل عنصر مثل مكعبات البناء هدف object
البرنامج هو عبارة عن مجموعة من الاهداف تتفاعل مع بعضها البعض
الاختلاف الوحيد بين مثال لعبة المكعبات و بناء برنامج بالاهداف هو اننا لا نستطيع صنع اي مكعب فنحن نشتريه من البائع كما هو والذي يستطيع صنع اي عنصر من المكعبات
والذي لابد ان يكون لديه قالب الذي يصب فيه المادة الخام لصناعة هذه العناصر
اذا لابد ان يكون لكل عنصر قالب حتى نستطيع بناء عناصر متشابهة في كل الصفات والشكل
وهذا القالب في البرمجة بالاهداف OOP يسمى Class
لحسن الحظ ان كنت لا تستطيع صنع عنصر من عناصر لعبة المكعبات الا انك في البرمجة بالاهداف OOP تستطيع ان تصنع اي عنصر وذلك عن طريق انشاء قالب class
ينتمي اليها وفي الحقيقة انك لا تستطيع استخدام اي عنصر ما قبل ان تنشء له قالب class
مما سبق نستنتج التالي ::
في البرمجة بالاهداف OOP يوجد لدينا Class ومن هذه الفصيلة نستطيع ان ننشء اي عدد من الاهداف objects.
أهمية البرمجة بالاهدافOOP
كما وضحنا في المثال السابق ان كل الاشياء حولنا هى عبارة عن Objects وباستخدام البرمجة بالاهداف OOP نستطيع ان نمثل هذه الاشياء
ونستطيع ان نستعملها بدون الحاجة الي معرفة مما تتكون هذه الاشياء فانت مثلا تستخدم الثلاجة دون الحاجة الي معرفة مما تتركب منه ولا كيفية عمل الانظمة الداخلية لها
ولكن ما يهمك هو معرفة وظائف الثلاجة و كيف تجعلها تؤدي تلك الوظائف مثل التحكم في درجة الحرارة و درجة التجميد.
في البرمجة بالاهداف OOP نحن نهتم بالوظيفة التي تؤديها الClass دون الاهتمام بكيفية بناء هذه الفصيلة
بعد معرفتنا بوظائف هذه ال Class استطيع انشاء منها اي عدد اريده من objects.
مما سبق نستنتج التالي::
1- يمكنني انشاء اي Class اريده كقالب.
2- يمكنني استخدام اي Class قام مبرمجون آخرون بكتابتها وكل ما احتاج ان اعرفه هو الوظائف التي تقوم بها هذه ال Class
3- ال Class تتكون من دوال Functions وبيانات Data
في الواقع لغة جافا بكاملها هي مجموعة من الفصائل Classes منظمة في حزم Packages
وكل ما تحتاج ان تعرف ال Class التي تؤدي الوظيفة التي تريد عملها في برنامجك وتأخذ منها Object وتتعامل مع وظائقها.
فوائد البرمجة بالاهداف OOP
1- حماية البيانات
فالمبرمج الذي يستخدم ال Class لا يرى غالبا الكود المبني به هذه ال Class حتى لا يستطيع احد التغيير ولو عن طريق الخطأ
2- الكبسلة Encapsulation
فان كنا في Structured programming نقوم ببناء الدوال ونستدعيها الا اننا في البرمجة بالاهداف OOp نقوم بعملية تعبئة للبيانات والدوال معا
وتغليفهم في Class بحيث لا يرى الكود المكون لتلك الدوال والبيانات
ولكي تتعامل مع تلك الفصائل Classes يتم ذلك من خلال Objects التي تنتنمي لهذه الفصيلة
وفي الحقيقة ان عملية اخفاء البيانات تخضع لقواعد يضعها المبرمج أثناء تصميم ال Class وفيها يتحكم في طرق الوصول الي البيانات والدوال
التي بداخل الفصيلة .
3- الوراثة Inheritance
كان في السابق عندما اريد تطوير برنامج موجود بالفعل واريد ان ادخل عليه مزيد من الوظائف ( تطوير ) فاننا امام خيارين
1- الحصول على الشيفرة المصدرية للبرنامج واقوم بالتغيير فيها وهذا بالطبع صعب جدا لان من يصنع البرامج لا يقوم باعطاء المستخدمين
الشيفرة المصدري Source Code
2- ان اقوم باعادة كتابة البرنامج بأكمله وهذا يؤدي الي اضاعة الوقت وانفاق المزيد من المال
اذن ما الحل ؟؟؟؟
الحل باستخدام مبدأ من مبادئ البرمجة بالاهداف OOp وهو الوراثة لان كل البرامج المبنية باستخدام البرمجة بالاهداف OOp تتكون من Classes
وكما قلنا ان ال Classes التي بناها اخرون لا استطيع رؤية الكود ولكن استطيع التوصل الي البيانات والدوال الموجودة في هذه ال Classes
وعلى ذلك استطيع ان اكتب فصيلة جديدة اضيف اليها الدوال والبيانات الجديدة فقط مع استخدام الدوال والبيانات الموجودة في الكلاس القديم باستخدام الوراثة.
لنفترض انا هناك class تمثل سيارة اسمها car وبداخلها توجد بيانات مثل اللون و الحجم ووظائف تمثل السرعة و الفرامل .
ثم اردنا بعد ذلك ان نبتكر سيارة بها ميزة جديدة وهي الدفع الرباعي مثلا واسمها car2
ما الحل ؟
ان السيارة الجديدة هي تماما كالسيارة القديمة ولكن بها وظيفة جديدة هي الدفع الرباعي هنا يأتي دور الوراثة وتقول لنا اننا من الممكن استخدام وظائف و بيانات
السيارة العادية car مع اضافة الوظيفة الجديدة باستخدام الوراثة في فصيلة جديدة car2.
4- تعدد الاشكال Polymorphism
تعدد الاشكال يعني اننا نستطيع ان نجعل دالة ما تؤدي اكثر من وظيفة طبقا للهدف المرتبطة به.
لنفرض لدينا فصيلة مهمتها الرسم وبداخلها دالة مهمتها رسم دائرة ونفترض ان اخذنا من هذه الفصيلة اثنان من الاهداف
واردنا ان نجعل الهدف الاول يرسم دائرة والهدف الثاني يرسم مربع.
الان بعدما تعرفنا على ما هي الفصيلة class والهدف Instance Object
تعال لنتعرف على تفاصيل اكثر ::
ان اي class في لغة الجافا تتكون من جزئين اساسيين
1- الخصائص Attributes وهي البيانات او المتغيرات
2- السلوك او الوظيفة وهي الدوال Functions
لنأخذ مثال الانسان
الانسان له خصائص مثل الطول والعرض والوزن و لون الجلد و لون العينيين والجنس وجائع و شبعان
وله وظائف مثل يأكل و يشرب و يبصر ويقرا وينام
تعال معي الان للنشئ فصيلة الانسان
كود
class Human{
int age;
int weight;
String sex;
String name;
boolean hungry=true;
void feedHuman(){
if(hungry==true)
{
System.out.println("WOW I'm eating a fish");
hungry=false;
}
else
System.out.println("Thanks i already ate");
}
void showinfo(){
System.out.println("This human name is "+" "+name+" "+"age= "+" "+age+" "+"weight ="+" "+weight+" "+"sex is "+" "+sex);
if(hungry==true)
System.out.println("\n The human is hungry");
else
System.out.println("\n The human not hungry");
}
public static void main(String arg[]){
Human h1=new Human();
h1.age=24;
h1.name="hany";
h1.sex="male";
h1.weight=80;
h1.feedHuman();
h1.showinfo();
}
}
int age;
int weight;
String sex;
String name;
boolean hungry=true;
void feedHuman(){
if(hungry==true)
{
System.out.println("WOW I'm eating a fish");
hungry=false;
}
else
System.out.println("Thanks i already ate");
}
void showinfo(){
System.out.println("This human name is "+" "+name+" "+"age= "+" "+age+" "+"weight ="+" "+weight+" "+"sex is "+" "+sex);
if(hungry==true)
System.out.println("\n The human is hungry");
else
System.out.println("\n The human not hungry");
}
public static void main(String arg[]){
Human h1=new Human();
h1.age=24;
h1.name="hany";
h1.sex="male";
h1.weight=80;
h1.feedHuman();
h1.showinfo();
}
}
الاكواد مفهومة لذلك سنتقل الي الدالة main لتوضيح ماحدث بها
قمنا بانشاء هدف instance object ينتمي الي القالب Human وذلك لكي نستطيع التعامل مع ال class
فنحن لا نستخدم ال class بل عنصر منها والقاعدة لانشاء عنصر من class كالتالي
كود
classname objectname=new classname();
وهو موضح في المثال السابق
كود
Human h1=new Human();
واسم الهدف object قد يكون اي اسم نختاره المهم ان يتبع القاعدة السابقة
كما قلنا ان ال object ياخد خصائص وسلوك ال class وهذا ما توضحه السطور التالية
كود
h1.name="hany";
فالهدف له خاصية تسمى name ولكي تربط هذه الخاصية بالهدف h1 فذلك يتبع القاعدة التالية
كود
Objectname.variablename=value;
h1.name="hany";
h1.name="hany";
وهكذا في السطور اللتي تليه والتي تحدد ال age و weight و sex
اما بالنسبة للسلوك والذي هو عبارة عن method
فقد قمنا بتحديد اثنان من الدوال في الclass
وهما feedHuman() و showinfo()
ولكي نربط الهدف h1 بالدالة نتبع القاعدة التالية
كود
Objectname.Methodname();
h1.feedHuman();
h1.showinfo();
h1.feedHuman();
h1.showinfo();
تقوم الدالة الاولى باختبار h1 هل هو جائع ام لا
والثانية تقوم بعرض خصائص وسلوك الهدف من خلال البيانات التي تم تسجيلها من خلال الدوال
مثال على الوراثة
كود
class Father{
int age;
void setAge(int age){
this.age=age;
}
void showAge(){
System.out.println("Age= "+age);
}
}
int age;
void setAge(int age){
this.age=age;
}
void showAge(){
System.out.println("Age= "+age);
}
}
كود
class son extends Father{
int salary;
void setSalary(int salary){
this.salary=salary;
}
void showSalary(){
System.out.println("salary= "+salary);
}
}
int salary;
void setSalary(int salary){
this.salary=salary;
}
void showSalary(){
System.out.println("salary= "+salary);
}
}
كود
class Baby extends son{
int talking;
void setState(int x){
this.talking=x;
if(talking==0)
System.out.println("Baby can't talking");
else
System.out.println("Baby can talk");
}
public static void main(String arg[]){
Baby b1=new Baby();
b1.setAge(2);
b1.setState(0);
Baby b2=new Baby();
b2.setAge(20);
b2.setState(1);
b2.setSalary(200);
b2.showAge();
b2.showSalary();
}
}
int talking;
void setState(int x){
this.talking=x;
if(talking==0)
System.out.println("Baby can't talking");
else
System.out.println("Baby can talk");
}
public static void main(String arg[]){
Baby b1=new Baby();
b1.setAge(2);
b1.setState(0);
Baby b2=new Baby();
b2.setAge(20);
b2.setState(1);
b2.setSalary(200);
b2.showAge();
b2.showSalary();
}
}
من المثال السابق نلاحظ ان
لتحقيق عملية الوراثة وتوريث class قديمة ل class جديدة عند انشائها نقوم بكتابة اسم ال class ثم كلمة extends
التي تعني ان هذه الفصيلة امتداد للفصيلة القديمة التي نكتب اسمها بعدها كما هو موضح في المثال
كود
class son extends Father
class Baby extends son
class Baby extends son
ال class المسمى son هو امتداد لل class المسمى Father وبالتالي ترث كل خصائصه وصفاته
وكذلك ال class المسمى Baby يرث من ال class المسمى son
Father
^
|
|
Son
^
|
|
Baby
ويمكن للكلاس baby استخدام متغيرات ودوال موجودة في son و Father
ال class المسمى Father يطلق عليه اسم Superclass
ال class المسمى son يطلق عليه اسم subclass
Father هي Superclass لـ son
Son هي Subclass من Father
كذلك الحال مع son و Baby
son هي SuperClass لـ Baby
Baby هي Subclass من son
ان شاء الله الشرح بيكون واضح
اي استفسار انا جاهز
ليست هناك تعليقات:
إرسال تعليق