Menu
Coddy logo textTech

הרכבה לעומת ירושה

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 56 מתוך 91.

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

בירושה, Car עשויה לרשת מ־Vehicle. בהרכבה, Car מכילה אובייקט Engine:

<?php
class Engine {
    public function start(): string {
        return "Engine started";
    }
}

class Car {
    private Engine $engine;
    
    public function __construct() {
        $this->engine = new Engine();
    }
    
    public function start(): string {
        return $this->engine->start();
    }
}

$car = new Car();
echo $car->start();

פלט:

Engine started

המחלקה Car אינה יורשת מ־Engine — היא מכילה מנוע משלה. לגישה הזאת יש יתרונות משמעותיים: אפשר להחליף את המנוע במימוש אחר, המחלקות נשארות בעלות צימוד רופף, ונמנעות ההיררכיות הנוקשות שיורשה עמוקה יוצרת.

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

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

challenge icon

אתגר

קל

בואו נבנה מערכת מחשב באמצעות הרכבה, שבה Computer מורכב מאובייקטים נפרדים של רכיבים במקום לרשת מהם. כך נראה כיצד הרכבה מאפשרת לבנות אובייקטים מורכבים מחלקים פשוטים ועצמאיים יותר.

תארגן את הקוד בשלושה קבצים:

  • Processor.php: צור מחלקה בשם Processor שמייצגת CPU. השתמש בקידום מאפיינים בבנאי כדי להגדיר $model פרטי (מחרוזת) ו-$cores פרטי (מספר שלם). הוסף שיטה בשם getSpecs() שמחזירה "[model] ([cores] cores)".
  • Memory.php: צור מחלקה בשם Memory שמייצגת RAM. השתמש בקידום מאפיינים בבנאי כדי להגדיר $size פרטי (מספר שלם שמייצג GB). הוסף שיטה בשם getCapacity() שמחזירה "[size]GB RAM".
  • main.php: כלול את שני קובצי הרכיבים וצור מחלקה בשם Computer שמשתמשת בהרכבה. על Computer לבצע את הפעולות הבאות:
    • לשמור אובייקט Processor ואובייקט Memory כמאפיינים פרטיים
    • לקבל בבנאי דגם מעבד, מספר ליבות וגודל זיכרון
    • ליצור את אובייקטי הרכיבים בתוך המחלקה במהלך הבנייה
    • להכיל שיטה בשם describe() שמחזירה "Computer with [processor specs] and [memory capacity]"

    תקבל שלוש קלטים: דגם מעבד, מספר ליבות וגודל זיכרון ב-GB. צור Computer עם המפרט הזה והדפס את התוצאה של קריאה ל-describe().

שים לב ש-Computer לא יורשת מ-Processor או מ-Memory. היא מכילה אותם. קשר ה״יש-לו״ הזה באמצעות הרכבה שומר על כל רכיב עצמאי וניתן לשימוש חוזר, ובו בזמן מאפשר ל-Computer להאציל משימות לחלקים שלה בעת הצורך.

נסו בעצמכם

<?php
require_once 'Processor.php';
require_once 'Memory.php';

class Computer
{
    // TODO: הגדירו מאפיינים פרטיים לאחסון אובייקטים מסוג Processor ו-Memory

    // TODO: הבנאי צריך לקבל את דגם המעבד, מספר הליבות וגודל הזיכרון
    // וליצור בתוכו את אובייקטי הרכיבים
    public function __construct()
    {
        // TODO: צרו אובייקטים מסוג Processor ו-Memory ושמרו אותם
    }

    // TODO: ממשו את המתודה describe() שמחזירה
    // "Computer with [processor specs] and [memory capacity]"
    public function describe(): string
    {
        // TODO: העבירו את הטיפול לאובייקטי הרכיבים והחזירו מחרוזת מעוצבת
    }
}

// קראו את הקלט
$processorModel = trim(fgets(STDIN));
$cores = intval(fgets(STDIN));
$memorySize = intval(fgets(STDIN));

// TODO: צרו Computer עם המפרט הנתון והדפיסו את התוצאה של describe()

?>
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר PHP אונליין