• #C,  Design Patterns

    Osberver – גרסת הבמאי

    טרחתם, עשיתם חזרות, שיננתם את הטקסט ואחרי משהו כמו חמש שניות הבמאי קוטע את הדרמה בדיוק לפני הקטע הטוב ואומר (באנגלית זה נשמע יותר טוב): Don’t call us we’ll call you. אמנם יש בזה משהו מעצבן, אבל מצד שני זה גם הגיוני ויעיל – אתם עצמכם לא רוצים להתקשר שלוש פעמים ביום כדי לבדוק אם יש תשובה, וגם הבמאי לא רוצה להיות עסוק במענה לכל הטלפונים של המועמדים כפול שלוש פעמים ביום. עדיף שהוא יגבש החלטה, וכאשר יש שינוי כלשהו – הוא יעדכן את כל מי שצריך לעדכן. ה- Design pattern שמטפל בבעיה הזו נקרא – Observer. כלומר – צופה. זוהי למעשה מערכת שמבטאת קשר של יחיד לרבים. היחיד הוא…

  • #C,  Design Patterns,  SOLID

    עקרונות SOLID בתכנות מונחה עצמים

    רוברט מרטין (המוכר גם כ- Uncle Bob), האיש שהביא לנו את Clean Code, הגדיר במאמריו ובספריו חמישה עקרונות שנועדו לשפר את התכנון של מערכות תוכנה מונחות עצמים – OOP. חמשת העקרונות האלו עוזרים ליצור תוכנה קלה להבנה, לתחזוקה ולהרחבה. עקרונות אלו נודעו בראשי התיבות: SOLID והם: ________________________________________________________________________________________________________________ Single Responsibility Principle (SRP) יש אומרים שגברים לא יכולים לטפל ביותר מדבר אחד בכל פעם. לא יודע עד כמה זה נכון, אבל בכתיבת קוד, אכן מומלץ שלכל מחלקה תהיה אחריות אחת בלבד. כלומר, כל מחלקה צריכה לטפל בהיבט אחד בלבד של התוכנה ולא יותר מכך. לדוגמא: במקרה זה, מחלקת `Invoice` מטפלת רק בחישוב הסכום הכולל, בעוד ש-`InvoicePrinter` מטפלת בהדפסת החשבונית. טיפ: אם המילה…

  • #C,  SOLID

    איך עובד Linq ב- #C

    Linq היא טכנולוגיה המאפשרת לנו לתשאל נתונים בעזרת קוד #C. הכוונה במילה ‘לתשאל’ היא לכך שיש יותר מחמישים אופרטורים המאפשרים למיין, לסנן, לאחד וכו’ נתונים. למשל אם נרצה לקבל מתוך רשימת עובדים את העובדים שהם מנהלי מחלקות, נעשה זאת מן הסתם בעזרת Linq. אז איך Linq עובד? כידוע #C היא שפה סטטית, והטיפוסים (types) צריכים להיות קבועים ומוגדרים. ולכן, אם נרצה למשל ליצור מתודה בשם Where, שתחזיר לנו אובייקט מטיפוס Employee, נצטרך לדאוג לך שמתודת Where מכירה את הטיפוס שלנו. באופן מפתיע אנחנו רואים שLinq תומכת בכל סוגי המשתנים, אפילו אם הרגע הגדרנו אותם. נניח שמיקרוסופט היו יוצרים לנו Interface לצורך הסינונים האלה, ושהInterface הזה מחזיק את כל המתודות הנחוצות,…

  • Design Patterns,  SOLID

    Memento

    ממנטו היא תבנית עיצוב למימוש מנגנון שיחזור – כלומר לעשות undo או ctrl +z לפעולה שעשינו.  לפעמים התבנית הזו נקראת snapshot בגלל שהיא שומרת ‘תמונת-מצב’ קודמת ומאפשרת לחזור אליה.  הדרך הנוחה והמקובלת להסביר תבנית זו היא על ידי דוגמא של עורך טקסט.    נניח שיש לי עורך טקסט הממומש בקלאס בשם Editor או כפי שהוא נקרא במקור – Originator . אכניס לתוכו ערכים באופן הבא:  ואני מצפה שתהיה לי אפשרות לבטל את הפעולה / פעולות האחרונות. למשל שתהיה לי מתודה כזו:  איך הייתם מממשים מנגנון כזה?  אם למשל הייתי מוסיף לעורך שלי שדה נוסף מסוג STRING בשם prevContent ובכל פעם שאני רוצה לשנות את הערך של CONTENT הייתי שומר לפני…

  • Design Patterns

    Inversion of Control ו Dependency Injection

    Inversion of Control (להלן Ioc), היא תבנית עיצוב אשר ניתן להגדירה באופן כללי, כהעברת השליטה על תהליך כלשהו, כגון יצירת אובייקטים, הרצת קטע קוד וכו’, מהדרך הנקראת ‘רגילה’, על ידי תהליך מרכזי כלשהו, אל רכיב קוד אחר אשר יעשה הוא את העבודה. על ידי היפוך שליטה זה נרוויח לעיתים כמה דברים, כפי שתיכף ניראה. את IoC אפשר לממש בכל מיני דרכים בהתאם לתהליך עליו אנחנו עובדים, אך הכלי שבעזרתו מממשים IoC הוא תבנית עיצוב נוספת בשם Dependency Injection. לפעמים נרצה להשתמש ב IoC על ידי אינטרפייסים, כאשר הרעיון באופן כללי אומר שבמקום שתהליך כלשהו יצטרך להכיר את המחלקות המשתמשות בשירותיו, הוא פשוט צריך להגדיר Interface אשר רק אותו הוא מכיר,…

  • Design Patterns,  SOLID

    Decorator

    בפוסט זה אדגים שני שימושים נפוצים בתבנית העיצוב Decorator. Decorator היא תבנית עיצוב די נפוצה ושימושית ביותר. היא מאפשר הוספת פונקציונליות לאובייקט קיים בצורה דינאמית, מבלי לשנות את האובייקט המקורי. אפשרות זו מונעת ירושה מיותרת או פותרת מקרים בהם אין אפשרות לירושה בכלל (Sealed). עוד דבר שניתן לומר על תבנית זו הוא שהיא מתאימה ל Open Closed Principle– עיקרון זה של תכנות מונחה עצמים אומר שClass צריך להיות פתוח להרחבה, אבל סגור לשינויים. כלומר, סביר להניח שהושקעה מחשבה רבה על עיצוב הClass שלנו, ולכן לא נרצה לשנות אותו. אך מצד שני יתכן מצב שמישהו יצטרך באיזשהו שלב להוסיף פונקציונליות לקלאס. מקרה נוסף שבו נרצה להשתמש ב Decorator הוא כאשר יש…

  • Design Patterns,  SOLID

    CLEAN CODE – כתיבת קוד שגם בני אדם יכולים לקרוא

    תכנות הוא האמנות של להגיד לאדם אחר מה הוא רוצה שהמחשב יעשה (דונאלד קנות’) מתכנת ממוצע מבלה הרבה יותר זמן בקריאת קוד מאשר בכתיבתו. נוטים לשכוח שהקוד שאנחנו כותבים יקרא בעתיד לכל הפחות 10 פעמים. לפעמים מתכנת קורא קוד שהוא עצמו כתב, ולפעמים הוא קורא קוד שאחרים כתבו. אבל כל מתכנת יודע כמה זה מתסכל לקרוא קוד שבו הכוונה לא מספיק ברורה או שהדרך להשגת המטרה לא ברורה. אי בהירות של הקוד מסתירה ברוב הפעמים גם טעויות של תכנון הקוד ופוטנציאל גדול לבאגים עתידיים. מתוך הבנת הנקודות האלה (ועוד כמה) נולדה מתודולוגיה בעולם הפיתוח שנקראת CLEAN CODE. האיש המזוהה ביותר עם CLEAN CODE הוא רוברט מרטין המכונה ‘הדוד בוב’ בספרו…