أساسيات و مفاهيم يجب عليك إدراكها حول البرمجة كائنية التوجه OOP ( الجزء الخامس - الـ Constructors)

أساسيات و مفاهيم يجب عليك إدراكها حول البرمجة كائنية التوجه OOP ( الجزء الخامس - الـ Constructors)

مرحبا بك، قمنا في مقالاتنا المنصرمة بتوفير كم من المعلومات في دورتنا المقالية حول مفاهيم الـ OOP و كيفية إستنادها، شرحنا لك في الدروس الأولى مفاهيم الـ OOP و كيف يختلف عن  البرمجة المعتادة، و لما الـ OOP ضروري التعلم أيضا، ثم إنتقلنا طيلة 3 دروس أخرى نشرح لك فيها مفهوم كل من الكلاس، أساس البرمجة كائنية التوجه، و إنتقلنا معك الى مفهوم الـ Object الذي نقوم بصناعته بالإعتماد على الكلاس و يأخذ معطيات و مدخلات الكلاس البرمجي، و في آخر درس تحققنا من 3 مفاهيم و هي Private , Protected, Public او ثلاثية الـ P، المسماة عالميا بالـ Access Modifiers، و تطرقنا الى كيفية إستخدامها و اين يتوجب عليك إستخدامها . 
في الجزء الخامس، سنتعرف على مفهوم الـ Constructors، واحد من اهم المفاهيم المتعلقة بمجال الـ OOP، و ستستخدمه كثيرا اثناء تكويد و صناعة برمجيات تعتمد على البرمجة كائنية التوجه في حياتك المهنية او مشاريعك  البرمجية، فهي من الأساسيات المشكلة للكلاس، فدعونا نتعرف عليها أكثر . 

للإطلاع على الدروس السابقة : 

  1. أساسيات و مفاهيم يجب عليك إدراكها حول البرمجة كائنية التوجه OOP ( الجزء الأول - تمهيد )
  2. أساسيات و مفاهيم يجب عليك إدراكها حول البرمجة كائنية التوجه OOP ( الجزء الثاني - Classes)
  3. أساسيات و مفاهيم يجب عليك إدراكها حول البرمجة كائنية التوجه OOP ( الجزء الثالث - الـ Objects)
  4. أساسيات و مفاهيم يجب عليك إدراكها حول البرمجة كائنية التوجه OOP ( الجزء الرابع - الـ Access Modifiers)

أساسيات و مفاهيم يجب عليك إدراكها حول البرمجة كائنية التوجه OOP ( الجزء الخامس - الـ Constructors)

- ما هو الـ Constructors : 

يمكننا تعريف الـ Constructor على أنه حدث يتم تشغيله مباشرة حين يتم إستخدام الكلاس من طرف الـ Object، فمن أجل بدئ إستخدام الكلاس في الأخير، سيتوجب عليك إنشاء Object من الكلاس كما اشرنا في الدروس السابقة، لكن ماذا لو أردنا إنشاء حدث معين أثناء إنشاء Object ؟ ماذا لو أردنا إحتساب مثلا عدد الـ Objects التي تم صناعتها على سبيل المثال ؟ 
الـ Constructor هو دالة يتم تضمينها داخل الكلاس، تحمل هذه الدالة نفس إسم الكلاس الموجودة بداخله، تلقائيا و بشكل إفتراضي، يتم تحديد Constructor من طرف الكلاس حتى و إن لم تقم بكتابته، و يُسمى بالـ Default Constructor، و يعتبر الـ Constructor من أساسيات الـ OOP و تجسيداتها، و يساعدنا بالتعامل بشكل أكثر إحترافية مع الـ Object حين يتم إنشائها . 


أنواع الـ Constructors : 



كما سبق الذكر، فإنه يوجد أنواع من الـ Constructors لكل نوع وظيفة و حدث معين حين يشتغل، من أهم هذه الانواع يوجد : 
* الـ Default Constructor : وهو الـ Constructor الرئيسي او الأساسي او الإفتراضي، يمكنك إما تحديده، او سيتم تحديده إفتراضيا دون كتابته، لكن يفضل ان تحدده بنفسك فإن تطلب منك تعديل بعض الخواص فيه سيكون أسهل، في الغالب يكون هذا الـ Constructor فارغا في حالة لم تريد إنشاء اي تعديل او تحديث حين يتم إنشاء الـ Object . 
* الـ Parametrized Constructor : و هو نوع من الـ Constructor يتضمن مجموعة من المدخلات على شكل Parameters، في الغالب تكون هذه المدخلات هي الـ Attributes الخاصة بالكلاس ( كما شرحنا سابقا في درس ما هو الكلاس ) . 
يوجد أنواع أخرى من الـ Constructors مثل الـ Static Constructor و Copy Constructor، لكن في الوقت الراهن سنكتفي فقط بهذين النوعين لأنهما الأكثر إستخداما و سنحتاجهما في الدروس القادمة .


- كيفية إنشاء Constructor و أساسيات إنشائه : 



قبل إنشاء الـ Constructor، إليك أولا هذه النقاط الأساسية التي يجب عليك معرفتها : 
يتم إنشاء الـ Constructor في الكلاس الخاصة بنا ( في هذه الحالة سنستعين بكلاس Computer التي إشتغلنا عليها سابقا )، و يجب أن يكون إسم الـ Constructor مشابه تماما لإسم الكلاس سواء في الـ Default او الـ Parametrized، يمكن إنشاء الإثنين معا في نفس الكلاس، سيتم التعرف على كل واحد منهما أثناء الإستخدام عن طريق عملية الـ Overloading ( سنعود لها لاحقا في الدروس القادمة )، الـ Constructor  شبيه بالـ Methode لكن لا يتم تحديد نوعه قبلا ( اي String او Void ) . 
هذا مثال بسيط لإدراج الـ Constructor في الكلاس الخاصة بنا : 



This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
public class Computer {
// Set Properties - تحديد الخواص
private int id;
private String name;
private String ramModel;
private String motherBoardModel;
// Set Default Constructor - تحديد الإفتراضي :
public Computer() {}
// Set Parametrized Constructor - تحديد النوع الثاني :
public Computer(int id, String name, String ramModel, String motherBoardModel){
this.id = id;
this.name = name;
this.ramModel = ramModel;
this.motherboardModel = motherBoardModel;
}
// Set Actions - تحديد الأفعال
public void turnOn() {
System.out.Println("Computer is turned on");
}
public void turnOff(){
System.out.Println("Computer is turned off");
}
}
/*
* Created by : www.Aqweeb.com
*/


ستلاحظ هنا بعض الأشياء الجديدة مثل this و لما أضفنا بالضبط نفس خواص الكلاس في الـConstructor، فلا تقلق، سنجيبك على هذا بالطبع، او إنتقل مباشرة الى فقرة شرح Parametrized Constructor لفهمها حالا . 

- شرح الـ Default Constructor : 


و هو إفتراضي كما أشرنا سابقا، يشتغل هذا الـ Constructor مباشرة بعد إنشاء الـ Object التابع للكلاس، و ذلك حين نقوم بعمل Computer Acer = new Computer فبذلك سيشتغل الـ Constructor الإفتراضي تلقائيا للتحقق من الأمر بشكل مقرب، دعونا نضيف أمر طباعة في الـ Constructor ثم نقوم بصناعة Object من الكلاس ثم نشغل البرنامج و نرى النتيجة : 



This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
// Modifie the Default Constructor :
public class Computer {
... // Attributes Here
// Set Default Constructor - تحديد الإفتراضي :
public Computer() {
System.out.println(" Default Constructor Worked ! " );
}
}
/*
* Created by : www.Aqweeb.com
*/


فور إنشاء Object كما في الدروس السابقة و تشغيل البرنامج، مباشرة سيُظهر لنا رسالة انه تم تشغيل هذا الـ Constructor و ذلك لأنه يُفعل تلقائيا في كل مرة نقوم بصناعة Object من الكلاس . 

- شرح الـ Paramerized Constructor : 

على عكس الـ Default Const، فإن الـ Parametrized يتطلب إضافة مجموعة من الـ Parameters في الـ Constructor، يتم التفرقة بين كل منهما عن طريق الـ Overloading، حين نقوم بصناعة Object دون تمرير أي قيم فتلقائيا يأخذ الـ Default Constructor، في حالة إدراج قيم معينة، فيتم تهيئة الـ Parametrized Constructor، يتم تمرير القيم في أثناء صناعة الـ Object بالشكل التالي : 


This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
// Modifie the Default Constructor :
public class Computer {
private int id;
private String name;
private String ramModel;
private String motherBoardModel;
... // Class Elements Here
}
public class Main {
... // Class Elements Here
Computer Acer = new Computer(1, "Acer Aspire", "Samsung", "Mot78") // Parametrized Object
}
/*
* Created by : www.Aqweeb.com
*/

ترى  جليا أنني ادخلت القيم مباشرة في الـ Object و هنا نتحدث عن الـ Parametrized Object، في حالة قمت بنفس العملية دون تحديد الـ Parametrized Constructor في الكلاس، فسيظهر لك خطأ في الكود البرمجي، لأن هذه الأخيرة لا يتم وضعها إفتراضيا كما الـ Constructor الإفتراضية . 
لنتحدث قليلا الآن عن وسط الـ Parametried Constructor و الكود التالي : 

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
// Set Parametrized Constructor - تحديد النوع الثاني :
public Computer(int id, String name, String ramModel, String motherBoardModel){
this.id = id;
this.name = name;
this.ramModel = ramModel;
this.motherboardModel = motherBoardModel;
}

تستطيع ان ترى جليا ان الـ Constructor تتطلب مجموعة  من المدخلات، و هي التي أدرجناها في الـ Object في الكود سابقه، الآن إن ولجنا الى وسط الـ Constructor، فسنجد انه بدأ بمعالجة هذه المدخلات بطريقة بسيط، قمنا بتحديد ان قيم المدخلات التي تمت عبر الـ Object ستأخذها قيم الكلاس من أجل تأكيد صناعة الـ Object، من أجل فعل ذلك، علينا ان نربط كل قيمة مُدخلة من خلال الـ Constructor، بالقيمة المناسبة لها في الكلاس، لكن إن لاحظت جيدا، فإسم المدخلات يحمل نفس إسم عناصر الكلاس، مثل id و id و غيرها، فكيف يمكن تحديد الفرق بينها ؟ 
لفعل ذلك، سنستعين بخاصية this، تسمح لنا this بتحديد القيمة التابعة للكلاس، بحيث اخبره ان يأخذ متغير هذا الكلاس اي this.id، ثم يأخذ القيمة القادمة من خلال الـ Parameter و هي id . 
يمكنك ان تجعل أسماء المتغيرات مختلفة إن اردت، لكن سيتطلب منك دائما إستخدام this حين تريد إستخدام احد المتغيرات او Attributes داخل الكلاس وسط Method في الكلاس أيضا، غير هذا قد يُظهر لك خطأ في الكود البرمجي . 

إذن إلى هنا ننهي معك درسنا الخاص بالـ Constructor، أتمنى ان يكون هذا الدرس مفهوم و جيد، في حالة توفر أي سؤال، نحن نفتح أبوابنا في التعليقات لنجيبك دائما .  

Said 22 مايو 2020 في 5:33 م

شرح واضح أستاذ رضى