السبت، 11 أبريل 2009

دروس جافا متقدمة شرحي الشخصي " الدرس الاول "Object Oriented Programming

دروس جافا متقدمة شرحي الشخصي " الدرس الاول "Object Oriented Programming
السلام عليكــم ورحمـة الله وبركاتــة ،،

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();
  }

}



الاكواد مفهومة لذلك سنتقل الي الدالة 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";

وهكذا في السطور اللتي تليه والتي تحدد ال age و weight و sex

اما بالنسبة للسلوك والذي هو عبارة عن method

فقد قمنا بتحديد اثنان من الدوال في الclass 

وهما feedHuman() و showinfo()

ولكي نربط الهدف h1 بالدالة نتبع القاعدة التالية 
كود
Objectname.Methodname();


    h1.feedHuman();
    h1.showinfo();

تقوم الدالة الاولى باختبار h1 هل هو جائع ام لا 

والثانية تقوم بعرض خصائص وسلوك الهدف من خلال البيانات التي تم تسجيلها من خلال الدوال


مثال على الوراثة 



كود
class Father{
    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);
}

}



كود
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();
}

}


من المثال السابق نلاحظ ان 

لتحقيق عملية الوراثة وتوريث class قديمة ل class جديدة عند انشائها نقوم بكتابة اسم ال class ثم كلمة extends

التي تعني ان هذه الفصيلة امتداد للفصيلة القديمة التي نكتب اسمها بعدها كما هو موضح في المثال 
كود
class son extends Father
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


ان شاء الله الشرح بيكون واضح

اي استفسار انا جاهز

ليست هناك تعليقات:

إرسال تعليق