מבוא לתבניות עיצוב
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 70 מתוך 91.
תבניות עיצוב הן פתרונות מוכחים לבעיות נפוצות שמפתחים נתקלים בהן שוב ושוב בעת פיתוח תוכנה. במקום להמציא את הגלגל מחדש בכל פעם, אפשר ליישם את התבניות המבוססות האלה כדי לפתור אתגרים דומים בקוד שלך.
חשבו על תבניות עיצוב כעל מתכונים. בדיוק כפי ששף פועל לפי מתכון כדי ליצור מנה שהשתכללה לאורך זמן, מפתחים משתמשים בתבניות עיצוב כדי לארגן את הקוד שלהם בדרכים שנבדקו ושופרו בידי אינספור מתכנתים לפניהם.
דפוסי תכנון מחולקים בדרך כלל לשלוש קטגוריות:
| קטגוריה | מטרה | דוגמאות |
|---|---|---|
| יצירה | כיצד אובייקטים נוצרים | Singleton, Factory |
| מבנה | כיצד אובייקטים מורכבים | Adapter, Decorator |
| התנהגות | כיצד אובייקטים מתקשרים | Observer, Strategy |
למעשה, השתמשת בתבניות לאורך הקורס הזה בלי שהבחנת בכך. כשיצרת מחלקות מופשטות עם מתודות שמחלקות צאצאיות חייבות לממש, יישמת צורה של תבנית מתודת התבנית (Template Method). כשהשתמשת בממשקים כדי להגדיר חוזים, התכוננת לתבנית האסטרטגיה (Strategy).
לימוד תבניות עיצוב מקנה לך אוצר מילים משותף עם מפתחים אחרים. במקום להסביר מבנה מורכב בפירוט, אפשר פשוט לומר "השתמשתי כאן בתבנית Factory", ומפתחים מנוסים יבינו מיד את הגישה שלך. בשיעורים הבאים נממש כמה תבניות חיוניות ב-PHP.
אתגר
קלבואו נבנה מערכת פשוטה לעיצוב הודעות, שמדגימה כיצד תבניות עיצוב עוזרות לארגן קוד. תזהו לאיזו קטגוריית תבניות שייך כל רכיב ותראו כיצד חלקים שונים במערכת פועלים יחד.
תארגנו את הקוד בשלושה קבצים:
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"
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין