Interpreter Design Pattern

19 בDecember 2013

אין תגובות
אינטרפרטר הוא מתרגם , שפת ביניים שמייצגת אלגוריתם או UI וניתנת לקריאה ע”י פלטפורמות שונות. אינטרפרטר מקובל גם כתחליף לקומפיילר וכאן הכוונה למשהו קצת אחר, במקום לקמפל את הקוד ולהופכו לקוד מכונה בינארי אני מבצע פקודה אחת בכל פעם ולא את כל הקוד.
מי שעדיין עובד בשיטה כזאת זה (JavaScript וזה דיון אחר בזמן אחר..)
לגופו של עניין אני יכול להציג “שיטוח אובייקטים” (סריליזציה) כסוג של  ,Interpreter כמו גם לטעון שכל שפות התגיות שמתארות נתונים (  XML,Xaml,HTML )כי כל מה שמציג הקוד (MarkUp בשפה המקצועית) זה איך הולך הUI שלי להראות,  או איך בונים את ההיררכיה של האובייקט וזה מאפשר לי להעביר XML בין פלטפורמות תוך שימוש בסריליזציה.
כשקוד כזה מגיע ליעד שלו, הסביבה הלוקלית תבנה אותו או תבצע את הלוגיקה שלו לפי המימוש הפרטי שלי.
על המעבר בין פלטפורמות או שפות קשה אמנם לשלוט
וברור שחייב להיות סטנדרט כללי (ובשביל זה יש תקנים שונים בטכנולוגיות שונות) .
לדוגמא: נניח שקוד הXMLהבא מייצג טופס רישום.

<Form>

<TextBox />

<Button>

<Content>

<“Submit” />

</content>

</Button>

</Form>

די ברור לנו במבט מלמעלה מה עושה\מתאר הקוד
ופלטפורמות  שונות יוכלו ל”צייר” אותו בהינתן פקודה מתאימה עם הנתונים האלה
איך גורמים לזה לקרות? בעזרת אכיפה של תקן  גלובלי כלשהו.

הקוד הבא ידגים מבנה בסיסי של מימוש את התבנית:

class Program

    {

        static void Main()

        {

            GivenContext context = new GivenContext();


            ArrayList list = new ArrayList();


            list.Add(new JavaExpression());

            list.Add(new CSharpExpression());


            foreach (AbstractExpression exp in list)

            {

                exp.Interpret(context);

            }


        }

    }



    public class GivenContext

    {

        public string Data;

    }



    abstract class AbstractExpression

    {

        public abstract void Interpret(GivenContext context);

    }



    class JavaExpression : AbstractExpression

    {

        public override void Interpret(GivenContext context)

        {

            Console.WriteLine("Java Expression =>" + context.Data);

        }

    }



    class CSharpExpression : AbstractExpression

    {

        public override void Interpret(GivenContext context)

        {

            Console.WriteLine("CSharp Expression =>" + context.Data);

        }

    }



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

Leave a Reply

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