פייתון בסביבה המדעית/חשיבה מונחית עצמים

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

בוגרי אוניברסיטה במדעים מדויקים ובהנדסה הורגלו לחשיבה "פרוצדורלית" או "פונקציונלית" בכל הנוגע לתכנות. האשמה המרכזית נופלת על השילוב ה"הרסני" של שתי תופעות:

  1. סטודנטים נדרשים ללמוד ולהבחן בקורס בשפת C, ללא אזכור הייחוד של C++ על פני שפת C.
  2. בהמשך הלימודים, מתרחש לרוב מעבר הדרגתי למטלאב, בו הסטודנטים מיישמים את התפישה הפרוצדורלית שלהם (למרות שמטלאב היא מונחית-עצמית באופן מלא).

בשנים האחרונות חלו מספר תמורות בסילבוסים באוניברסיטאות השונות, אך עד ששינוי זה יהיה רלוונטי לסביבה הקרובה של מעבדת מחקר (או כדומה) יקח עוד זמן.

המתכנת Niklaus Wirth מתאר בספרו Algorithms + Data Structures = Programs את ההבדל המהותי בין התכנות הסדרתי (כמו למשל בשפת C) לבין התכנות המונחה עצמים (כמו למשל C++, פייתון ועוד):

  • בתכנות שאינו מונחה עצמים, ה"שיטות" (פונקציות) מופרדות ממבני הנתונים במובן שהם "מאוחסנים" בנפרד: לדוגמה, תחילה קוראים נתונים מקובץ למשתנים, ולאחר מכן מעבירים את המשתנים לפונקציות.
  • בתכנות מונחה עצמים, הן השיטות והן מבני הנתונים מאוגדים יחד תחת קורת הגג של האוביקט. הדינמיקה בתוך האוביקט גם היא, כמובן, מורכבת מהעברת משתנים לפונקציות, אך כאן הפונקציות הן חלק מהאוביקט.

לדוגמה, נניח שלרשותנו מערך חד-ממדי בשם A. להלן פקודות למיון המערך, בשני המקרים:

תכנות שאינו מונחה עצמים תכנות מונחה עצמים
a = sort(a) או sort(&a) a.sort()

כעת נניח שיש לנו שלושה טיפוסי נתונים a,b,c כאשר a הוא מערך מספרי רגיל כנ"ל, b הוא רשימה של עצים בינאריים, ו-c הוא עוד מבנה מורכב כלשהו (מי יודע אם תצטרכו בעתיד להרחיב את התוכנה למבני נתונים חדשים?). בעוד ששיטת המיון של a היא טריוויאלית (סדר עולה), נניח ששיטת המיון של b כוללת חישוב מורכב כלשהו, שתוצאתו (התלויה בזמן) מכתיבה את אופן המיון. בדומה בנוגע ל-c. כעת נניח ש-data הוא רשימה המכילה את a,b,c וכו', אפילו אלף איברים, כל אחד מסוג שונה (מערך, עץ, ...) וברצונכם למיין את כולם:

תכנות שאינו מונחה עצמים תכנות מונחה עצמים
for i in length(data):
    if type(data[i])==array:
        data[i] = sort_array(data[i])
    elif type(data[i])==btree:
        data[i] = sort_tree(data[i])
    else:
        data[i] = special_sort(data[i])
for i in length(data):
    data[i].sort()

במקרה המונחה עצמים, הממשק (interface) לכל אוביקט הוא עקבי ומתבצע ע"י השגרה sort אשר מיושמת בתוך כל אוביקט בנפרד, בניגוד למקרה האחר, בו יש צורך לקרוא כל פעם לפונקציה אחרת.

לכל הדעות, השימושיות במקרה המונחה עצמים גבוהה יותר.

לקריאה נוספת[עריכה]

  1. Wirth, Niklaus, Algorithms + Data Structures = Programs, Prentice Hall, 1976, ISBN 978-0130224187.
  2. White G., Sivitanides M., Cognitive Differences Between Procedural Programming and Object Oriented Programming, 2005.

קישורים חיצוניים[עריכה]