עבור לתוכן

הורשה היא הפרה בוטה של עקרונות תכנות-מונחה-עצמים

Featured Replies

פורסם

פשטני, חובבני ומתנשא מידי. :)

פורסם

שטויות במיץ מה שכתוב שם.

יש לו שם כמה טענות נכונות אבל משם ועד לא להשתמש בירושה??

אנקפסולציה זה מצויין, זה לא אומר שמחלקה אחת ונגזרתה לא יכולים להיות קופסה שחורה אחת.

פורסם

באמת חובבני ובעיקר פשטני.

לדוגמא המאמר מביא ציטטה של הספר של GoF ושם נאמר שצריך לתת קדימות לקומפוזיציה על הורשה - זה הכללה גסה. כמובן שיש מקומות שכל אחת מהטכניקות עדיפה על השניה. מה שהורשה נותנת היא גישה פשוטה (ולרוב אוטומטית) לקוד משותף המבטא התנהגות משותפת של משפחת המחלקות. זהו היישום הנכון ביותר של קשר "סוג של" (מה שנקרא בשפה מקצועית "is kind of") כמו שלמשל אדמיניסטרטור הוא סוג של משתמש רשום בפורום. הגיוני שכל הפעולות שמשותפות לאדמיניסטרטור ולמשתמש רגיל יוגדרו תחת משתמש רגיל ואדמיניסטרטור רק מתאר את הפעולות המיוחדות המותרת למשתמש מהסוג הזה. זה לא יהיה נכון אם פעולה של משתמש רגיל תגיע קודם כל למחלקה של אדמיניסטרטור ושם יחליטו להעביר אותה לביצוע ע"י מחלקת משתמש רגיל.

ללא הורשה, כל מחלקה צריכה באופן מפורש (קרי בשורת קוד) לקרוא למתודה המבצעת את ההתנהגות המשותפת. זהו יישום אשר נכון לקשר "מכיל את" ("composed of") כמו שלמשל משתמש בפורום מכיל הגדרות פרופיל. פרופיל לא "חי" בזכות עצמו אלא כחלק מהישות שנקראית משתמש בפורום. זה יהיה נכון אם פעולות שקשורות לפרופיל יגיעו קודם כל למחלקת משתמש ומשם יתבצע ניתוב של ההודעה למחלקת פרופיל.

בקיצור השימוש בהורשה - כמו כל טכניקה אחרת (כמו הכמסה) - צריך להיות מושכל ותוך ידיעה של היכולות והמגבלות של הטכניקה.

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

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

פורסם
  • מחבר

טוב, אני רואה שיש לא מעט ביקורת על הפוסט :)

הפוסט היה מתריס בכוונה.

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

אם משקיעים גם כך הרבה באיכות הקוד (Inspection/review) - המנעות מהורשה היא השקעה קטנה יחסית שתתרום ליציבות המערכת.

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

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

ליאור

פורסם

בסופו של דבר המטרה היא שהקוד יהיה מודולרי וקל לתחזוק. אם תקרא לזה OO טוב או לא, זה פחות משנה.

פורסם

אני מסכים בהחלט עם שני הפוסטים האחרונים

ליאור

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

גיל

אני חושב שסיכמת יפה את המטרה הכללית של שיטת OO :)

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים