תמונה ראשית עבור 'Mixins' Mixins

מה הם Mixins?

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

 מבלבל?

Mixins קיימים בהרבה שפות, כמו: Dart, Ruby, TypesScript ו- JavaScript החל מES6.
מנועי CSS כמו SCSS גם משתמשים ב- Mixins בצורה מעט שונה.
אני אשתמש ב- TypeScript על מנת להדגים בעיה שניתן לפתור בקלות על ידי שימוש ב- Mixins:
נניח שיש לנו ארבעה גיבורי על: סופרמן, וונדרוומן, בטמן ואיירון מן. עכשיו נציג אותם בקוד:
class Superman implements Hero {
     fly() {
          console.log("Flying");
     }
    superPunch() {
          console.log("Puncing");
     }
}
 
class WonderWoman implements Hero {
     fly() {
          console.log("Flying");
     }
     superPunch() {
          console.log("Puncing");
     }
}
 
class Batman implements Hero {
}
 
class IronMan implements Hero {
     fly() {
          console.log("Flying");
     }
     superPunch() {
          console.log("Puncing");
     }
     shootLazer() {
          console.log("Shooting");
     }
}
הקוד שלמעלה ירוץ, הוא יעבוד מעולה, אבל הוא לא יהיה הכי פשוט לתחזוקה, כיוון שמספר גיבורי על חולקים כוחות זהים, ולכן כאשר נרצה לשנות את הדרך שבה אנחנו מממשים את אחד הכוחות, כנראה שנצטרך לשנות אותו כמה פעמים, במספר מחלקות; בעיה שרק תגדל כאשר יתווספו עוד גיבורים.

הפתרון של Mixin לבעיה הזו

ניתן לפתור בעיה כזו בעזרת Mixins, בצורה הבאה:
 
class FlyAbility {
    fly() {
         console.log("Flying");
    }
}
 
class SuperStrengthAbility {
    superPunch() {
         console.log("Puncing");
    }
}
class LazerAbility {
     shootLazer() {
          console.log("Shooting");
     }
}
 
class Superman implements Hero, FlyAbility, SuperStrengthAbility { }
class WonderWoman implements Hero, FlyAbility, SuperStrengthAbility { }
class Batman implements Hero { }
class IronMan implements Hero, FlyAbility, LazerAbility { }
 
applyMixins (Superman, [FlyAbility, SuperStrengthAbility]);
applyMixins (WonderWoman, [FlyAbility, SuperStrengthAbility]);
applyMixins (IronMan, [FlyAbility, LazerAbility]);
 
 בצורה כזו, כשנרצה לשנות את הדרך שבה אנחנו מממשים כוח נצטרך לשנות רק את המחלקה של אותו הכוח, ולא נצטרך לגעת בגיבורים, וכשנרצה להוסיף גיבור או להוסיף/להסיר כוחות לגיבורים, נוכל לעשות זאת בקלות רק על ידי ציון שמות הכוחות שיש לגיבורים בתור משהו שהמחלקה מממשת, והפעלת הכוחות עצמם בעזרת הפונקציה applyMixins.

תגובות

הוסף תגובה