עוברים לאובייקטים
תשובה טובה לשאלה שלך תהיה - "תתחיל ללמוד". יש המון ספרים טובים ומשאבים ברשת בנושא. (בתקווה נבנה כאן בפורום מאגר קישורים טוב בנושא). אז תאלץ להסתפק בתשובה "על קצה המזלג": אני לא יודע למה אתה מתכוון ב"עצם" שיש באפיון אבל ההגדרה הכללית של אובייקט היא רכיב שמגלם התנהגות מסויימת או באופן כללי מאוד - "יודע לעשות דברים". זה שונה מאוד מההגדרה של ישות במובן הרלציוני שהיא - "מכילה מידע מסויים". והכי טוב להבין את העניין הזה על ידי הסתכלות על קוד:
public class BankAccount { long _balance; public long getBalance() { return _balance; } public void setBalance(long newBalance) { _balance = newBalance; } } public class Test { public static void withdraw(BankAccount account, long ammount) { account.setBalance(account.getBalance() - ammount); } }
הגישה הפרוצדוראלית מתעסק ביחידות המכילות מידע ופונקציות המבצעות עבודה על המידע. בגישה ה Object Oriented אין חלוקה כזו אלא יש רק רכיב שיודע לבצע פעולות. קיום המידע בתוך הרכיב איננו ידוע למשתמשים בו ולכן קל מאוד לשנות את מבנהו בלי להשפיע כלל על שאר המערכת.
public class BankAccount { long _balance; public void withdraw(long ammount) { _balance = _balance - ammount; } } public class Test { public static void withdraw(BankAccount account, long ammount) { account.withdraw(ammount); } }
עכשיו אין לי בעיה לשנות את BankAccount כך שפעולת ה withdraw תקרא ל WebService של בנק מסויים במקום לעדכן ערך, והשינוי לא ישפיע על המערכת בגלל שלא חשפתי את מבנה הנתונים של האובייקט. (מה שיהיה הרבה יותר מסורבל ולעיתים בלתי אפשרי לעשות במודל הפרוצדוראלי). עוד לא נגעתי בהורשה אבל ברגע שאתה מתרגל לרעיון ה"רכיב שמבצע התנהגות" במקום "רכיב שמכיל מידע" אתה מהר מאוד מגיע לצורך לבצע התנהגות בצורה דומה אך לא זהה במקומות שונים. את זה אפשר לבצע בשתי דרכים: 1. להגדיר את האובייקט באופן יותר אבסטרקטי (להשתמש ב interface) וליישם אותו בעזרת מספר מחלקות שונות. 2. לדאוג שהאובייקט יתפקד אחרת בהתאם למידע שברשותו (למשל שאם ה balance קטן מ-0 לשלוח הודעת אזהרה...).