Menu
Coddy logo textTech

תבנית הפקודה

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

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

חשוב על מסעדה.

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

כך מנותק מבקש הפעולה ממבצע הפעולה.

הנה מימוש בסיסי:

<?php
interface Command {
    public function execute(): string;
}
class Light {
    public function on(): string { return "Light is ON"; }
    public function off(): string { return "Light is OFF"; }
}
class LightOnCommand implements Command {
    public function __construct(private Light $light) {}
    
    public function execute(): string {
        return $this->light->on();
    }
}
class LightOffCommand implements Command {
    public function __construct(private Light $light) {}
    
    public function execute(): string {
        return $this->light->off();
    }
}

היוזם מפעיל פקודות בלי לדעת מה הן עושות:

<?php
class RemoteControl {
    public function press(Command $command): string {
        return $command->execute();
    }
}
$light = new Light();
$remote = new RemoteControl();

echo $remote->press(new LightOnCommand($light)) . "\n";
echo $remote->press(new LightOffCommand($light));

פלט:

Light is ON
Light is OFF

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

challenge icon

אתגר

קל

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

תארגנו את הקוד שלכם בארבעה קבצים:

  • Command.php: הגדירו ממשק Command עם מתודה יחידה execute(): string. כך מוגדר החוזה שעל כל פקודות העורך לקיים.
  • TextEditor.php, צרו מחלקה TextEditor שמייצגת את המקבל — האובייקט שמבצע בפועל את העבודה. העורך שלכם צריך:
    • לשמור את תוכן הטקסט הנוכחי (התחילו במחרוזת ריקה)
    • להכיל מתודה write(string $text): string שמוסיפה טקסט לתוכן ומחזירה "Written: [text]"
    • להכיל מתודה clear(): string שמרוקנת את התוכן ומחזירה "Content cleared"
    • להכיל מתודה getContent(): string שמחזירה את התוכן הנוכחי
  • Commands.php: כללו את הקבצים Command ו-TextEditor. צרו שתי מחלקות פקודה שמממשות את הממשק Command:
    • WriteCommand: מקבלת TextEditor ומחרוזת טקסט בבנאי שלה. המתודה execute() שלה קוראת למתודת write() של העורך ומחזירה את התוצאה.
    • ClearCommand: מקבלת TextEditor בבנאי שלה. המתודה execute() שלה קוראת למתודת clear() של העורך ומחזירה את התוצאה.
  • main.php: כללו את הקובץ Commands. תקבלו שתי קלטים: סוג פקודה ("write" או "clear") ומחרוזת טקסט (שמשמשת רק לפקודות כתיבה).

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

    בשורה חדשה, הדפיסו את התוכן הנוכחי של העורך בפורמט הזה: Content: [content] (אם התוכן ריק, הדפיסו רק Content: בלי שום דבר אחרי הרווח).

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

נסו בעצמכם

<?php

require_once 'Commands.php';

// קראו את הקלט
$commandType = trim(fgets(STDIN)); // "write" או "clear"
$text = trim(fgets(STDIN));         // טקסט עבור הפקודה write

// TODO: צרו מופע של TextEditor

// TODO: בהתאם לסוג הפקודה, צרו את אובייקט הפקודה המתאים
// - אם "write", צרו WriteCommand עם העורך והטקסט
// - אם "clear", צרו ClearCommand עם העורך

// TODO: צרו מנגנון הפעלה שקורא ל־execute() על הפקודה
// ומדפיס את התוצאה

// TODO: הדפיסו את התוכן הנוכחי של העורך בפורמט: "Content: [content]"
// (אם הוא ריק, הדפיסו רק "Content: " בלי דבר אחרי הרווח)

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

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

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

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