Interpreter Design Pattern

Interpreter Design Pattern

Interpreter tasarım deseni, behavior grubununa ait, belli bir düzen veya kurala bağlı olan metinlerin sayısal veya mantıksal olarak işlenmesi gereken durumlarda ve kural işletme motorları(Rule Engine)  için sıklıkla kullanılır. dofactory.com a göre kullanım oranı %20 civarındadır.

Dofactory.com’da sitesinde bu pattern için roma rakamlarının sayısal karşılığını bulan programa yer verilmiş ki patterni anlamak adına güzel bir örnektir.

UML şemasından göreceğiniz gibi TerminalExpression ile NonterminalExpression isimli iki farklı Exrepssion tipi vardır. Roma rakamlarından yola çıkarsak Roma rakamlarındaki her bir harf TerminalExpression’dur. Roma rakamları ile 4 işlem yapmak isteseydik toplama, çarpma gibi ifadeler NonterinalExpression olacaktı.

Bir örnek ile devam edelim.

using System;
using System.Collections.Generic;

namespace Interpreter
{
    // Context class
    class Context
    {
        public string Formula { get; set; }
        public int TotalPoint { get; set; }
    }

    // Expression
    abstract class RoleExpression
    {
        public abstract void Interpret(Context context);
    }


    #region Terminal Expression Sınıfları
    // TerminalExpression
    class ArchitectureExpression : RoleExpression
    {
        public override void Interpret(Context context)
        {
            if(context.Formula.Contains("A"))
            {
                context.TotalPoint += 5;
            }
        }
    }

    // TerminalExpression
    class ConsultantExpression : RoleExpression
    {
        public override void Interpret(Context context)
        {
            if (context.Formula.Contains("C"))
               context.TotalPoint += 10;
        }

    }

    // TerminalExpression
    class SeniorExpression : RoleExpression
    {
        public override void Interpret(Context context)
        {
            if (context.Formula.Contains("S"))
                context.TotalPoint += 15;

        }
    }

    // TerminalExpression
    class DeveloperExpression : RoleExpression
    {
        public override void Interpret(Context context)
        {
            if(context.Formula.Contains("D"))
                context.TotalPoint += 20;
        }
    }

    #endregion

    // Client
    class Program
    {
        static List<RoleExpression> CreateExpressionTree(string formula)
        {
            // Expression ağacı oluşturulur
            List<RoleExpression> tree = new List<RoleExpression>();

            foreach (char role in formula)
            {
                if (role == 'A')
                    tree.Add(new ArchitectureExpression());
                else if (role == 'S')
                    tree.Add(new SeniorExpression());
                else if (role == 'D')
                    tree.Add(new DeveloperExpression());
                else if (role == 'C')
                    tree.Add(new ConsultantExpression());

            }

            return tree;
        }

        static void RunExpression(Context context)
        {
            foreach(RoleExpression expression in CreateExpressionTree(context.Formula))
            {
               expression.Interpret(context); // TerminalExpression tiplerine ait harf sembolleri buradaki metod çağrısındada gönderilebilir.
            }

            Console.WriteLine("{0} için maliyet puanı {1}", context.Formula, context.TotalPoint);
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Architecture = 5, Consultant=10, Senior=15,Developer=20\n");
            // 1 Architect, 1 Consultan, 2 Senior Developer , 4 Junior Developer
            Context context = new Context { Formula = "ACSSDDDD" };
            RunExpression(context);

            // 1 Consultant, 1 Senior Developer, 2 Developer
            context = new Context { Formula = "CSDD" };
            RunExpression(context);

            // 1 Consultant, 1 Senior Developer, 2 Developer
            context = new Context { Formula = "SD" };
            RunExpression(context);            

        }
    }
}

Örnek Kod Kaynak  : https://www.buraksenyurt.com/post/Tasarc4b1m-Desenleri-Interpreter