יום שישי, 15 באוגוסט 2008

תכנות מונחה עצמים - מה הסיפור הגדול?

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

מה זה תכנות מונחה עצמים בעצם?
תכנות מונחה עצמים (Object-Oriented Programming - OOP) הוא צורת תכנות שנתמכת על ידי רוב שפות התכנות החדשות כיום.
הרעיון הוא לקחת מחלקה, ולשים בה את הפונקציות והמשתנים הייחודיים רק לה.
לדוגמה מחלקה בשם cat - חתול, יהיו בה למשל פונקציות של ללכת, לאכול, לשתות ולילל.. יהיו בה משתנים של גיל, צבע וכו'.
הגיוני, לא ככה?

שימוש בתכנות מונחה עצמים.
אני לא עומד לשים פה קודים, כיוון שזה בכמה שפות ובכל שפה יש דברים שונים וייחודיים לה.
אבל ברמה העקרונית, לכל מחלקה יש ליצור מופע.
מופע הוא משנה שמכיל את כל הפונקציות והמשתנים שיש במחלקה שהגדרנו, ניתן למשל להגדיר עצם(מופע של המחלקה - object) בשם MyCat ולהגדיר אותו כcat.
אני לא רוצה לגלוש יותר מדי לעניינים טכניים, כל אחד יכול לחפש לבד בשפה שהוא כותב בה את צורות התחביר, איך לגשת לפונקציות המחלקה וכו'.

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

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

רב צורתיות.
האמת שזה לא משהו שאני משתמש בו הרבה לצערי (בגלל שאני עוד משתמש בד"כ בPHP4 שלא ברור כמה הוא תומך בOOP, בכל מקרה אף פעם לא ראיתי קוד שעושה את זה)
רב צורתיות: העמסת פרמטרים, העמסת אופרטורים ודריסה.
העמסת פרמטרים זה קריאה לכמה פונקציות באותו שם, ההבדל היחיד הוא מספר הפרמטרים שיש לפונקציה.
המחלקה קוראת לפונקציה בהתאם למספר הפרמטרים שהוכנסו - זה די שימושי, השתמשתי בזה בעבר בC#.

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

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


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

להתראות בפוסט הבא, שבת שלום :)


אין תגובות: