Menu
Coddy logo textTech

מבוא לתבניות עיצוב

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

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

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

דפוסי תכנון מחולקים בדרך כלל לשלוש קטגוריות:

קטגוריה מטרה דוגמאות
יצירה כיצד אובייקטים נוצרים Singleton, Factory
מבנה כיצד אובייקטים מורכבים Adapter, Decorator
התנהגות כיצד אובייקטים מתקשרים Observer, Strategy

למעשה, השתמשת בתבניות לאורך הקורס הזה בלי שהבחנת בכך. כשיצרת מחלקות מופשטות עם מתודות שמחלקות צאצאיות חייבות לממש, יישמת צורה של תבנית מתודת התבנית (Template Method). כשהשתמשת בממשקים כדי להגדיר חוזים, התכוננת לתבנית האסטרטגיה (Strategy).

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

challenge icon

אתגר

קל

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

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

  • MessageFormatter.php: צרו ממשק בשם MessageFormatter שמגדיר חוזה לעיצוב הודעות. צריכה להיות בו מתודה יחידה format(string $message): string. הוא מייצג את הקטגוריה התנהגותית. הוא מגדיר כיצד אובייקטים מתקשרים ומעבדים נתונים.
  • Formatters.php: כללו את הקובץ MessageFormatter וצרו שתי מחלקות שמממשות את הממשק:
    • UppercaseFormatter: המתודה format() שלה מחזירה את ההודעה כשהיא מומרת לאותיות גדולות
    • BracketFormatter: המתודה format() שלה עוטפת את ההודעה בסוגריים מרובעים, כמו [message]
  • main.php: כללו את קובץ Formatters. תקבלו שתי קלטים: מחרוזת הודעה וסוג מעצב ("upper" או "bracket").

    צרו פונקציה בשם processMessage שמקבלת MessageFormatter ומחרוזת הודעה, ואז מחזירה את התוצאה המעוצבת. הפונקציה לא צריכה לדעת איזה מעצב מסוים היא מקבלת. היא רק קוראת ל-format() של כל אובייקט שמועבר אליה.

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

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

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

נסו בעצמכם

<?php
require_once 'Formatters.php';

// קרא את הקלט
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));

// TODO: צור פונקציה בשם processMessage שמקבלת MessageFormatter
// ומחרוזת הודעה, ואז מחזירה את התוצאה המעוצבת


// TODO: בהתבסס על $formatterType ("upper" או "bracket"), צור את הגורם המעצב המתאים


// TODO: קרא ל-processMessage עם הגורם המעצב וההודעה, ואז הדפס את התוצאה


// TODO: הדפס את קטגוריית התבנית בשורה חדשה
// פורמט: "Pattern category: Behavioral"

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

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

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

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