המגבלות של ירושה עמוקה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 כדי להפוך את הרובוט לפונקציונלי. כרגע הרובוט בנוי, אבל הוא לא יכול לעשות כלום.
מה צריך לעשות בתוך <strong>Robot.js</strong>:
- ליצור את רכיבי הרמקול והתנועה בתוך הבנאי של 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 אונליין