تبسيط مفهوم الكلاس للغة الجافا بالتقريب الى الحياة
تبسيط مفهوم الكلاس للغة الجافا بالتقريب الى الحياة
السلام عليكم ورحمة الله وبركاتة
هذه مقالة مبسطة لشرح مفهوم الـ Class بلغة البرمجة الـ Java لكل من يعاني من صعوبة في فهمها. فمن مدة قمت بكتابة مقاله مشابهه لها لتقريب مفهوم الكلاس بالبايثون في احدى المواقع الانجليزيه وقد نالت على الاعجاب, فأحببت ان اكتب مقاله تخدم نفس الهدف ولكن باللغة العربية وبلغة البرمجة الاكثر عمقاً وهي الجافا. الشرح مناسب لكل الاعمار, يستخدم الطريقة المشهورة في تبسيط الامور وهي: explain like I'm five, اي اشرحها لي كأني طفل او مبتدئ. فأرى ان كل شخص يريد تعلم شئ جديد يفوق مستواه الحالي في الفهم, في البداية يجب عليه ان يتواضع ويحاول فهمها كانه يملك دماغ طفل! بعيداً عن الغطرسة والمصطلحات المعقدة والتي بدورها تصعب الامور.
هذه الصوره لـ ام وابنتها ونرى مدى تشابههم مع بعضهم البعض, وكأنهم يمثلون Class و Object.
شرح مفهوم الكلاس بشكل تقريبي للحياة الطبيعية
سيكون الشرح على شكل نقاط حتى يسهل الفهم, وستكون الامثله تقريبيه للحياه الطبيعيه لتسهيل الفهم فقط لاغير. وتستطيع قرائة هذه المقاله اكثر من مره والرجوع لها اذا واجهت مصطلح غامض اثناء تعلمك البرمجة بلغة الجافا. وان شاء الله سوف تنير لك طريقك.
- الـ Class تمثل في الحقيقة امك.
- الـ Object هو انت. و Object اخر يعتبر اختك او اخاك. ونستطيع تسميتكم بـ Instances of the class. اي اولاد ملكيتكم ترجع الى امكم.
- الـ Class Constructor تستطيع القول انه الرحم الذي سوف تتكون بداخله انت وجيناتك.
- الـ Declaration وهي عملية تحديد الـ Variables قبل استخدامها, اي تصريح الام بقيمها التي تتدخل في جيناتك و عملية ولادتك.
- الـ Class Fields تمثل قيم الام, والتي تتدخل في عملية ولادتك دائماً بشكل فريد عن باقي اخوتك واخواتك. كأسمك, لون بشرتك, وتسمى نسبتاً لك بالعادة Object Attributes. وفي بعض الاحيان يكون بعضها قيم خاصة للإم نفسها كأسم امك (ملاحظة بالنسبة لإسم الام: راح يكون static و public اي ثابت وعام وتستطيع السؤال عنه بدون اوجكتات. اما باقي الاشياء فمن المفضل جعلها private اي خاصة).
- الـ Instantiation هنا يبدئ التمهيد لعملية الولادة لك.
- الـ Initialization هنا قامت بولادتك الام. طبعاً باستخدام كلمة new والنداء على الـ Constructor اي الرحم.
- الـ Initialization Block عباره عن قطعه من الكود تعمل في كل مره تم انشاء اوبجكت من الكلاس, وتعمل مره واحده للكلاس نفسها. مثلاً كانها صرخة الولادة لكل طفل, او تحول المرأه الى ام, فالتحول هذا يصبح مره واحده في حياة المرأه.
- ألـ Class Methods or Functions تعتبر الافعال التي سوف تعلمك اياها امك وتختمها عن ظهر قلب بعد ولادتك. ككيفية ترتيب سريرك, كيفية الاكل, فرك اسنانك بالفرشاه والمعجون, نطق اسمك الخ.... وايضاً بعض من هذه الافعال راح تكون static اي امك التي تقوم بها, ونستطيع استخدامها من خلال امك بدون اوبجكتات (بدون حاجتك), كفعل نطق امك لاسمها متى شائت.
- الـ Getter and Setter نتدرج من الافعال (الميثودز) التي تعلمك اياه امك.
- الـ Inheritance اي كلمة extends تاتي بمعنى الوراثة, مثال: لو وضعنا هذه الكلمة بعد اسم امك ثم اتينا باسم جدتك, سوف ترث امك جميع تعاليم جدتك وافعالها وقيمها وطريقة تربيتها لإولادها وتطبقها عليك (الاوبجكت).
- الـ Super تاتي هذه الكلمة في حالة الوراثة, اذا احتجت مساعده من الجده, تطلبها من خلال كتابة هذه الكلمة.
- في حالة الوراثة تسمى امك بكلاس الـ Child Class وجدتك باسم الـ Parent Class او Super Class. وانت تصبح ملكيتك الى امك, والى كلاس جدتك ايضاً.
- وايضاً (في حالة الورثاة) اذا اردت ان تتعامل مع امك حالياً تستخدم كلمة this واذا اردت ان تتعامل مع جدتك تستخدم كلمة super.
- الـ Overriding او كلمة @Override الموجوده فوق بعض افعال (ميثودات) الام التي ورثتها. هذه الكلمة تضعها الام في حالة تريد تغيير في فعل ورثته من جدتك. اي اذا ورثة وصفة طبخ ما وتريد تغيير بعض من مقاديرها, هنا تستخدم هذه الكلمة.
- لغة الجافا لاتحب الوراثة في كلاساتها! عكس لغة السي شارب! فالجافا لاتسمح للوراثة الا من شخص واحد او بالاحرى من جهه وحده. فإما ترث انت من جهت امك او من جهت ابوك! فقط لاغير. لتفتادي مشاكل التعقيد كمشكلة الالماسة القاتلة في البرمجة قدر المستطاع!
- الـ implements تستخدم هذه الكلمة لتحقيق رغبة الوراثه المتعدده واشياء اخرى كثيره. فهي تأتي بعد اسم الكلاس تلحقها باسماء كثيره من الـ interface. وهكذا تصبح للكلاس خصائص متعدده كثيره بدون الوراثه, نستطيع القول هنا انها مشابهه بالتقليد! اي ان امك قامت باخد وتقليد طرق وقيم وافعال كل من عماتك, خالاتك, جاراتك الخ... في تربيتك, بدون الحاجه منها ان ترثهم.
- الـ interface ليس معناتها واجهت المستخدم, بل المقصود هنا بالبرمجة هي الواجهه التي تكون بينك وبين اي طرف اخر تريده بالبرمجة. نستخدمها في البرمجة لإجبار الكلاس (امك) على اضافة افعال وقيم لها, بدون الحاجة الى الوراثة. وعلى امك ان تكتب هذه القيم والافعال كما تريد.
- دائماً فضل استخدام الـ interface على الكلاس. اي دائماً فضل الـ implements على الـ extends.
- ملاحظة: في حالة الوراثة لاتحتاج الى كتابة جميع افعال (ميثودز) تلك الكلاس. ولكن في حالة الـ implemention من interface تحتاج بشكل ضروري الى كتابة جميع تلك الافعال (ميثودز) كـ @Override والا ستتعطل الكلاس.
- ملاحظة: للـ interface استخدامات متعدده وكثيره جداً.
- الـ abstract كلمة تستخدم قبل اسم الكلاس, لجعها كلاس مجرده! اي جدة قابلة للوراثة فقط ولا تستطيع ولادة اي كائن لا امك ولا انت! اي كانها جدة قامت بتبني امك ثم قامت امك بوراثتها! يقوم عملها كـتعامل امك مع الـ interface تقريباً.
شرح بعض من كلمات لغة الجافا التي تتداخل مع مفهوم الكلاس بشكل تقريبي للحياة الطبيعية
- كلمة الـ private اي خاص, تستخدمها للاشياء الخاصة فقط, كمثلا لون ملابسك الداخلية.
- كلمة الـ public اي عام, تستخدمها للاشياء التي تريدها ان تكون عامه ومنظوره من قبل الجميع كوجهك.
- كلمة الـ protected اي خاصة بعض الشئ, تستخدمها للاشياء التي تريدها فقط ان تكون معروفة بين افراد اسرتك واقربائهم, ومخفيه على العالم. كاسرار عائلتك مثلا.
- بدون كلمة! خاصة فقط لك و لعائلتك التي في منزلك فقط لا اقرباء. وهذا هي القيمة الافتراضية بلغة الجافا, اي انك اذا لم تختر اي من احد الكلمات الثلاث السابقة.
- كلمة الـ final تستخدم للاشياء التي نريدها ان تكون غير قابله للتغير. كنسبك الى امك, لاتستطيع تغييره ابداً.
مثال برمجي للكلاس:
هذا مثال برمجي يحاكي ماتم تناولة في النقاط السابقة.
كلاس الام:
حاول ان تتمعن بالكلاس وارجع الى النقاط بالشرح لتوضيح الفهم لديك وتقريب المعنى.
/**
* Created by mohammad on 10/13/17.
*/
public class Mother extends GrandMother implements Aunt, Uncle{
// Class Fields
public static final String TAG = "Mother Class Tag"; // <--- filed can not be changed
private String mName;
private String mSkinColor;
public static String mYourMotherName;
private static int mTotalChild = 0;
// Initialization Block - running just one time
// Static one
static {
Log.d("TAG", "static initializer: Woman Become Mother");
}
// Initialization Block - running each time an object created
// instance one
{
Log.d(TAG, "instance initializer: Mother Cry of pain");
mTotalChild = mTotalChild + 1;
}
// Class Constructor
public Mother(String childName){
mName = childName;
}
// getters and setters (same as methods/functions)
public static int getChildNumber(){
return mTotalChild;
}
public static void setYourMotherName(String yourMotherName){
mYourMotherName = yourMotherName;
}
// methods / functions
public void eat(){
Log.d(TAG, this.mName + " eat: I'm eating ..."); // <-- this, refer to who is eating here
Log.d(TAG, mName + " eat: I'm eating ..."); // <-- or by using m principle better
}
public void speak(){
Log.d(TAG, "speak: My name is: " + mName);
}
// method from GrandMother class
// Okay to remove it if you don't need it
@Override
public void cookingPizza() {
super.cookingPizza(); // <-- making the pizza with grandMother recipe.
// <-- if you want yours recipe remove super.cookingPizza();
// <-- and write your recipe.
}
// method from you Aunt interface
// you must implemented it (have it) or your program gonna crash (you can't remove it)
// and it's okay to leave its body empty.
@Override
public void drawing() {
}
}
استخدامها:
// Instantiation Initialization
Mother firstChild = new Mother("Noah");
Mother secondChild = new Mother("Emily");
// setting a name for your mother by using the setter
Mother.setYourMotherName("Emma");
// calling your mother name from her static fields
Log.d(TAG, "Your MotherName is : " + Mother.mYourMotherName);
// making you and your sister doing what your *mother* teach you
firstChild.cookingPizza(); // <-- *her* inherited cooking pizza from her grand mother and teach it to you.
secondChild.eat(); // <-- *her* teach your sister how to eat.
// asking your mother how many child she give birth to
Log.d(TAG, "Total Children: " + Mother.getChildNumber());
النتيجة:
Woman Become Mother initializer: Mother Cry of pain initializer: Mother Cry of pain Your MotherName is : Emma Class: cookingPizza: Pizza is cooking Class Tag: Emily eat: I'm eating ... Class Tag: Emily eat: I'm eating ... Total Children: 2
اخيراً
اتمنى ان المعلومة وصلت بسهوله لك اختي \ اخي القارئ. فهذه كانت فقط لايضاح وتقريب معنى مفهوم الكلاس. وليس شرح كامل للكلاس او طرق انشائها. واكرر اتمنى ان المعنى قد اتضح لديك عزيزي القارئ.
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !