تبسيط مفهوم الـ Abstraction في البرمجة

Mohammad Laifمنذ سنة

 

السلام عليكم ورحمة الله وبركاتة

هذا المقال يسهل لك ايها القارئ ايضاح مفهوم الـ Abstraction (اي التجريد) بالبرمجه من خلال ربطه بالحياه الواقعيه. مناسب لكل من هو مبتدئ او اي شخص يواجه صعوبه في فهم هذا المفهوم. فأنا في فتره من الفترات كنت لا اعرف ماهو هذا مطلقاً, ومن خلال بحثي وقرائتي عنه تكونت لدي صوره واضحه عنه واحببت ان انقل هذه الصوره لك اختي | اخي القارئ. والذي يعتبر التجريد بدوره عامل كبير جداً في البرمجة. وايضاً يعتبر المكون الاساسي لمفهوم الـ Object-oriented programming - OOP.

 

المعنى الحرفي العربي لكلمة Abstraction

التجريد.

اصل ومعنى كلمة Abstraction

abs01.thumb.jpg.2186a67acc1ecb8c1411d1df3da0bbc6.jpg

الاصل مأخود من الكلمة اللاتينية abs, والتي تأتي بمعنى away from (اي: بعيداً عن). مثال: لنفرض ان لديك مقلمه بها العديد من الاقلام وقمت بعمل abs للقلم ذي اللون البرتقالي, هنا نستطيع القول انك اخدت هذا القلم بعيداً عن المقلمه. وكصورة عامة نستطيع القول انك قمت بعمل عملية الـ abstraction للمقلمه.

اي عندما تعمل لشئ abs من بين عدة اشياء, هو فقط ان تاخده بعيداً عن تلك الاشياء. الان كرر عملية الـ abstraction واستمر في عمل abs لكل الاقلام ذوي الالوان الغير اساسيه, حتى يتبقى لديك مقلمه تحتوي فقط على ٣ اقلام وهي الالوان الاساسية الاحمر والاصفر والازرق وهنا نستطيع القول انك اقتربت من انهاء عملية التجريد للمقلمه. اكمل التجريد وأتي بمقلمه اخرى وضع بها الالوان الذي استخرجتهم من الاولى. وهنا اصبحت لديك مقلمتين واحده للإلوان الاساسيه والاخرى للإلوان الغير اساسيه ونستطيع القول ان التجريد قد اكتمل للمقلمه.

 

الفائدة من تجريد المقلمه

حتى يسهل على الطفل استخدامها! فوجود اقلام كثيره يجعل الطفل في حيره من امره. ولكن بوجود فقط ٣ اقلام اساسيه يصبح الشئ اكثر سهوله في الاختيار والفهم والحفظ والترتيب الخ... واذا احتاج الطفل اي من الاقلام الغير اساسية فيستطيع الاستعانه بالمقلمه الاخرى.

اذن نستطيع القول من مثال المقلمه ان فائدة الـ abstraction هي تبسيط الاشياء المعقده الى اشياء سهله, عن طريق ابعادها وفصل الاشياء الجانبيه بحيث في النهاية يتبقى لدينا الاساسيات فقط في الواجهه.

 

الفائدة من خلال القيام بعملية الـ Abstraction

abs02.jpg.56be16981b070e9fc789468359c8d8cd.jpg

خلال القيام بعملية التجريد لشئ ما, يكتسب الدماغ فهم اكثر واعمق لهذا الشئ. فمثلاً الطفل عندما يقوم بتجريد لعبه مكونه من مكعبات اللوجو (اي يعمل abs لكل قطعه في شكل النمر) يكتسب خلال هذه العملية معرفة اعمق للقطع المكونه لهذه اللعبه وكيفية اتحادها مع بعضها البعض لتكوين هذا الشكل. ليصبح لديه في النهاية درايه وقدره اكبر لتكوين نفس الشكل او القدره في الابداع لتكوين اشكال اخرى من مكعبات اللوجو.

abs03.jpg.76cf0ed68226dbacae2f154904bc30e4.jpg

فعند الاتيان بقطع متناثره من اللوجو (المكعبات) لطفل لم يعمل تجريد لاي لعبة من قبل, نرى ان لديه صعوبه في تكوين الاشكال. بعكس الطفل الذي قام بالكثير من عمليات الـ abstraction لـ ألعاب اللوجو من قبل, فهو على درايه كبيره في كيفية عمل كل قطعة صغيره وطرق التحامها بالاخرى, وايضاً تتكون لديه درايه اكبر في فهم الصوره العامه (big picture).

 

اقتباس

لذلك المبرمج عندما يقوم بقرائة او تفكيك المشاريع الاخرى وفهم مستويات التجريد بهم يكتسب خبره اعمق في البرمجة.

 

معنى الـ Abstraction في البرمجة

للاسف يوجد الكثر من مفاهيم ومعاني التجريد, فهي كلمه فلسفيه بحته. وسترى معاني غريبه لها في بادئ الامر. ولكن الان لنركز على الهدف من هذا المقال وهو مفهوم وتطبيق التجريد في البرمجه.

اقتباس

من خلال عملية التجريد, يقوم المبرمج بإخفاء جميع الاشياء الغير اساسيه قدر الامكان والتي تتمثل في التعقيدات, تاركاً فقط الاساسيات والتي تتمثل في التبسيط. كل هذا حتى يخفض نسبة التعقيد ويرفع الكفائيه في كتابة الكود.

لفهم التعريف تخيل ان مشروعك هو مقلمة الطفل. وان اسطرك البرمجية هي الاقلام بتلك المقلمه. وتذكر كيف جعلنا الامر اسهل على الطفل من خلال التجريد الى مقلمات اخرى. وتذكر ماذا اكتسب الطفل الاخر من خلال قيامه بتجريد قطع اللوجو.

 

مثال: مشروع به ٥٠ مليون سطر برمجي

تخيل لو ان فريق من المبرمجين يعملون على مشروع مكون من class واحده فقط (تسمى God Class من اسوء الاخطاء في البرمجة) فكم سطر برمجي ستكون هذه الكلاس؟ لنفرض انها ٥٠ مليون سطر! كما هو الحال في الشفره المصدريه لـ ويندوز فيزتا الرائع جداً! في هذه الحاله يجب على كل مبرمج ان يفهم هذه الكلاس كامله حتى يتعامل معها ويبرمج داخلها! وهذا يخلق صعوبه عاليه بل مستحيله جداً فلا يوجد مبرمج يستطيع ان يحشر ٥٠ مليون سطر في دماغه. ماذا لو احدث احد المبرمجين (مبرمج يريد اضافة ميزة جماليه للاشعارات) تغيير في السطر رقم ٣٣٤٢٣٣٣؟ وسطر ٥٤٣٢٣٤٥٦ قد احدث خطئ وهنق الويندوز! من هو الخارق الذي سيقرئ او يعمل تحليل لـ ٥٠ مليون سطر ليحل المشكله؟ هل سيقوم هذا المبرمج بالتنطط بين الـ ٥٠ مليون سطر بمطرقته الـ Debug! الا توجد طريقه لعمل هذا المشروع حتى يصبح تطويره واصلاحه من قبل المبرمجين في الفريق اسهل بكثير؟ نعم وهو بتطبيق مبدء التجريد!

 

الحل هو تطبيق الـ Abstraction

الهدف المراد تحقيقه: هو معرفة القليل من الكود الاساسي في هذه الكلاس العملاقه حتى يسهل حفظه من قبل كل مبرمج في الفريق, ويخلق لديهم المزيد من الكفائه للتعامل مع الكود والاضافه والاصلاحات.

لنجرد كبدايه بعض الاسطر بهذه الكلاس العملاقه: لنفرض ان هنالك في هذه الكلاس كود مكون من ١٠٠٠ سطر وظيفته هي اظهار اشعار للمستخدم, فلماذا على كل مبرمج ان يحفظ هذا الكود الكبير! اليس من الاسهل ان نقوم بتغليف هذا الكود داخل ميثود ونسميها بفعلها كـ showNotification ونطلب من كل مبرمج فقط ان يحفظ اسم هذه الميثود و ماذا تخرج (return) و ماذا تريد ان يدخل بها (parameters). ويقوم باستدعائها فقط عند الحاجه! اذاً بهذا العمل قد قمنا باخفاء التعقيدات (اخفاء كيفية عمل كود الاشعارات ذي الـ ١٠٠٠ سطر).

abs04.jpg.ab66fb630062acb2f4947d7bfde9c286.jpg

فأنت عندما ترى مشغل موسيقى امامك كل ماتراه هو واجهه (interface) فقط. ولا ترى مابداخل هذا المسجل من قطع الكترونيه. وتعرف ان هذا المسجل يدخل فيه شريط كاسيت و يخرج صوت وذلك عن طريق الضغظ على زر التشغيل. فرؤيتك الى interface او تعاملك مع interface يسهل لك حياتك في استخدام الاشياء ولا داعي للتعقيد ومعرفة كيفية سير كل الامور بداخل هذه المسجل.

 

تطبيق المزيد من الـ Abstraction على الكلاس العملاقه ذي الـ ٥٠ مليون سطر

الان لنرجع الى الكلاس العملاقه مره اخرى.

  • اليس من الافضل ان نغلف هذا الكود الى العديد من الميثودات (كما قمنا في تغليف كود الاشعارات سابقاً) ونقوم بحفظ فقط اسمائها و مداخلها و مخارجها.
  • ايضاً اليس من الافضل ان نقسم هذه الكلاس الكبيره الى عدة كلاسات اخرى. ونجرد اسطرها البرمجيه الى ميثودات بالكلاسات الاخرى.
  • وان نجعل كل كلاس جديده تحتوي فقط على الميثودات المتقاربه (كالطفل والمقلمات).
  • توقف هنا وتمعن! (هنا في هذه النقطة صنعنا شئ اسمه API في البرمجه).
  • واخيراً لنعطي كل مبرمج من الفريق كلاس خاص به, فارغ تماماً, ونجلب له الـ Documentation ليتعلم او ليبحث عن اسماء تلك الميثودات ويعرف مخرجاتها ومدخلاتها, ويستدعي مايحتاجه لكتابه واكمال كلاسه للقيام بدوره في الفريق وانجاز المشروع.

 

كلاس مبرمج الاشعارات الان كيف ستكون؟

تخيل كلاس المبرمج الذي يعمل على تجميل الاشعارات, هو الان يحتاج فقط ان ينادي على ميثود الـ showNotification ويقوم بكتابة بعض الاسطر القليله التي تنشئ جماليات لإضافتها الى الاشعارات. والذي من المؤكد انه سوف يبدع في دوره كثيراً لان مجمل تركيزه في الاشعارات, وليس كما كان في البداية مشغول في حفظ و التنطط بين الـ ٥٠ مليون سطر برمجي ومحاولة اصلاح ماقد تسبب به من اخطاء.

فنحن بعملنا هذا قمنا بتجريد الكلاس العملاقه هذه وانتزاع منها اسطر برمجيه بالملايين, وتغليفهم في كلاسات خاصة بهم داخل ميثودات باسماء افعالهم, وجعلنا فقط بها الاسطر الاساسية وكأنها اصبحت interface يسهل على المبرمج التعامل معها (كمشغل الموسيقى والمستخدم العادي له!!!). مطبقين مبدء التجريد الـ abstraction وبالاستعانه ايضاً بمبدء التغليف الـ encabsulating والذي يعتبر بدوره جزء كبير من تحقيق عملية التجريد في البرمجه. واخيراً قمنا بتحويل المشروع كلياً الى شئ يسمى API حتى يسهل على المبرمج ندائه واستخدامه وتطويره.

 

اقتباس

 

هل ترى العمل الجبار الذي قامت به الشركات العملاقه في تطبيق مبدء التجريد لإنشاء بيئه تسهل على المبرمج التعامل معها والتطوير فيها؟ كأمثال: .NET او الانرويد API والبرمجه به! او حتى الاوامر والميثودات الاساسية الموجوده في لغة الباثيون والتي تقرئ الـ Documentation التابع لها لمعرفة كيف استخدامها.

 

 

نصائح

  • لاتتعمق في التجريد, والا سوف تصنع مشروع معقد على نفسك.
  • لفهم الاشياء التي تراها في صوره كامله, حاول تجريدها قطعه قطعه (عملية التجريد). كتجريد مكونات الـ API للاندرويد.
  • لتركيب صوره كامله لشئ تريد تعلمه, حاول تركيبها قطعه قطعه (عملية التجريد).
  • اي شئ صعب فهمه حاول تجريده, وفهم القطع الصغيره منه وكيفية التحامها مع الاخره.
  • التجريد وجد للتسهيل, لذلك لاتتفاجأ عندما ترى مكتبه او مشروع او api يحتوي على مئات الكلاسات والميثودات. فقط خد نفس عميق وابدء بفهمه قطعه قطعه (جرده) او قم بنداء مايلزم لاتمام شغلك فقط.
  • عند تصميم مشروع في البدايه قم بالتفكير في التجريد, انظر الى الصوره الكبيره كما يفعل الطفل ذي الخبره في اللوجو, قم بعمل اللازم من كلاسات وميثودات, وفي النهايه استخدمها كما تحب في الـ mainActivity.class كانك تركب تطبيقك بالاندرويد في هذه الكلاس, ليس كتابة جميع الاكواد بها وجعلها (God Glass) وهذا شئ خاطئ جداً.

 

نقاط واسئله للتأمل في التجريد

  • هل تستطيع الربط بين مفهوم الـ Abstraction و مفهوم كلاس الـ Abstract Class في مخيلتك!
  • هل ترى الفلسفه في فكرة الربط بين واجهة المستخدم الرسوميه لتسهيل حياته, وواجهة المبرمج والتي هي ملف الـ interface لتسهيل عمله كمبرمج!
  • هل تستطيع التنقل بسهوله بين طبقات التجريد؟ هل تستطيع عكس التجريد؟
  • هل مر عليك مصطلح: برمج الى انترفيس وليس الى كلاس؟

 

اقتباس

بالتجريد سوف نتخلص من الكود المكرر.

اقتباس

بالتجريد نطبق مبدء التغليف Encabsulating.

اقتباس

بالتجريد نطبق مبدء التركيب Composite. تاركاً مبدء الوراثه Inheritance الى العقول القديمه.

اقتباس

بالتجريد نطبق مبدء تعدد الاشكال Polymorphism.

 

امثله برمجيه

تجريد مشروع لتطبيق اندرويد الى كلاسات وبكجات كثيره:

فبدلاً ان يكون البرمجه محشوره كلها في كلاس الـ mainActivity قمت بانشاء العديد من الكلاسات والبكجات لترتيب اسطري البرمجه. ثم ندائهم في الـ mainActivity لأصنع التطبيق.

abs05.png.d8069492823b4380353efcc3f0577be3.png

 

والان مثال للتجريد بالكود

سأستخدم لغة البايثون فهي اسهل للفهم واقل كتابة من الجافا. وهذا فقط مثال للتوضيح وليس 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 وتمثله في الطبيعه (خلق الرحمن)

abs06.thumb.jpg.27097516b300f83d18ebaa5a7cc69144.jpg

في النهاية انظر الى الصوره (نبتة الماء) وتمعن في جمال صنيع الخالق وعظمته في الخلق. انظر الى قوة التجريد الذي من خلاله يخلق نبته جميله جداً. تمعن في كل قطعة بالنبته (جردها بعينك, اي اعمل لها abs بخيالك) وكيفية التحامها وتركيبها Composite وتناسقها مع القطع الاخرى لتكون في النهايه نبتة الماء كالصوه النهائيه لعملية التجريد. انظر الى درجة اعمق من التجريد, فكر في طريقة غدائها, وغداء كل قطعه منها على حدى الخ... تأمل!

هل توجد هناك مقارنه بين ابداع الخالق في عملية التجريد, وعفسة المبرمج في عملية التجريد عندما ترى مشروعه من الوهله الاولى! فسبحان الله على بديع خلقه.

 

 

كلمات دليلية: abstract java
4
إعجاب
1599
مشاهدات
0
مشاركة
1
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !