למה לחשוב במונחים של עצמים?
למה קוד פרוצדורלי לבדו לא מספיק?
כאשר תוכנה גדלה, קשה מאוד לעקוב מי שינה נתון מסוים, מי אחראי לשגיאה, ומה הקשר בין חלקי הקוד השונים.
קוד פרוצדורלי:
- מפזר את הנתונים בין פעולות רבות
- מקשה על תחזוקה ושינויים
- גורם לתלות חזקה בין חלקי קוד רחוקים
חשיבה אנושית = חשיבה בעצמים
בני אדם חושבים באופן טבעי במונחים של עצמים:
בית, תלמיד, משחק, קבוצה, מכונית.
כאשר אנו מתרגמים בעיה לתוכנה:
- נזהה את העצמים
- נאפיין כל עצם לפי תכונות ופעולות
- נבנה קוד שמשקף את העולם האמיתי
דוגמה מהחיים
graph TD
A[בעיה] --> B[זיהוי עצמים]
B --> C[הגדרת תכונות]
B --> D[הגדרת פעולות]
למשל:
- משחק כדורגל ⟵ שחקן, קבוצה, כדור
- סידור חדר ⟵ חפצים, מיקום, פעולות הזזה
מהו עצם?
הגדרת עצם:
עצם הוא ישות בעלת:
- תכונות (State) – המצב הנוכחי
- פעולות (Behavior) – מה ניתן לעשות
- זהות (Identity) – מי הוא, גם אם תכונות משתנות
תכונות ופעולות
| מרכיב | משמעות |
|---|---|
| תכונות | ערכים שמייצגים מצב |
| פעולות | פעולות שניתן להפעיל |
למה זה חשוב?
- קוד קריא וברור
- תחזוקה קלה
- בסיס לירושה ופולימורפיזם בהמשך
דוגמאות מעולם התכנות
גם טיפוסים מוכנים ב־C# הם עצמים:
String
- תכונה:
Length- פעולות:
()ToUpper(), ContainsDateTime
- תכונות:
Day,Month- פעולות:
()AddDaysRandom
- פעולות:
()Next,()NextDouble
עקרונות יסוד: הפשטה וכימוס
הפשטה (Abstraction)
הפשטה מאפשרת להתמקד במה שחשוב בהקשר הנוכחי, ולהתעלם מפרטים שאינם רלוונטיים.
דוגמה:
- נהג רואה: הגה, דוושות, הילוכים
- מהנדס רואה: מנוע, בוכנות, שסתומים
כימוס (Encapsulation)
כימוס = הסתרת פרטי המימוש.
המשתמש:
- יודע מה לעשות
- לא צריך לדעת איך זה עובד
הפשטה + כימוס יחד
graph LR
A[משתמש] -->|ממשק| B[אובייקט]
B --> C[מימוש פנימי]
שינוי המימוש הפנימי לא מחייב שינוי בקוד המשתמש.
הפשטה לעומת כימוס Abstraction vs. Encapsulation
הפשטה לעומת כימוס
הפשטה (Abstraction) – על מה מדברים?
הפשטה עוסקת ב:
- בחירת מה חשוב להציג
- והתעלמות ממה שלא רלוונטי להקשר
זהו עיקרון מחשבתי / תכנוני.
❝ מייצגים אובייקט או פעולה דרך המאפיינים והפעולות המהותיים בלבד ❞
דוגמה רעיונית
כשאני מתאר “תור”:
- חשוב לי:
Insert,Remove,IsEmpty - לא חשוב לי: האם הוא ממומש עם מערך או רשימה
זה הפשטה: התמקדות במושג, לא במימוש.
הכמסה (Encapsulation) – על מה לא מדברים?
הכמסה עוסקת ב:
- הסתרת פרטי מימוש
- שליטה בגישה לנתונים
זהו עיקרון מבני / תחבירי.
❝ הנתונים והקוד שעובד עליהם עטופים ביחידה אחת, עם גישה מבוקרת ❞
דוגמה קלאסית
class Counter
{
private int value;
public void Increment()
{
value++;
}
}
כאן:
valueמוסתר (private)- הגישה אליו מבוקרת
זו הכמסה, לא הפשטה.
השוואה
| היבט | הפשטה | הכמסה |
|---|---|---|
| שאלה מרכזית | מה חשוב? | מה מוסתר? |
| רמה | תכנונית / רעיונית | תחבירית / מבנית |
| מטרה | פישוט והכללה | הגנה ושליטה |
| כלי עיקרי | ממשק, מחלקה אבסטרקטית | private, public |
| תלות בשפה | רעיון כללי | תלוי שפה |
משפט זיכרון
- הפשטה: על מה מדברים
- הכמסה: מה לא רואים
טיפוס לעומת עצם
מהו טיפוס (Class)?
טיפוס מגדיר מבנה משותף לעצמים:
- אילו תכונות יש
- אילו פעולות מותרות
הטיפוס הוא תכנית בנייה (Blueprint).
מהו עצם (Object)?
עצם הוא מופע ספציפי של טיפוס.
| טיפוס | עצמים |
|---|---|
| Student | תלמיד א’, תלמיד ב’, תלמיד ג’ |
| Computer | מחשב ביתי, מחשב מעבדה, מחשב נייד, מחשב בחדר מורים |
המחשה
graph TD
A[Class] --> B[Object 1]
A --> C[Object 2]