אם אתם מוצאים את עצמם כותבים את הקוד הזה, הגיע הזמן שתלמדו איך לכתוב נכון!
הדוגמאות האהובות עלי הן מידול של מוצרים אלקטרוניים לתוכנה.
תלות היא משהו שיחידת עבודה צריכה כדי לעבוד.
למשל עבור בלנדר צריך סכין, אחרת הבלנדר לא ייעשה כלום.
ומעולם התוכנה:
להכניס יחידת עבודה או מידע לתוך יחידת עבודה אחרת.
הבלנדר הוא דוגמא מעולה:
הוא נותן לנו אופציה להכניס סכין לתוך שקע - וסוג הסכין קובע איזו פונקציונליות הבלנדר מבצע.
אני אשתמש בממשקים ב-C# כדי לבצע הזרקת תלויות.
וזה מתבצע בעזרת מאפיינים (Property).
1 | public interface ICutter |
יש 2 סוגים עיקריים:
דרך הבנאי
1 | public class Blender |
מתודה או מאפיין
1 | public class Blender |
הסוגים האלו תומכים גם בתבנית האסטרטגיה.
ניתן לקרוא על זה כאן:
היתרון העיקרי של הזרקת תלויות הוא הניתוק בין רכיבי עבודה שתלויים אחד בשני.
למשל בדוגמא שלנו הסכין של הבלנדר לא מובנה בתוך הבלנדר.
מה שמאפשר לנו להחליף אותו, לנקות, לתחזק ולתקן את הסכינים בצורה קלה יותר.
בדיוק כמו בקוד!!
יחידות מודולריות הרבה יותר קלות לתחזק ולתקן - אם הסכין לא חותכת כמו שצריך אנחנו יודעים איפה הבעיה, ולא נתחיל לחפש במנוע של הבלנדר.
כמו שכתבתי בתבנית האסטרטגיה:
כאן
זה גם הרבה יותר קל לבדוק יחידות קטנות יותר.
קונספט מאוד חשוב הם המכלים - Containers.
אני אגיד “קונטיינר” במקום מיכל כי זה קליט יותר.
אנחנו נמנעים מהלשתמש ידנית במילה - new.
הקונטיינר אחראי על הכלה של תבניות שאומרות איך ליצור רכיבים.
והעבודה שלו זה ליצור מופעים של מחלקות - הרכיבים עצמם.
או בC# אנחנו שומרים Typeים ויוצרים מופעים.
אני כבר מימשתי כמה קונטיינרים עם רישום ומעגל החיים של הרכיבים.
הנה איך ממשק בד”כ נראה:
1 | public enum InstanceLifecycle |
מעגל החיים של תלות:
ImageSaver מכיל ICompressor ו IStore.
המופע של IStore תלוי ב-IFileIO.
הרישום בד”כ עובד על הרמה העיקרית של האבסטרקציה של המופע - בד”כ ממשק כלשהו.
1 | Container.Register<IStore, FileStore>(); |
Then a resolve is made:
1 | // הוא לא יודע איזה סוג של מופע זה - רק הממשק! |
הקונטיינר יכול לממש את זה בצורות שונות.
הוא יכול להיות סינגלטון, מימוש pool או מופעים חדשים.
What if we have 2 implementations?
1 | IDIContainer RegisterNamed<TInstance,TImp>(string name); |
רישום ע”פ שמות יכול לפתור לנו את הבעיה הזו.
ניתן ליצור קוד יותר מורכב ע”י תוכנות (Attributes) או מטה-דטה נוסף.
לא ניכנס לזה פה.
הנה 3 דוגמאות לקונטיינרים מפורסמים ב-C#.
בסופו של דבר שימוש בקונטיינרים נותן לנו הרבה כוח על איך מופעים נוצרים.
הפעם היחידה שנשתמש אולי במילה - new זה כדי ליצור את הקונטיינר עצמו.
יש קונטיינרים חכמים שיודעים ליצור מופע מבלי לדעת איך רשמו אותו.
1 | public void Main() |
זה נותן לנו גישה למעגל החיים של הרכיבים ויצירת רכיבים מודולריות - אין כמו מודולריות.
תודה על הקריאה!