mzdhr

Members
  • عدد منشوراتي

    3
  • تاريخ الإنضمام

  • تاريخ اخر زياره

السمعه بالموقع

0 Neutral

عن العضو mzdhr

  • الرتبه
    مبدع جديد
  • تاريخ الميلاد 02/02/90

معلومات عامة

  • الجنس
    ذكر
  • السكن
    المملكة العربية السعودية
  • هواياتي
    تعلم البرمجة,برمجة تطبيقات اندرويد عربية, جافا, بايثون, قرائه, كتابه, مشي, العاب قديمة, مسلسلات, افلام.
  1. السلام عليكم ورحمة الله وبركاتة هذه مقالة مبسطة لشرح مفهوم الـ 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 اخيراً اتمنى ان المعلومة وصلت بسهوله لك اختي \ اخي القارئ. فهذه كانت فقط لايضاح وتقريب معنى مفهوم الكلاس. وليس شرح كامل للكلاس او طرق انشائها. واكرر اتمنى ان المعنى قد اتضح لديك عزيزي القارئ.
  2. مقال رائع وشرح ممتاز, تتشكر عليه. دائماً كان التعامل مع التاريخ برمجياً اصعب من التعامل مع ورقة امتحان الرياضات بالنسبه لي 😄. فالحمد لله على هذه المكتبه الرائعه.
  3. السلام عليكم ورحمة الله وبركاتة هذه مقالة مبسطة لشرح مفهوم الـ 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 اخيراً اتمنى ان المعلومة وصلت بسهوله لك اختي \ اخي القارئ. فهذه كانت فقط لايضاح وتقريب معنى مفهوم الكلاس. وليس شرح كامل للكلاس او طرق انشائها. واكرر اتمنى ان المعنى قد اتضح لديك عزيزي القارئ.
  4. السلام عليكم ورحمة الله وبركاتة هذا المقال يسهل لك ايها القارئ ايضاح مفهوم الـ Abstraction (اي التجريد) بالبرمجه من خلال ربطه بالحياه الواقعيه. مناسب لكل من هو مبتدئ او اي شخص يواجه صعوبه في فهم هذا المفهوم. فأنا في فتره من الفترات كنت لا اعرف ماهو هذا مطلقاً, ومن خلال بحثي وقرائتي عنه تكونت لدي صوره واضحه عنه واحببت ان انقل هذه الصوره لك اختي | اخي القارئ. والذي يعتبر التجريد بدوره عامل كبير جداً في البرمجة. وايضاً يعتبر المكون الاساسي لمفهوم الـ Object-oriented programming - OOP. المعنى الحرفي العربي لكلمة Abstraction التجريد. اصل ومعنى كلمة Abstraction الاصل مأخود من الكلمة اللاتينية abs, والتي تأتي بمعنى away from (اي: بعيداً عن). مثال: لنفرض ان لديك مقلمه بها العديد من الاقلام وقمت بعمل abs للقلم ذي اللون البرتقالي, هنا نستطيع القول انك اخدت هذا القلم بعيداً عن المقلمه. وكصورة عامة نستطيع القول انك قمت بعمل عملية الـ abstraction للمقلمه. اي عندما تعمل لشئ abs من بين عدة اشياء, هو فقط ان تاخده بعيداً عن تلك الاشياء. الان كرر عملية الـ abstraction واستمر في عمل abs لكل الاقلام ذوي الالوان الغير اساسيه, حتى يتبقى لديك مقلمه تحتوي فقط على ٣ اقلام وهي الالوان الاساسية الاحمر والاصفر والازرق وهنا نستطيع القول انك اقتربت من انهاء عملية التجريد للمقلمه. اكمل التجريد وأتي بمقلمه اخرى وضع بها الالوان الذي استخرجتهم من الاولى. وهنا اصبحت لديك مقلمتين واحده للإلوان الاساسيه والاخرى للإلوان الغير اساسيه ونستطيع القول ان التجريد قد اكتمل للمقلمه. الفائدة من تجريد المقلمه حتى يسهل على الطفل استخدامها! فوجود اقلام كثيره يجعل الطفل في حيره من امره. ولكن بوجود فقط ٣ اقلام اساسيه يصبح الشئ اكثر سهوله في الاختيار والفهم والحفظ والترتيب الخ... واذا احتاج الطفل اي من الاقلام الغير اساسية فيستطيع الاستعانه بالمقلمه الاخرى. اذن نستطيع القول من مثال المقلمه ان فائدة الـ abstraction هي تبسيط الاشياء المعقده الى اشياء سهله, عن طريق ابعادها وفصل الاشياء الجانبيه بحيث في النهاية يتبقى لدينا الاساسيات فقط في الواجهه. الفائدة من خلال القيام بعملية الـ Abstraction خلال القيام بعملية التجريد لشئ ما, يكتسب الدماغ فهم اكثر واعمق لهذا الشئ. فمثلاً الطفل عندما يقوم بتجريد لعبه مكونه من مكعبات اللوجو (اي يعمل abs لكل قطعه في شكل النمر) يكتسب خلال هذه العملية معرفة اعمق للقطع المكونه لهذه اللعبه وكيفية اتحادها مع بعضها البعض لتكوين هذا الشكل. ليصبح لديه في النهاية درايه وقدره اكبر لتكوين نفس الشكل او القدره في الابداع لتكوين اشكال اخرى من مكعبات اللوجو. فعند الاتيان بقطع متناثره من اللوجو (المكعبات) لطفل لم يعمل تجريد لاي لعبة من قبل, نرى ان لديه صعوبه في تكوين الاشكال. بعكس الطفل الذي قام بالكثير من عمليات الـ abstraction لـ ألعاب اللوجو من قبل, فهو على درايه كبيره في كيفية عمل كل قطعة صغيره وطرق التحامها بالاخرى, وايضاً تتكون لديه درايه اكبر في فهم الصوره العامه (big picture). معنى الـ Abstraction في البرمجة للاسف يوجد الكثر من مفاهيم ومعاني التجريد, فهي كلمه فلسفيه بحته. وسترى معاني غريبه لها في بادئ الامر. ولكن الان لنركز على الهدف من هذا المقال وهو مفهوم وتطبيق التجريد في البرمجه. لفهم التعريف تخيل ان مشروعك هو مقلمة الطفل. وان اسطرك البرمجية هي الاقلام بتلك المقلمه. وتذكر كيف جعلنا الامر اسهل على الطفل من خلال التجريد الى مقلمات اخرى. وتذكر ماذا اكتسب الطفل الاخر من خلال قيامه بتجريد قطع اللوجو. مثال: مشروع به ٥٠ مليون سطر برمجي تخيل لو ان فريق من المبرمجين يعملون على مشروع مكون من class واحده فقط (تسمى God Class من اسوء الاخطاء في البرمجة) فكم سطر برمجي ستكون هذه الكلاس؟ لنفرض انها ٥٠ مليون سطر! كما هو الحال في الشفره المصدريه لـ ويندوز فيزتا الرائع جداً! في هذه الحاله يجب على كل مبرمج ان يفهم هذه الكلاس كامله حتى يتعامل معها ويبرمج داخلها! وهذا يخلق صعوبه عاليه بل مستحيله جداً فلا يوجد مبرمج يستطيع ان يحشر ٥٠ مليون سطر في دماغه. ماذا لو احدث احد المبرمجين (مبرمج يريد اضافة ميزة جماليه للاشعارات) تغيير في السطر رقم ٣٣٤٢٣٣٣؟ وسطر ٥٤٣٢٣٤٥٦ قد احدث خطئ وهنق الويندوز! من هو الخارق الذي سيقرئ او يعمل تحليل لـ ٥٠ مليون سطر ليحل المشكله؟ هل سيقوم هذا المبرمج بالتنطط بين الـ ٥٠ مليون سطر بمطرقته الـ Debug! الا توجد طريقه لعمل هذا المشروع حتى يصبح تطويره واصلاحه من قبل المبرمجين في الفريق اسهل بكثير؟ نعم وهو بتطبيق مبدء التجريد! الحل هو تطبيق الـ Abstraction الهدف المراد تحقيقه: هو معرفة القليل من الكود الاساسي في هذه الكلاس العملاقه حتى يسهل حفظه من قبل كل مبرمج في الفريق, ويخلق لديهم المزيد من الكفائه للتعامل مع الكود والاضافه والاصلاحات. لنجرد كبدايه بعض الاسطر بهذه الكلاس العملاقه: لنفرض ان هنالك في هذه الكلاس كود مكون من ١٠٠٠ سطر وظيفته هي اظهار اشعار للمستخدم, فلماذا على كل مبرمج ان يحفظ هذا الكود الكبير! اليس من الاسهل ان نقوم بتغليف هذا الكود داخل ميثود ونسميها بفعلها كـ showNotification ونطلب من كل مبرمج فقط ان يحفظ اسم هذه الميثود و ماذا تخرج (return) و ماذا تريد ان يدخل بها (parameters). ويقوم باستدعائها فقط عند الحاجه! اذاً بهذا العمل قد قمنا باخفاء التعقيدات (اخفاء كيفية عمل كود الاشعارات ذي الـ ١٠٠٠ سطر). فأنت عندما ترى مشغل موسيقى امامك كل ماتراه هو واجهه (interface) فقط. ولا ترى مابداخل هذا المسجل من قطع الكترونيه. وتعرف ان هذا المسجل يدخل فيه شريط كاسيت و يخرج صوت وذلك عن طريق الضغظ على زر التشغيل. فرؤيتك الى interface او تعاملك مع interface يسهل لك حياتك في استخدام الاشياء ولا داعي للتعقيد ومعرفة كيفية سير كل الامور بداخل هذه المسجل. تطبيق المزيد من الـ Abstraction على الكلاس العملاقه ذي الـ ٥٠ مليون سطر الان لنرجع الى الكلاس العملاقه مره اخرى. اليس من الافضل ان نغلف هذا الكود الى العديد من الميثودات (كما قمنا في تغليف كود الاشعارات سابقاً) ونقوم بحفظ فقط اسمائها و مداخلها و مخارجها. ايضاً اليس من الافضل ان نقسم هذه الكلاس الكبيره الى عدة كلاسات اخرى. ونجرد اسطرها البرمجيه الى ميثودات بالكلاسات الاخرى. وان نجعل كل كلاس جديده تحتوي فقط على الميثودات المتقاربه (كالطفل والمقلمات). توقف هنا وتمعن! (هنا في هذه النقطة صنعنا شئ اسمه API في البرمجه). واخيراً لنعطي كل مبرمج من الفريق كلاس خاص به, فارغ تماماً, ونجلب له الـ Documentation ليتعلم او ليبحث عن اسماء تلك الميثودات ويعرف مخرجاتها ومدخلاتها, ويستدعي مايحتاجه لكتابه واكمال كلاسه للقيام بدوره في الفريق وانجاز المشروع. كلاس مبرمج الاشعارات الان كيف ستكون؟ تخيل كلاس المبرمج الذي يعمل على تجميل الاشعارات, هو الان يحتاج فقط ان ينادي على ميثود الـ showNotification ويقوم بكتابة بعض الاسطر القليله التي تنشئ جماليات لإضافتها الى الاشعارات. والذي من المؤكد انه سوف يبدع في دوره كثيراً لان مجمل تركيزه في الاشعارات, وليس كما كان في البداية مشغول في حفظ و التنطط بين الـ ٥٠ مليون سطر برمجي ومحاولة اصلاح ماقد تسبب به من اخطاء. فنحن بعملنا هذا قمنا بتجريد الكلاس العملاقه هذه وانتزاع منها اسطر برمجيه بالملايين, وتغليفهم في كلاسات خاصة بهم داخل ميثودات باسماء افعالهم, وجعلنا فقط بها الاسطر الاساسية وكأنها اصبحت interface يسهل على المبرمج التعامل معها (كمشغل الموسيقى والمستخدم العادي له!!!). مطبقين مبدء التجريد الـ abstraction وبالاستعانه ايضاً بمبدء التغليف الـ encabsulating والذي يعتبر بدوره جزء كبير من تحقيق عملية التجريد في البرمجه. واخيراً قمنا بتحويل المشروع كلياً الى شئ يسمى API حتى يسهل على المبرمج ندائه واستخدامه وتطويره. نصائح لاتتعمق في التجريد, والا سوف تصنع مشروع معقد على نفسك. لفهم الاشياء التي تراها في صوره كامله, حاول تجريدها قطعه قطعه (عملية التجريد). كتجريد مكونات الـ API للاندرويد. لتركيب صوره كامله لشئ تريد تعلمه, حاول تركيبها قطعه قطعه (عملية التجريد). اي شئ صعب فهمه حاول تجريده, وفهم القطع الصغيره منه وكيفية التحامها مع الاخره. التجريد وجد للتسهيل, لذلك لاتتفاجأ عندما ترى مكتبه او مشروع او api يحتوي على مئات الكلاسات والميثودات. فقط خد نفس عميق وابدء بفهمه قطعه قطعه (جرده) او قم بنداء مايلزم لاتمام شغلك فقط. عند تصميم مشروع في البدايه قم بالتفكير في التجريد, انظر الى الصوره الكبيره كما يفعل الطفل ذي الخبره في اللوجو, قم بعمل اللازم من كلاسات وميثودات, وفي النهايه استخدمها كما تحب في الـ mainActivity.class كانك تركب تطبيقك بالاندرويد في هذه الكلاس, ليس كتابة جميع الاكواد بها وجعلها (God Glass) وهذا شئ خاطئ جداً. نقاط واسئله للتأمل في التجريد هل تستطيع الربط بين مفهوم الـ Abstraction و مفهوم كلاس الـ Abstract Class في مخيلتك! هل ترى الفلسفه في فكرة الربط بين واجهة المستخدم الرسوميه لتسهيل حياته, وواجهة المبرمج والتي هي ملف الـ interface لتسهيل عمله كمبرمج! هل تستطيع التنقل بسهوله بين طبقات التجريد؟ هل تستطيع عكس التجريد؟ هل مر عليك مصطلح: برمج الى انترفيس وليس الى كلاس؟ امثله برمجيه تجريد مشروع لتطبيق اندرويد الى كلاسات وبكجات كثيره: فبدلاً ان يكون البرمجه محشوره كلها في كلاس الـ mainActivity قمت بانشاء العديد من الكلاسات والبكجات لترتيب اسطري البرمجه. ثم ندائهم في الـ mainActivity لأصنع التطبيق. والان مثال للتجريد بالكود سأستخدم لغة البايثون فهي اسهل للفهم واقل كتابة من الجافا. وهذا فقط مثال للتوضيح وليس Abstraction محض. لدينا مبرمجان يعملون على انجاز برنامج, وظيفة هذا البرنامج هي: يطلب من المستخدم ادخال اسمه. ثم المبرمج الاول يقوم بكتابة كود يطبع حرف حرف للمستخدم مع مكان وجود الحرف في اسمه. اما المبرمج الثاني فيقوم باخد اسم المتسخدم وحساب عدد الحروف المكرره ثم يطبعها ايضاً حرف حرف مع عدد تكرارها. الكلاس قبل عمل الـ Abstraction لها: star = (chr(10029)) user_name = input("Enter your name:") user_name_total_char = 0 for i in range(len(user_name)): print(user_name[i] + " --> " + str(i + 1)) for i in range(len(user_name)): total = 0 for j in user_name: if j == user_name[i]: total += 1 print(user_name[i], "--->", total, "repeated") الكلاس بعد عمل الـ Abstraction لها اخرجنا جميع الاكواد الى كلاسات فرعيه. واصبحت الكلاس هكذا: initialize() ask_user_for_name() calculate_user_characters() calculate_user_characters_counts() print_user_chars() print_user_char_counts() ويستطيع اي مبرمج اخر استخدام هذه الميثودات كما يشاء اذا احتاجها في تطوير شئ جديد كميزه بالبرنامج (تذكر هذا فقط مثال بسيط لتسهيل فهم التجريد والذي هو كافي تماماً في اغلب الحالات). الـ Abstraction وتمثله في الطبيعه (خلق الرحمن) في النهاية انظر الى الصوره (نبتة الماء) وتمعن في جمال صنيع الخالق وعظمته في الخلق. انظر الى قوة التجريد الذي من خلاله يخلق نبته جميله جداً. تمعن في كل قطعة بالنبته (جردها بعينك, اي اعمل لها abs بخيالك) وكيفية التحامها وتركيبها Composite وتناسقها مع القطع الاخرى لتكون في النهايه نبتة الماء كالصوه النهائيه لعملية التجريد. انظر الى درجة اعمق من التجريد, فكر في طريقة غدائها, وغداء كل قطعه منها على حدى الخ... تأمل! هل توجد هناك مقارنه بين ابداع الخالق في عملية التجريد, وعفسة المبرمج في عملية التجريد عندما ترى مشروعه من الوهله الاولى! فسبحان الله على بديع خلقه.

عالم البرمجة

عالم البرمجة مقالات برمجة و دورات مجانية لإحتراف البرمجة هدفنا تبسيط البرمجة ونشرها بيد الكل بشكل ممتع ومتطور ومحدث بإستمرار لمواكبة جديد تطورات البرمجة الحديثة و المتقدمة بدون مقابل