המגבלות של ירושה עמוקה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-JavaScript של Coddy. שיעור 48 מתוך 56.
למרות שהורשה שימושית, יצירת היררכיות הורשה עמוקות מאוד (הורה → ילד → נכד → נין) עלולה להוביל לבעיות. ככל שהשרשרת עמוקה יותר, כך קשה יותר להבין את הקוד, לתחזק אותו ולשנות אותו.
בואו נראה מה קורה בשרשרת ירושה עמוקה:
// מחלקת בסיס
class Vehicle {
constructor(type) {
this.type = type;
this.isRunning = false;
}
start() {
this.isRunning = true;
console.log(`${this.type} started`);
}
}
// רמה ראשונה של ירושה
class Car extends Vehicle {
constructor(make, model) {
super("Car");
this.make = make;
this.model = model;
this.wheels = 4;
}
honk() {
console.log("Beep beep!");
}
}
// רמה שנייה של ירושה
class SportsCar extends Car {
constructor(make, model, topSpeed) {
super(make, model);
this.topSpeed = topSpeed;
}
race() {
this.start();
console.log(`Racing at ${this.topSpeed} mph!`);
}
}בדוגמה הזאת, SportsCar נמצאת שתי רמות עמוק בהיררכיית הירושה. הדבר עלול להוביל לכמה בעיות:
- שינויים ב-Vehicle עלולים לשבור את SportsCar באופן בלתי צפוי
- ככל ששרשרת הירושה מתארכת, קשה יותר לעקוב אחר המקור של המתודות והמאפיינים
- אתה נאלץ להשתמש ביחסי "הוא-סוג-של", שאולי אינם גמישים מספיק
אתגר
יש להשלים את הקובץ Robot.js כדי שהרובוט יהיה פונקציונלי. כרגע הרובוט בנוי, אבל הוא לא יכול לעשות כלום.
מה לעשות ב־Robot.js:
- ליצור את רכיבי הרמקול והתנועה בתוך הבנאי של Robot
- להשתמש ברכיבים בשיטות:
- ב־
greet(): לקרוא ל־this.speaker.speak("Hello!"); - ב־
walkForward(): לקרוא ל־this.mover.move("forward");
- ב־
למה עושים את זה: זוהי הרכבה — הרובוט נבנה על ידי שילוב של רכיבים קטנים יותר. לרובוט יש רמקול (לדיבור) ורכיב תנועה (לתנועה), במקום לרשת את היכולות האלה.
נסו בעצמכם
import { Robot } from './Robot.js';
const myRobot = new Robot('Robo');
myRobot.greet(); // אמור להדפיס: Saying: "Hello!"
myRobot.walkForward(); // אמור להדפיס: Moving forwardהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1אובייקטים ומילת המפתח this
סקירה מהירה: אובייקטיםהוספת מתודות לאובייקטיםהבנת מילת המפתח thisפונקציות בנאימילת המפתח newאתגר סיכום7הורשה ומילת המפתח extends
הורשההקשר "הוא-סוג-של"מילת המפתח extendsהמתודה super()הורשת מאפיינים ומתודותאתגר סיכום8ארגון קוד OOP
ארגון מחלקות במודוליםתרגלו בעצמכם: קומפיילר JavaScript אונליין