Menu
Coddy logo textTech

מה זה אבסטרקציה (Abstraction) בתכנות?

בתכנות, אבסטרקציה (abstraction, הפשטה) היא הסתרת הפרטים של האופן שבו משהו עובד מאחורי ממשק פשוט יותר, כך שאפשר להשתמש בו כשיודעים רק מה הוא עושה. קריאה ל-sorted(names) ממיינת רשימה בלי שתצטרכו לכתוב, או אפילו לראות, את אלגוריתם המיון.

מאת Kevin Spektor, מייסד שותף ו-CTO

עודכן ב-24 בספטמבר 2026

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

רמות של אבסטרקציה

רמהעם מה עובדיםמה היא מסתירה
התוכנית שלכםprint("hi"), sorted(names)איך הספרייה עושה את העבודה
Python והספרייה הסטנדרטית שלהמחרוזות, רשימות, קבציםניהול זיכרון, קריאות מערכת
ה-interpreter (CPython)Bytecodeקוד ה-C וקוד המכונה שמריצים אותו
מערכת ההפעלהקבצים, תהליכיםבלוקים בדיסק, דרייברים של התקנים, תזמון המעבד
חומרההוראות מכונהטרנזיסטורים ואותות חשמליים

כל רמה בנויה מזו שמתחתיה, ואפשר להבין אותה בלעדיה. אפשר לכתוב Python שעובד בלי לדעת מה זה בלוק בדיסק, ומערכת ההפעלה יכולה לשמור קובץ בלי לדעת שיש בו קוד Python.

איך אבסטרקציה עובדת בקוד

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

אבסטרקציה פרוצדורלית היא פונקציה. השם, הפרמטרים וערך ההחזרה שלה הם הממשק; הגוף הוא הפרט המוסתר. ברגע ש-average(scores) קיימת, שאר התוכנית משתמשת בה בלי לקרוא איך היא מחברת ומחלקת.

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

serving soup
serving pasta
serving cake

הקוד שלמטה לא יודע כלום על deque. אם מחליפים אותו ברשימה רגילה וב-pop(0), הפלט זהה, רק איטי יותר בתורים ארוכים, כי הסרת הפריט הראשון מרשימה מזיזה את כל שאר הפריטים. הממשק נשאר אותו דבר, ולכן שום דבר מחוץ למחלקה לא היה צריך להשתנות.

מחלקות אבסטרקטיות וממשקים

בתכנות מונחה עצמים, אבסטרקציה בדרך כלל פירושה לקבוע מה משפחה של מחלקות חייבת לעשות, ולהשאיר את האיך לכל מחלקה. ב-Python, המודול abc מסמן מתודה כאבסטרקטית; אי אפשר ליצור מופע של מחלקה שיש בה מתודה אבסטרקטית שלא מומשה:

email to ana@example.com: Your package arrives today
sms to +15550100: Your package arrives today
Notifier is abstract: create an Email or an SMS instead

remind() תלויה רק באבסטרקציה: כל דבר שיש לו מתודה send. כדי להוסיף התראות פוש כותבים מחלקה חדשה אחת, ו-remind() לא משתנה. הצעד האחרון הזה, קריאה אחת שמריצה קוד שונה למחלקות שונות, הוא פולימורפיזם: האבסטרקציה מגדירה את הממשק המשותף, והפולימורפיזם גורם לו לעבוד.

ב-Java יש את אותם כלים כמילות מפתח:

interface Notifier {
    void send(String to, String text);
}

class Email implements Notifier {
    public void send(String to, String text) { /* talk to the mail server */ }
}

כתיבת new Notifier() היא שגיאת קומפילציה, כי לממשק אין מימוש להריץ. התיעוד מסביר בפירוט על מחלקות אבסטרקטיות ועל ממשקים ב-Java.

אבסטרקציה מול כימוס (Encapsulation)

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

אבסטרקציהכימוס
השאלה שהיא עונה עליהמה זה עושה?מי רשאי לגעת בנתונים?
במה היא מתמקדתהממשק: הפעולות שמוצעותהפנים: הנתונים שמאחורי הממשק
כלים עיקרייםפונקציות, מחלקות אבסטרקטיות, ממשקים, מודוליםprivate, _name, properties, #fields
דוגמהNotifier.send() עובדת גם לאימייל וגם ל-SMS_balance משתנה רק דרך withdraw()
רמהתכנוןמימוש

האבסטרקציה מחליטה אילו פעולות להציג; הכימוס מוודא שכל השאר נשאר מוסתר. ה-Queue שלמעלה עושה את שניהם: add ו-next הם האבסטרקציה, והקו התחתון ב-_items הוא הכימוס.

אבסטרקציות דולפות וטעויות נוספות

ג'ואל ספולסקי (Joel Spolsky) ניסח ב-2002 את חוק האבסטרקציות הדולפות (leaky abstractions): כל אבסטרקציה שאינה טריוויאלית מעבירה חלק מהפרטים המוסתרים. מספרי נקודה צפה הם הדליפה הקלאסית. הם נראים כמו מספרים עשרוניים רגילים, עד שהאחסון הבינארי שמתחת מציץ החוצה:

0.30000000000000004
False

אי אפשר לשמור בדיוק לא את 0.1 ולא את 0.2 בביטים בינאריים, ולכן הסכום יוצא קצת לא מדויק. אפשר להשתמש ב-floats במשך שנים בלי לחשוב על זה, אבל לא לנצח, ולכן כדאי להכיר שכבה אחת מתחת לזו שבה אתם עובדים.

עוד שתי טעויות נפוצות:

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

לאן ממשיכים מכאן

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

שאלות נפוצות

מה דוגמה לאבסטרקציה?
פונקציה היא הדוגמה הפשוטה ביותר: קוראים ל-len(items) ויודעים מה היא מחזירה, לא איך Python סופרת. הדוושות של מכונית הן הגרסה היומיומית: שולטים במהירות בלי לדעת איך המנוע שורף דלק. בקוד מונחה עצמים, ממשק כמו Notifier עם מתודה אחת בשם send הוא אבסטרקציה מעל אימייל, SMS והתראות פוש.
מה זו אבסטרקציה ב-Python?
כל פונקציה, מחלקה ומודול ב-Python הם אבסטרקציה מעל הקוד שבתוכם. לגרסה פורמלית, המודול הסטנדרטי abc מאפשר להגדיר מחלקת בסיס אבסטרקטית עם @abstractmethod; אז Python מסרבת ליצור אובייקטים של המחלקה הזו, או של כל תת מחלקה שלא מימשה את כל המתודות האבסטרקטיות.
מה זו אבסטרקציה בתכנות ב-Java?
Java מבטאת אבסטרקציה בעזרת מחלקות אבסטרקטיות וממשקים. מחלקה אבסטרקטית יכולה להכיל מתודות אבסטרקטיות, שאין להן גוף ותת המחלקות חייבות לממש אותן, ואי אפשר ליצור ממנה מופע עם new. ממשק מפרט מתודות שכל מחלקה שמממשת אותו חייבת לספק, ומחלקה יכולה לממש כמה ממשקים.
מהם ארבעת עקרונות היסוד של OOP?
כימוס (encapsulation), אבסטרקציה, הורשה ופולימורפיזם. כימוס מגן על הנתונים של אובייקט, אבסטרקציה חושפת רק את מה שהאובייקט עושה, הורשה מאפשרת למחלקה להשתמש מחדש בקוד של מחלקה אחרת, ופולימורפיזם מאפשר לאותו קטע קוד לעבוד עם טיפוסים רבים דרך ממשק משותף.
האם אבסטרקציה יכולה להפוך קוד לגרוע יותר?
כן, כשהיא מגיעה מוקדם מדי או מסתירה את הדבר הלא נכון. קוד שנבנה למקרים שאף פעם לא מגיעים מוסיף שכבות שצריך לקרוא ולשנות בלי שום תועלת. כלל אצבע נפוץ הוא לחכות עד שכתבתם קוד דומה פעמיים או שלוש, כדי שהצורה המשותפת תהיה ברורה לפני שנותנים לה שם.
איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל