python ماهو ماذا يعني التجريد في البرمجة؟



ماهو abstract (6)

إنني أتعلم الثعبان ولست متأكداً من فهم العبارة التالية: "الوظيفة (بما في ذلك اسمها) يمكن أن تستحوذ على المشكلة العقلية أو تجريدنا من المشكلة ".

إنه الجزء الغامق الذي لا أفهمه من حيث البرمجة. يأتي الاقتباس من http://www.openbookproject.net/thinkcs/python/english3e/functions.html

كيف تفكر مثل عالم الكمبيوتر ، 3 طبعة.

شكرا جزيلا !


التجريد: هو مفهوم مهم للغاية في كل من الأجهزة والبرامج.

الأهمية: نحن الإنسان لا يمكن أن نتذكر كل الأشياء في جميع الأوقات. على سبيل المثال ، إذا كان صديقك يتحدث 30 رقمًا عشوائيًا بسرعة ويطلب منك إضافتها جميعًا ، فلن يكون ذلك ممكنًا بالنسبة لك. السبب؟ قد لا تتمكن من وضع كل هذه الأرقام في الاعتبار. يمكنك كتابة هذه الأرقام على ورقة حتى إذا كنت ستضيف معظم الأرقام الصحيحة واحدة تلو الأخرى لتتجاهل الأرقام اليسرى في وقت واحد ، ثم تتجاهل معظم الأرقام الصحيحة في الوقت الذي تضيف فيه معظم الأرقام اليمنى.

إنه يوضح أنه في وقت واحد ، يمكننا أن نركز على الإنسان في مسألة معينة مع تجاهل تلك التي تم حلها بالفعل والتركيز على ما تبقى للحل.

إن تجاهل الشيء الأقل أهمية والتركيز الأكثر أهمية (في الوقت الحالي وفي سياق معين) يسمى التجريد

هنا هو كيفية عمل التجريد في البرمجة.

فيما يلي برنامج hello world الشهير في العالم بلغة C:

//C hello world example hello.c
#include <stdio.h>

int main()
{
  printf("Hello world\n");
  return 0;
}

هذا هو أبسط برنامج كمبيوتر عادةً ما يكتبه المبرمج. عند ترجمة هذا البرنامج وتشغيله في موجه الأوامر ، قد يظهر الإخراج بالشكل التالي:

وهنا الأسئلة الخطيرة

  1. الكمبيوتر يفهم فقط الكود الثنائي كيف تمكن من تشغيل لغتك الإنجليزية مثل الكود؟ يمكنك القول أنك قمت بترجمة الشفرة إلى برنامج ثنائي باستخدام برنامج التحويل البرمجي. هل كتبت مترجم لجعل برنامجك يعمل؟ رقم أنت لا تحتاج إلى. قمت بتثبيت مترجم GNU C على نظام Linux الخاص بك واستخدمته للتو من خلال إعطاء الأمر:

مجلس التعاون الخليجي -أو مرحبا hello.c

وقام بتحويل رمز اللغة الإنجليزية الخاص بك مثل لغة C إلى رمز ثنائي ويمكنك تشغيل هذا الرمز عن طريق إعطاء الأمر:

./مرحبا

لذلك ، لكتابة تطبيق في برنامج C ، لن تحتاج أبدًا إلى معرفة كيفية تحويل برنامج التحويل البرمجي لـ C إلى رمز لغة C إلى رمز ثنائي. لذلك كنت تستخدم مترجم الخليج باعتبارها التجريد.

  1. هل كتبت رمز للوظائف الرئيسية () و printf ()؟ كلا ، تم تحديد كلاهما بالفعل بواسطة شخص آخر بلغة C. عندما نقوم بتشغيل برنامج C ، فإنه يبحث عن وظيفة main () كنقطة انطلاق للبرنامج بينما تقوم وظيفة printf () بطباعة الإخراج على شاشة الكمبيوتر ويتم تعريفها بالفعل في stdio.h لذلك يتعين علينا تضمينه في البرنامج. إذا لم تكن كلتا الوظيفتين قد كُتبت بالفعل ، فعلينا أن نكتبهما بأنفسنا فقط لطباعة كلمتين ، وستكون أجهزة الكمبيوتر أكثر الآلات مملة على وجه الأرض. هنا مرة أخرى تستخدم التجريد أي أنك لست بحاجة إلى معرفة كيفية طباعة printf للنص على الشاشة وكل ما تحتاج إلى معرفته هو كيفية إدخال إدخال إلى وظيفة printf بحيث يظهر المخرجات المطلوبة.

لم أقم بتوسيع إجابة تجريد نظام التشغيل ، النواة ، البرامج الثابتة والأجهزة من أجل البساطة.

أشياء للذكرى:

أثناء القيام بالبرمجة ، يمكنك استخدام التجريد بعدة طرق لجعل البرنامج بسيطًا وسهلاً.

مثال 1: يمكنك استخدام قيمة ثابتة إلى مجردة من PI 3.14159 في البرنامج لأن من السهل تذكر PI من 3.14159 لبقية البرنامج

مثال 2: يمكنك كتابة دالة تُرجع مربعًا لرقم معين ومن ثم يمكن لأي شخص ، بما في ذلك ، استخدام هذه الوظيفة عن طريق إعطائها مدخلات كمعلمات والحصول على قيمة إرجاع منها.

مثال 3: في البرمجة الموجهة للكائنات (OOP) ، مثل Java ، يمكنك تعريف كائن يحتوي على بيانات وطرق ويمكنك استخدام هذا الكائن عن طريق استدعاء أساليبه.

مثال 4: توفر لك العديد من التطبيقات واجهة برمجة التطبيقات التي تستخدمها للتفاعل مع هذا التطبيق. عند استخدام أساليب واجهة برمجة التطبيقات ، لن تحتاج أبدًا إلى معرفة كيفية تنفيذها. لذلك التجريد هو هناك.

من خلال جميع الأمثلة ، يمكنك أن تدرك أهمية التجريد وكيف يتم تنفيذه في البرمجة. أحد الأشياء الرئيسية التي يجب تذكرها هي أن التجريد هو سياق ، أي أنه يستمر في التغيير حسب السياق


طريقة رائعة لفهم التجريد هي من خلال فصول مجردة.

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

ومع ذلك ، كل هذه الغرف ، وبالتالي فهي تشترك في عدة خصائص (# من الأبواب / النوافذ ، قدم مربع ، وما إلى ذلك) ولكن ، لا يمكن أن توجد غرفة من تلقاء نفسها ... ستكون دائمًا نوع من الغرف.

من المنطقي عندئذٍ إنشاء فصل دراسي مجردة يسمى Room ، والذي سيحتوي على الخصائص التي تشترك فيها جميع الغرف ، ومن ثم الحصول على فصول Kitchen ، و Living Room ، إلخ ، وراثة Room abstract class.

مفهوم الغرفة مجرّد ولا يوجد إلا في رؤوسنا ، لأن أي غرفة موجودة بالفعل ليست مجرد غرفة ؛ إنها غرفة نوم أو غرفة معيشة أو فصل دراسي.

نريد أن يمثل قانوننا "الاختلاس العقلي" الخاص بنا. يجعل كل شيء أكثر إتقانًا وأسهل في التعامل معه.


أفضل طريقة لوصف شيء ما هي استخدام الأمثلة:

الوظيفة ليست أكثر من سلسلة من الأوامر لإنجاز الأشياء. في الأساس ، يمكنك تنظيم جزء من الكود يقوم بشيء واحد. يمكن إعادة استخدام هذا الشيء الوحيد مرارًا وتكرارًا من خلال البرنامج.

الآن بعد أن تقوم وظيفتك بهذا الشيء ، يجب عليك تسميته بحيث يمكن التعرف عليه على الفور فيما يتعلق بما يفعله. بمجرد أن تقوم بتسميته ، يمكنك إعادة استخدامه في كل مكان من خلال استدعاء الاسم.

def bark():
  print "woof!"

ثم لاستخدام هذه الوظيفة ، يمكنك فقط القيام بشيء مثل:

bark();

ماذا يحدث إذا أردنا أن ينبح هذا 4 مرات؟ حسنًا ، يمكنك كتابة اللحاء () ؛ 4 مرات.

bark();
bark();
bark();
bark();

أو يمكنك تعديل وظيفتك لقبول نوع من المدخلات ، لتغيير كيفية عملها.

def bark(times):
    i=0
    while i < times:
        i = i + 1
        print "woof"

ثم يمكن أن نسميها مرة واحدة فقط:

bark(4);

عندما نبدأ الحديث عن تجريد البرمجة الكائنية (OOP) ، يعني شيء مختلف. سوف تكتشف هذا الجزء لاحقًا :)


دعنا نفترض أنك تكتب وظيفة تتلقى مجموعة من النص كمعلمة ، ثم تقرأ بيانات الاعتماد في ملف التكوين ، ثم تتصل بخادم SMTP باستخدام بيانات الاعتماد هذه وترسل بريدًا باستخدام هذا النص.

يجب تسمية الوظيفة sendMail (نص) ، وليس parseTextReadCredentialsInFileConnectToSmtpThenSend (text) لأنه من السهل تمثيل ما تقوم به بهذه الطريقة ، لنفسك وعند تقديم API إلى زملاء العمل أو المستخدمين ... على الرغم من أن الاسم الثاني أكثر دقة ، الأول هو تجريد أفضل.


التجريد هو مفهوم أساسي في كل علوم الكمبيوتر. بدون التجريد ، سنظل نبرمج برمز الجهاز أو ما هو أسوأ من عدم وجود أجهزة كمبيوتر في المقام الأول. لذلك IMHO هذا سؤال جيد حقا.

ما هو التجريد

إن استخلاص شيء ما يعني إعطاء أسماء للأشياء ، بحيث يلتقط الاسم جوهر ما تقوم به وظيفة أو برنامج بأكمله.

ويرد مثال واحد في الكتاب الذي تشير إليه ، حيث يقول

لنفترض أننا نعمل مع السلاحف ، والعملية المشتركة التي نحتاج إليها هي رسم المربعات. "ارسم مربعًا" عبارة عن تجريد أو جزء عقلي لعدد من الخطوات الأصغر. لذلك دعونا نكتب وظيفة لالتقاط نمط "العنصر الأساسي" هذا:

ننسى السلاحف للحظة وفكر فقط في رسم مربع. إذا قلت لك أن ترسم مربعًا (على الورق) ، فأنت تعلم فورًا ما يجب القيام به:

  • ارسم مربع => ارسم مستطيلًا مع كل جوانب الطول نفسه.

يمكنك القيام بذلك دون المزيد من الأسئلة لأنك تعرف ماهية المربع ، بدون أن أخبركم خطوة بخطوة. هنا ، مربع الكلمة هو تجريد من "رسم مستطيل مع كل جوانب من نفس الطول".

تجريدات عميقة

لكن مهلا ، كيف يمكنك أن تعرف ما هو المستطيل ؟ حسنًا ، هذا تجريد آخر لما يلي:

  • rectangle => ارسم خطين متوازيين مع بعضهما البعض ، بنفس الطول ، ثم قم بإضافة خطين متوازيين آخرين عموديًا على الخطين الآخرين ، مرة أخرى من نفس الطول ولكن ربما بطول مختلف عن الأولين.

بطبيعة الحال يمضي الأمر على الإنترنت - خطوط متوازية ، متعامدة ، متصلة جميعها تجسيد لمفاهيم معروفة.

الآن ، تخيل في كل مرة تريد فيها رسم مستطيل أو مربع ، عليك إعطاء التعريف الكامل للمستطيل ، أو شرح الخطوط ، الخطوط المتوازية ، الخطوط العمودية وخطوط التوصيل - سيستغرق الأمر وقتًا طويلاً جدًا.

القوة الحقيقية للتجريد

هذه هي أول قوة تجريدية: فهي تجعل الحديث وإنجاز الأمور أسهل بكثير.

تأتي القوة الثانية من التجريدات من خاصية قابلية التركيب الجيدة : بمجرد تحديد التجريدات ، يمكنك تكوين تجريدين أو أكثر لتشكيل تجريد جديد أكبر: قل أنك تعبت من مربعات الرسم ، ولكنك تريد حقًا رسم منزل . لنفترض أننا حددنا المثلث بالفعل ، لذلك يمكننا تحديد:

  • house => ارسم مربعًا به مثلث فوقه

بعد ذلك ، تريد قرية:

  • قرية => ارسم عدة منازل بجانب بعضها البعض

أوه انتظر ، نريد مدينة - ولدينا شارع مفهوم جديد:

  • المدينة => ارسم العديد من القرى القريبة من بعضها البعض ، املأ المساحات الفارغة بمزيد من المنازل ، ولكن اترك مساحة للشوارع
  • الشارع => (بعض تعريف الشارع)

وما إلى ذلك وهلم جرا...

كيف ينطبق هذا كله على البرمجة؟

إذا كنت تخطط للتخطيط لبرنامجك (عملية تُعرف بالتحليل والتصميم ) ، فهناك مجاميع جيدة للمشكلة التي تحاول حلها ، وتصبح برامجك أقصر ، وبالتالي أسهل في الكتابة ، وربما أسهل في قراءتها. طريقة القيام بذلك هي محاولة فهم المفاهيم الرئيسية التي تحدد مشاكلك - كما في المثال (المبسط) لرسم المنزل ، كانت هذه المربعات والمثلثات ، لرسم قرية كانت عبارة عن منازل .

في البرمجة ، نقوم بتعريف التجريدات كوظائف (وبعض التركيبات الأخرى مثل الفئات والوحدات النمطية ، ولكن دعونا نركز على الوظائف في الوقت الحالي). تقوم الوظيفة بتسمية مجموعة من العبارات الفردية بشكل أساسي ، لذا فإن الوظيفة هي في الأساس مجرد تجريد - راجع الأمثلة في كتابك للحصول على التفاصيل.

جمال كل شيء

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

مثال :

تخيل أن هناك مكتبة رسومات تسمى "nicepic" تحتوي على وظائف محددة مسبقًا لجميع التجريدات التي تمت مناقشتها أعلاه: المستطيلات ، المربعات ، المثلثات ، المنزل ، القرية.

لنفترض أنك تريد إنشاء برنامج على أساس التجريدات السابقة التي ترسم صورة جميلة للمنزل ، كل ما عليك أن تكتبه هو هذا:

import nicepic
draw_house()

هذا مجرد سطرين من التعليمات البرمجية للحصول على شيء أكثر تفصيلا. أليس هذا رائعا؟

أتمنى أن يساعدك هذا.


كما هو محدد في ويكيبيديا: Abstraction_ (computer_science)

يحاول التجريد البحث عن تفاصيل من نمط شائع بحيث يمكن للمبرمجين العمل بالقرب من مستوى الفكر الإنساني ، مع ترك التفاصيل المهمة في الممارسة ، لكن ليسوا ملزمين بالمشكلة التي يجري حلها.

في الأساس هو إزالة تفاصيل المشكلة. على سبيل المثال ، يتطلب رسم مربع عدة خطوات ، لكنني أريد فقط دالة ترسم مربعًا.





terminology