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