משך: 2 שעות אקדמיות (90 דקות) בכיתה + מצגות סטודנטים בשיעור נפרד/המשך.

מטרת השיעור: הסטודנטים יזהו ששני דפוסים שכבר תרגלו (הנחות, אמצעי תשלום) הם למעשה Strategy Pattern, ויכירו Singleton ו-Factory כתבניות נוספות שכיחות.

בסוף השיעור הסטודנטים צריכים: להסביר מתי להשתמש ב-Strategy/Singleton/Factory, לממש Singleton בטוח (קונסטרוקטור private), ולהכין מצגת קצרה על תבנית עיצוב נוספת לבחירתם.

דגש קריטי: זהו שיעור שמסתיים במטלת הצגה עצמאית (student presentation) — הקדישו את 15 הדקות האחרונות להסבר מפורש על דרישות המצגת והצגת רשימת תבניות מומלצות לבחירה.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותהזכירו DiscountStrategy/PaymentMethod — “יש לזה שם!”
הרעיון: Strategy (שם לדפוס מוכר)10 דקותחיבור ישיר לקוד שכבר נכתב
הבעיה + הרעיון: Singleton20 דקותAppConfig — הדגישו קונסטרוקטור private ו-Lazy Init
הבעיה + הרעיון: Factory20 דקותNotifierFactory — ריכוז לוגיקת יצירה
אזהרה: Over-Engineering10 דקותתבניות הן פתרון לבעיה קונקרטית, לא ברירת מחדל
תרגול מודרך10 דקותתרגיל 1+2
הסבר מטלת מצגות15 דקותחלוקת תבניות לבחירה, קריטריונים, מועד הצגה

דגשים להעברת השיעור

  • ההתחלה מ-“אתם כבר עשיתם Strategy בלי לדעת” היא הדרך הכי טובה לפרק את החשש מ"עוד נושא תיאורטי כבד" — תבניות עיצוב הן שם לדבר מוכר, לא כלי חדש.
  • Singleton דורש דגש מיוחד על הסכנות שלו (מצב גלובלי, קושי בבדיקות) — לא להציג אותו כ"הכלי הכי טוב תמיד".
  • לגבי מטלת המצגות: הכינו מראש רשימת 5-6 תבניות מומלצות (Observer, Decorator, Adapter, Builder, Facade, Command) כדי שסטודנטים לא יתקעו על “איזו תבנית לבחור”.

מושגים

Design Pattern — פתרון מוכר וחוזר לבעיית תכנון נפוצה. Strategy — אלגוריתמים חלופיים מאחורי חוזה משותף. Singleton — מופע יחיד גלובלי, קונסטרוקטור private. Factory — ריכוז לוגיקת יצירת אובייקטים במקום אחד.


תרגיל חשיבה

שאלת פתיחה: “אם Singleton כל כך נוח (גישה גלובלית מכל מקום) — למה לא להשתמש בו לכל מחלקה בתוכנית?”

מהלך: תנו לסטודנטים לחשוב על החיסרון. הובילו לתובנה: גישה גלובלית מכל מקום = תלות נסתרת — קשה לדעת מי משתמש במה, וקשה מאוד להחליף למימוש-בדיקה (Mock) בזמן Unit Testing, כי אין דרך “להזריק” גרסה חלופית כמו שראינו ב-DIP. Singleton שימושי כשבאמת יש צורך במופע יחיד (הגדרות, לוגר) — לא כברירת מחדל נוחה לכל דבר.

מה המרצה מראה בסוף: הראו קוד עם AppConfig.Instance בכמה מקומות שונים בקוד — ואז שאלו “איך הייתם בודקים (Unit Test) פונקציה שמשתמשת ב-AppConfig.Instance, עם ערך שונה מהרגיל?” — הובילו לכך שזה קשה בהרבה מהזרקת Interface (DIP), כהכנה לנושא ה-DAL/DI ביחידת ASP.NET Core הקרובה.