C#'ta Interpreter Design Pattern

C#'ta Interpreter Design Pattern kullanımını görelim.

Interpreter Design Pattern: Behavioral Design Patterns Gurubu içerisinde yer alır.

Yorumlayıcı Kalıbı: Mantıksal kalıpların çözümlenmesi ve bir bütün içerisinde yer almasını sağlamak amacıyla kullanılmaktadır. Dil bilgisi kuralları gibi kalıplar içerisinde yer alan ifadelerin yorumlanması amacıyla kullanılması tercih edilmektedir. Kısacası roma rakamı gibi bir sayının MCMXXVIII nasıl çevirleceğini kurallar bütünü içerisinde düzenleyen yapıdır.

  • AbstractExpression  Yorumlama işlemini yapan yapının arayüzü. Interface veya Abstract Class
  • TerminalExpression: İşleme konu olan değerler.
  • NonterminalExpression: Diğer değerler
  • Context: Yorumlanacak içerik
  • Client: İstemci uygulama
namespace ConsoleApplication1

{

class Program

{

static void Main()

{

string roman = "MCMXXVIII";

Context context = new Context(roman);


List<Expression> tree = new List<Expression>(); tree.Add(new ThousandExpression());

tree.Add(new HundredExpression()); tree.Add(new TenExpression()); tree.Add(new OneExpression());


foreach (Expression exp in tree)

{

exp.Interpret(context);

}


Console.WriteLine("{0} = {1}", roman, context.Output);


Console.ReadKey();

}

}


//Context class Context

{

private string _input; private int _output;


public Context(string input)

{

this._input = input;

}


public string Input

{

get { return _input; } set { _input = value; }

}


public int Output

{

get { return _output; } set { _output = value; }

}

}


// AbstractExpression abstract class Expression

{

public void Interpret(Context context)

{

if (context.Input.Length == 0) return;


if (context.Input.StartsWith(Nine()))

{

context.Output += (9 * Multiplier()); context.Input = context.Input.Substring(2);

}

else if (context.Input.StartsWith(Four()))

{

context.Output += (4 * Multiplier()); context.Input = context.Input.Substring(2);

}

else if (context.Input.StartsWith(Five()))

{

context.Output += (5 * Multiplier()); context.Input = context.Input.Substring(1);

}


while (context.Input.StartsWith(One()))

{

context.Output += (1 * Multiplier()); context.Input = context.Input.Substring(1);

}

}


public abstract string One(); public abstract string Four(); public abstract string Five(); public abstract string Nine(); public abstract int Multiplier();

}


// TerminalExpression

class ThousandExpression : Expression

{

public override string One() { return "M"; } public override string Four() { return " "; } public override string Five() { return " "; } public override string Nine() { return " "; } public override int Multiplier() { return 1000; }

}


// TerminalExpression

class HundredExpression : Expression

{

public override string One() { return "C"; } public override string Four() { return "CD"; } public override string Five() { return "D"; } public override string Nine() { return "CM"; } public override int Multiplier() { return 100; }

}


// TerminalExpression

class TenExpression : Expression

{

public override string One() { return "X"; } public override string Four() { return "XL"; } public override string Five() { return "L"; } public override string Nine() { return "XC"; } public override int Multiplier() { return 10; }

}


// TerminalExpression

class OneExpression : Expression

{

public override string One() { return "I"; } public override string Four() { return "IV"; } public override string Five() { return "V"; } public override string Nine() { return "IX"; } public override int Multiplier() { return 1; }

}

}

 

Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git