Nullble Object

16 בNovember 2012

2 תגובות


 Nullble
Object Pattern

מתכנתים בשפות מונחות עצמים מכירים היטב את הבעיה שלעיתים רפרנס לאובייקט הוא Null.

לעיתים כי זאת הדרישה או המערכת שאתה אנו מתקשרים לעיתים מאתחול מאוחר של אובייקטים

או מכל מיני סיבות לעיתים מכוונות וזה בסדר! אולם התבנית באה להתמודד אם מקרי הנפילה שבהם

אנחנו נתפסים לא מוכנים כשעושים
invoke
על אובייקט.

אחת השורות הכי נפוצות בקוד מודרני היא if Item
!=
null  גם אם
אין קשר כי
ככ רגילים שהמערכת נופלת על
Nulls
אז למה לקחת
סיכון ??

אבל nullble object זאת גם
תבנית עיצוב עתיקה שבדכ אנו
נתקלים בצד המגעיל שלה שלה (להלן
אחת השורות הכי
נפוצות..)

אם כל האובייקטים היו עובדים על
בסיס של null object לא היה
סיכון של נפילה בזמן ריצה,

הרעיון הבסיסי הוא
לעטוף את האובייקט האמיתי שמייצג את
הערך באובייקט שמחזיק  סינגלטון

אינסטנס שלו עצמו
וכך תמיד יהיה
ערך, ולא
יחזור אף פעם
null
כשנקרא לאובייקט, אני
אציג דוגמא פשוטה על אובייקט Person :

1.     נגדיר
אבסטרקט בייס קלאס לאובייקט המבוקש, יש לו שם ופונקציה שבה הוא מכריז על  שמו.

 public abstract class BasePerson

    {

        public abstract string Name { get; }

        public abstract void SayYourName();

    }

  

2.     נגדיר
אובייקט “יורש” מאותו הטיפוס שייצג את 
“null”:

ublic class NullPerson : BasePerson
    {
        public override string Name
        {
            get
            {
                return string.Empty;
            }
        }
        public override void SayYourName() { }
    }

 

3.     ונוסיף
ל”אבא” שלו מופע סטטי שלו (האבא יחזיק את היורש).

עכשיו
ה”אבא” ייראה כך : (כך ייראה סעיף 1 המחודש):

 public abstract class BasePerson
    {
        public abstract string Name { get; }
        public abstract void SayYourName();
        static readonly NullPerson nullPerson = new NullPerson();
 
        public static NullPerson Null
        {
            get { return nullPerson; }
        }
    }

4.     אני יוצר
שני מופעים רגילים של האובייקט:

 public class OldPerson : BasePerson
    {
        public override string Name
        {
            get { return "John"; }
        }
        public override void SayYourName()
        {
            Console.WriteLine("I am a littl boy and my name is" + this.Name);
        }
    }
 
    public class YoungPerson : BasePerson
    {
        public override string Name
        {
            get { return "Maggie"; }
        }
        public override void SayYourName()
        {
            Console.WriteLine("I am a Little girl nd my name is" + this.Name);
        }
 
    }

5.       אני משתמש בפקטורי (אפשר לקרוא על פקטורי כאן)
להדגים שהאובייקטים נוצרים בזמן ריצה

שימו לב
שהפקטורי מחזיר את ה
null
object

אם הוא לא יודע מה לייצר.

public class PersonFactory
    {
        public BasePerson BuildPerson(string name)
        {
            if (name == "1")
            {
                return new OldPerson();
            }
            else if (name == "2")
            {
                return new YoungPerson();
            }
 
            return BasePerson.Null;
        }
    }

6.     אם אני
עושה שימוש בפקטורי נניח בצורה הבאה אני אוכל לעבוד כרגיל בלי לחשוש לתעופה של
המערכת למרות שהבחירה “3” היתה מחזירה כלום !

 static void Main(string[] args)
        {
            PersonFactory factory = new PersonFactory();
            BasePerson p1 = factory.BuildPerson("1");
            BasePerson p2 = factory.BuildPerson("2");
            BasePerson p3 = factory.BuildPerson("3");
 
            p1.SayYourName();
            p2.SayYourName();
            p3.SayYourName();
            Console.ReadLine();
        }

 

עוד דוגמא  מעשית מתי זה
טוב?

בוא נניח שמשתמש של אפליקציה מאחסן נתונים ב database האובייקט המאוחסן הוא
רחב מאוד

עם אין ספור
משתנים, אני
לא מעוניין לשמור עבור כל משתמש שדות שלא רלוונטים עבורו(נפוץ
במערכות ישנות שלא
משתמשות בירושה ופלימורפיזם אז בתהליך השמירה נבדוק אם המשתמש עדכן את
השדה הנוכחי בפרמטר משלו ואם לא,
שזה אומר השדה
הריק לא רלוונטי לגביו נחזיק שם 
 null object

בדוט נט ישנה תשתית
מובנית עבור
null
Object
גם על
טייפים שלא יכולים להיות
null.

זה לא קוד תקני :

     int NullInt = null;

 

אבל זה כן:

 Nullable<int> MyNullInt = null;
 
            if (MyNullInt.HasValue)
            {
                Console.WriteLine(MyNullInt.Value);
            }

 

 

 

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *

2 תגובות

  1. יהושעNET.24 בFebruary 2013 ב 15:03

    כתבה יפה מאוד. אהבתי

    Reply
  2. יוז8 בSeptember 2013 ב 0:53

    שימושי מאוד

    Reply