Facade

31 בOctober 2012

  תבנית הFacade מגדירה ממשק חיצוני שמאגד בתוכו כמה תתי אובייקטים שאני לא רוצה להסתבך ולעבוד מול כל אחד בנפרד אלא יותר נוח לי לעבוד  מול מעטפת חיצונית . התבנית מזכירה מעט את מבנה הפרוקסי , אולם בפרוקסי אני בעיקר משיקולי אבטחה עוטף יישות  במעטפת חיצונית כדי לא לאפשר גישה ישירה , ואילו Facade נועד להקל על גישה לאובייקטים מרובים דרך ממשק אחיד. הFacade מחזיק אצלו את כל האובייקטים שאליהם הוא אמור לפנות, וכשאני יכתוב Façade f = new Façade(); אני למעשה מרים את כל האובייקטים שלו לאוויר. למה זה טוב? ובכן ,  נניח שיש לי שישה אובייקטים שתלויים זה בזה,  וכל מה שאני רוצה זה להפעיל את האחרון בשרשרת , משיקולי תכנון הם לא מכירים...

Depndency Injection

25 בOctober 2012

  Dependency Injection או  "הזרקת  תלות\התנהגות" היא תבנית שיומושית מאוד, משתמשים בה ביום יום גם בלי ההכרות עם ההגדרה המקצועית. הרעיון בבסיסו אומר שאיזור מסוים בתכנית יודע להריץ קטע קוד שמקבל מבחוץ בלי לדעת מה המימוש ומה עושה הקוד החיצוני, כל שנצרך הוא החזקת רפרנס לאינטרפייס(חוזה) מהסוג המבוקש והפעלת הפונקציה\ות  שלו. בזמן ריצה נקבל בקונסטרקטור איזשהוא אינסטנס מסוג החוזה ונעבוד על פיו.   נחשוב על דוגמא שימושית: א.      אני בונה ממשק כניסה בסיסי למערכת בנקאית. ב.      אני רוצה לבצע כניסה ברמות גישה שונות בהתאם למשתמש. ג.       נפשט את זה לרמה של פקיד רגיל ומנהל. ד.      מסך הכניסה שלי זהה לכולם. ה.      מערכת אימות הסיסמאות (bankWorkerGenerator בדוגמא) תבדוק את הסיסמא ותחזיר בהתאם מופע של עובד\מנהל, שוב כדי לפשט עניינים נניח שהסיסמא היא manager\ worker. כיון ששניהם מהווים מימוש של...
2 תגובות

Thread Safe SingleTon

23 בOctober 2012

Thread safe Singleton And Lazy initialization Singelton   בזמנו התבקשתי ע"י הקוראים לסגור  שתי פינות אלה. לקח לי זמן אבל אני הגענו לזה. Lazy initialization  מוסבר בקצרה כPattern  עצמאי בפוסט הבא. נמשיך עם Thread Safe : הבעיה מתחילה כשאובייקט שלנו במערכת שמוגדר כסינגלטון נמצא בשימוש ע"י תהליך כלשהוא ואני עכשיו מנסה לגשת לאובייקט ומתחילה מלחמה למי ישנה עדיפות (רמז, תמיד נפסיד) הפתרון הוא פשוט מאוד לבצע Lock בעת גישה לאובייקט סינגלטון באיזור ה  .return value Public seald class SingletonObject {    private static SingletonObject instance;    private static object locker = new Object();      private SingletonObject () {}      public static SingletonObject Instance    {       get       {          if (instance == null)          {             lock (locker)             {                if...
תגובה אחת

Lazy Initialization

Lazy initialization  - אתחול עצל הרעיון נמצא בשימוש גם עם השם Lazy Loading   הגדרה על אובייקט, ערך , או חישוב מסויים כלא קיימים עד לצורך האמיתי הראשון שלהם. הרעיון הוא פשוט מאוד: אם אני עובר ליד כספומט, אין לי סיבה למשוך מזומנים אלא אם אני נצרך להם.. אבל זה לא דוקא מעצלות (Lazy) אלא יותר עניין של יעילות\ניצול משאבים\זכרון. לעיתים מקובל לשלבת בתבניות נוספות כמו פקטורי, (כי הרי אנו מנסים ליצור אובייקט בזמן ריצה) וסינגלטון (אם נדרשת החזרה של אותו האובייקט)   דוגמא בסיסית: אני יוצר אובייקט מסויים בזמן ריצה בהתאם לצורך. class BaseObject     { }       class BigData_option_A : BaseObject     {         //alot af data and calculations     }       class BigData_option_B : BaseObject     {         //alot af...

Decorator

16 בOctober 2012

  Dacorator  תבנית הDecorator  מספקת "דקורציה" לאובייקט. ז"א נרצה להוסיף לאובייקט קיים התנהגות שאין לו. להרחיב את הממשק שלו. לשנות את ההתנהגות המקורית שלו. התבנית מוכרת גם בשם Wrapper . זאת למעשה אחת התבניות הפשוטות והנפוצות מאוד בשימוש. סביבה מונחית עצמים היא פלטפורמה שבה התבנית מיושמת בכל פינה. וניתן ליישם הרחבה כזאת בהרבה צורות. כשלב ראשון נציג תרחיש בסיסי על שימוש בתבנית: הדרך הפשוטה ביותר היא לרשת מהאובייקט המבוקש , להוסיף יכולות משלי, והנה מימשנו את התבנית.  //base class to decorate     class OriginalClass    {        public void Func1()        {            Console.WriteLine("original class operation");        }    }       //the simple decorator     class Decorator1 : OriginalClass    {        public void Func2()        {            Console.WriteLine("Decorator class operation");        }    }   אלא ש.. כמו שברור לא תמיד ירושה זה נוח או נכון (אם ישנם הרבה ורסיות של שינויים וניצור המון תתי קלאסים לצורך כך נקבל קוד ספגטי...)  לעיתים קרובות גם לא אפשרי לרשת מסיבות שונות. שימוש בDelegate, כחתימה, והגדרת מימוש...

‘חלק ב Template Method (Partial Method)

14 בOctober 2012

   Method   Template  חלק ב' C# 3.0 שיצא אי שם בשנת 2007  , הביא עמו כמה פיצ'רים נחמדים, בלעדיהם קשה לחשוב איך היינו כותבים קוד בפרט מי ש"נולד" ישר לסביבת c# 4.0, בנוסף לauto Properties  , Var , Initializer  Collection  , Lambda Expressions ועוד ועד.. (זה הזמן להיזכר באדיבות MSDN ) הופיע רעיון חדש של Partial Method , שזה בעצם מבנה פונקציה שמחולק לשני מקומות, אחד מייצג את החתימה והשני את המימוש,  וזה בעצם מימוש של template method, חשוב לשים לב לכמה חוקים בסיסיים. א.      אין לנו שני מימושים , רק אחד ! (בדומה להגדרת חוזה), ב.      נתן לשימוש רק בתוך Partial Classes, ג.       כהגדרהPartial Method    הוא...

Template Method

7 בOctober 2012

    הרעיון: נרצה להגדיר מבנה של אלגוריתם, אולם נרצה להשאיר חלק מסדר הפעולות שלו למשתמש (בהנחה שאנו בונים תשתית , המשתמש הוא המתכנת שיצרוך את השרות שלנו). למעשה נרצה לשמור על מבנה מסוים ולספק שימוש חוזר באלגוריתם, את המבנה נגדיר ב "קלאס אבא". הגדרת חוזה (interface) לא תספיק לנו משום שהוא מכיל חתימות בלבד ומאפשר למשתמש ל"התפרע" במימוש, וכאן אנו נספק חלק מהקוד הביצועי ולא רק חתימות. כשנרצה להגדיר את התבנית, ראשית נחשוב מה משותף לכל היורשים ומה אנו משאירים אבסטרקטי. לדוגמא: אנו נגדיר תכנית שמטרתה פתיחת קבצים ושמירת עותק לזיכרון.. החלק הראשון באלגוריתם יציג תיבת דיאלוג שלתוכה המשתמש יטען קובץ – משותף לכל הקבצים. החלק השני יבצע וולידציה אם נבחר קובץ...