מבוא לתבניות עיצוב
- מאמרים: 4
- חדש: איך בוחרים תבנית עיצוב בלי להתאהב בפתרון
כשהבעיה במבנה, לא באלגוריתם
תבניות עיצוב, SOLID, UML וארכיטקטורת תוכנה — בעברית, עם מימוש מלא
תרשים מחלקות
כל נושא באתר הוא מחלקה בתרשים: המבוא הוא המחלקה המופשטת שממנה יורשות משפחות התבניות, והעקרונות והארכיטקטורה נשענים עליהן.
package תבניות GoF
package עקרונות תכנון
package ארכיטקטורה
קטלוג התבניות
לכל תבנית שלושה מבטים, כמו בספר: הכוונה, המשתתפים וההשלכות — כפי שהם מופיעים במאמר עצמו.
כוונה
Factory Method מגדירה ממשק ליצירת אובייקט ומשאירה למחלקות־הבת להחליט איזו מחלקה ליצור. ההגדרה המדויקת, ארבעת המשתתפים, מימוש מלא ב-Java ובפייתון, ההבדל מ"פקטורי פשוט" ומתי new ישיר עדיף.
מבנה
השלכות
כוונה
Abstract Factory מספקת ממשק ליצירת משפחות של אובייקטים קשורים בלי לציין את המחלקות הקונקרטיות שלהם. ההגדרה לפי ספר ה-GoF, חמשת המשתתפים, מימוש מלא ב-Java ובפייתון, ומה ההבדל האמיתי בינה לבין Factory Method.
מבנה
השלכות
כוונה
Builder מפרידה בין תהליך הבנייה של אובייקט מורכב לבין הייצוג שלו, כך שאותו תהליך יכול לייצר ייצוגים שונים. ההגדרה של ספר ה-GoF עם Director, הווריאציה השוטפת המוכרת מ-Java, מימוש מלא של שתיהן ומתי לא צריך אף אחת.
מבנה
השלכות
כוונה
תבנית Decorator, או קשטן, מוסיפה אחריות לאובייקט באופן דינמי ומהווה חלופה גמישה לירושה. ההגדרה לפי ספר ה-GoF, ארבעת המשתתפים, מימוש מלא ב-Java ובפייתון, איך זרמי הקלט/פלט של Java בנויים עליה, ולמה הסדר בין העטיפות קובע.
מבנה
השלכות
כוונה
Composite מרכיבה אובייקטים למבני עץ שמייצגים היררכיות של חלק ושלם, ומאפשרת ללקוח לטפל באובייקט בודד ובהרכב של אובייקטים באותה צורה. ההגדרה לפי ספר ה-GoF, המשתתפים, מימוש מלא על מערכת קבצים ב-Java ובפייתון, והדילמה בין שקיפות לבטיחות.
מבנה
השלכות
כוונה
Visitor מייצגת פעולה שמתבצעת על האלמנטים של מבנה אובייקטים, ומאפשרת להגדיר פעולה חדשה בלי לשנות את מחלקות האלמנטים. ההגדרה לפי ספר ה-GoF, איך double dispatch עובד באמת, מימוש מלא על עץ ביטויים ב-Java ובפייתון, והחלופה המודרנית של pattern matching.
מבנה
השלכות
כוונה
Mediator מגדירה אובייקט שמכמס את האופן שבו קבוצת אובייקטים מתקשרת, ומונעת מהם להפנות זה לזה ישירות. ההגדרה לפי ספר ה-GoF, המשתתפים, מימוש מלא ב-Java ובפייתון על טופס שבו רכיבים תלויים זה בזה, ואיך לא להפוך את המתווך לאובייקט־אל.
מבנה
השלכות
כוונה
Chain of Responsibility מנתקת את שולח הבקשה מהמקבל שלה בכך שהיא נותנת ליותר מאובייקט אחד הזדמנות לטפל בה. ההגדרה לפי ספר ה-GoF, המשתתפים, מימוש מלא ב-Java ובפייתון על שרשרת אישורי רכש, הווריאציה של צינור מסננים, ומה קורה כשאף חוליה לא מטפלת.
מבנה
השלכות
רוב הקוד שקשה לשנות לא נכתב רע. הוא נכתב נכון לבעיה של אז, והבעיה גדלה. מחלקה שיוצרת בעצמה את כל מה שהיא צריכה, שרשרת של if שמחליטה מי מטפל בבקשה, ממשק משתמש שבו כל רכיב מכיר את כל האחרים — כל אחד מאלה עובד מצוין ביום הראשון, ומתחיל לחרוק בחודש השישי.
שכבת הפשטה עוסק בדיוק ברגע הזה: ברגע שבו מבינים שהבעיה אינה באלגוריתם אלא במבנה. האתר מסביר בעברית את תבניות העיצוב הקלאסיות של ספר ה-Gang of Four, את עקרונות SOLID, את UML ואת ההחלטות הגדולות של ארכיטקטורת מערכות. התבניות המרכזיות מוצגות עם מימוש מלא שאפשר לקמפל ולהריץ, וכל מאמר כולל גם פסקה כנה על המקרים שבהם היא לא שווה את המחיר. מי שמתחיל מאפס — מה הן תבניות עיצוב, ומתי הן סתם שכבה מיותרת.
הדרך הגרועה ללמוד תבניות היא לשנן רשימה ואז לחפש איפה להשתמש בהן. הדרך הטובה מתחילה מהמשפט שאתם אומרים לעצמכם מול הקוד. מצאו את המשפט בעמודה הימנית:
| מה אתם אומרים לעצמכם | התבנית שכדאי לבדוק |
|---|---|
| "אני צריך ליצור אובייקטים בלי שהקוד יכיר את המחלקות הקונקרטיות" | Factory Method |
| "אני צריך ליצור משפחה שלמה של אובייקטים שחייבים להתאים זה לזה" | Abstract Factory |
| "לבנאי יש תשעה פרמטרים, וחצי מהם אופציונליים" | Builder |
| "אני רוצה להוסיף התנהגות לאובייקט בלי לייצר מחלקת־בת לכל צירוף" | Decorator (קשטן) |
| "יש לי עץ, ואני רוצה לטפל בעלה ובענף באותה צורה" | Composite |
| "הספרייה מצוינת, אבל הממשק שלה לא מתאים לשלי" | Adapter |
| "אני מוסיף כל שבוע פעולה חדשה על אותו מבנה אובייקטים" | Visitor |
| "כמה מטפלים אפשריים, ואני לא רוצה שהשולח יידע מי מהם יטפל" | Chain of Responsibility |
| "כל רכיב בטופס מכיר את כל הרכיבים האחרים" | Mediator |
| "כמה אובייקטים צריכים לדעת כשמשהו משתנה" | Observer |
| "יש כמה דרכים לחשב את אותו דבר, והבחירה נעשית בזמן ריצה" | Strategy |
| "אני צריך לבטל פעולה, לשמור אותה בתור או להריץ אותה מאוחר יותר" | Command |
הטבלה היא נקודת התחלה ולא פסק דין. אותו משפט יכול להוביל לשתי תבניות שונות, ולפעמים התשובה הנכונה היא פונקציה פשוטה ושום תבנית. בכל מאמר יש סעיף "מתי לא להשתמש" בדיוק בשביל זה.
מאחורי רוב התבניות עומדים כמה עקרונות פשוטים: מחלקה עם סיבה אחת להשתנות, קוד שאפשר להרחיב בלי לפתוח, תלות בהפשטות ולא במימושים. מי שמבין אותם מזהה בעצמו מתי תבנית מתאימה, ומתי היא רק מוסיפה שמות. חמשת עקרונות SOLID מוסברים כאן עם דוגמה לפני ואחרי לכל אחד, ובלי הטון של "חוק שאסור לעבור עליו".
תרשים טוב חוסך פגישה. תרשים שמנסה להראות הכול חוסך כלום. במדריך ה-UML מוסברים התרשימים שבאמת משתמשים בהם — מחלקות, רצף, מקרי שימוש ופעילות — ואיך מציירים אותם ברמת הפירוט שמתאימה לשיחה, ולא לתקן.
פיצול מערכת לשירותים פותר בעיות של צוותים ושל פריסה, ומייצר בעיות של רשת, של נתונים ושל תפעול. המאמר על ארכיטקטורת מיקרו־שירותים עובר על גבולות שירות, תקשורת ועקביות נתונים, ועל השאלה שקודמת לכולן: האם המערכת שלכם באמת צריכה את זה.
האתר לא מוכר קורס, לא מציע ייעוץ ולא מלמד שפת תכנות. הקוד כאן נועד להמחיש רעיון תכנוני, וכל דוגמה קצרה ככל האפשר.
עדכונים
תכנון API

GraphQL ו-REST אינם שתי דרכים שונות “לעשות אותו דבר”. הם פותרים בעיות תכנון שונות, ולכן גם יוצרים כשלים שונים. מי שבוחר ביניהם רק לפי נוחות בצד הלקוח, או לפי מה…
מיקרו־שירותים

כאשר מערכת בנויה ממיקרו־שירותים, נפילה של שירות אחד היא לא אירוע מקומי בלבד. קריאה איטית לשירות תשלומים, קטלוג או הרשאות יכולה להחזיק חיבורים, לחסום threads, להגדיל תורים, ולהפוך תקלה קטנה…
UML ותרשימים

תרשים מקרי שימוש, או uml use case diagram, הוא אחד הכלים הפשוטים ביותר ב־UML — ובדיוק בגלל זה קל להשתמש בו לא נכון. במקום לתאר מה המשתמשים רוצים להשיג מהמערכת,…
תכנון מונחה עצמים

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

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

תבנית command design pattern מטפלת ברגע שבו פעולה כבר אינה רק קריאה ישירה למתודה, אלא משהו שצריך לשמור, להעביר, להריץ מאוחר יותר, לבטל או לבצע שוב. במקום שאובייקט אחד יגיד…
תרשים אובייקטים
כותב על תבניות העיצוב של GoF ועל תקשורת בין אובייקטים. אינו מרצה באוניברסיטה, אינו יועץ ארכיטקטורה ואינו מגייס — מסביר כל תבנית דרך בעיה מוחשית ודוגמת קוד, ומציין מתי היא לא שווה את המחיר.
כותבת על SOLID, תכנון מונחה עצמים, UML, מיקרו־שירותים ותכנון API. לא ארכיטקטית מוסמכת ולא נציגה של חברה או קורס — מסבירה החלטות תכנון עם יתרונות, חסרונות ודוגמה לפני ואחרי.