Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Komut Tasarım Deseni - Command Design Pattern | Iterator Tasarım Deseni - Iterator Design Pattern>>

Interpreter Tasarım Deseni - Interpreter Design Pattern

Yazar harunozer 20 November 2012

Interpreter Tasarım Deseni - 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 kullanılır. dofactory.com a göre kullanım oranı %20 civarındadır.

Interpreter tasarım deseni, düzgün gramer ifadesindeki metinlerin sayısal veya mantıksal olarak işlenmesi gereken durumlarda kullanılır. Düzgün gramer ifadesi olarak, metinde ki karakterlerin özel karşılıkları olduğu metinler olarak düşünebiliriz. Interpreter tasarım deseninde; bu özel ifadelerin işlenmesi için hepsi aynı ara yüz veya abstract sınıfı uygulayan sınıflar tasarlanır. Interpreter tasarım deseni için Uml diyagramı aşağıdadır.

 

Uml diyagramından da anlaşılacağı üzere Interpreter tasarım deseninde 5 temel yapı bulunmaktadır.

  1. Context: İşlenilecek metin
  2. AbstractExpression: Context de ki anlam teşkil eden ifadeleri işleyecek sınıfların uygulaması gereken arayüz veya abstract sınıf.
  3. TerminalExpression: Eğer özel anlam ifade eden karakter tek başına bir anlam ifade ediyor ise yani kendinden önce veya sonra gelen karakterler ile bir bağlantısı olmadan yorumlanıyor ise bu sınıflar TerminalExression olarak ifade edilir. AbstractExpression nesnesini uygularlar.
  4. NonterminalExpression: TerminalExpression lar arasında “ve”  “eşittir” gibi birbirlerine bağlı olmaları veya aralarında işleme sokulması gibi durumlarda NonerminalExpression tipindeki sınıflar kullanılır. TerminalExpression - NonterminalExpression tipleri arasında da ilişki olabilir. NonterminalExpression sınıfları içerisinde AbstractExpression tipinde referans veya referanslar olmalıdır.
  5. Client: Context, TerminalExpression ve Nonterminal expression yapı ağaçlarını oluşturur ve çözümleme metodunu çalıştırır.

Şimdi interpreter tasarım deseni ile ilgili basit bir uygulama yapalım. Uygulamamız 16 lık sayı sisteminde verilen metni 10 lu sayı sistemine karşılığını versin. (Kodların uzamaması için sadece A B C değerlerini hesaplatalım.)

Uygulamamızın class diagramı aşağıdadır.

 

class Contex
{
    public string HexValue { get; set; }
    public int OndalikValue { get; set; }
}
 
interface ITerminalExpression
{
    void Interpret(Contex context);
}
 
class TerminalExpA : ITerminalExpression
{
    public void Interpret(Contex context)
    {
        if (context.HexValue.Contains("A"))
            context.OndalikValue += 10;
    }
}
 
class TerminalExpB : ITerminalExpression
{
    public void Interpret(Contex context)
    {
        if (context.HexValue.Contains("B"))
            context.OndalikValue += 11;
    }
}
 
class TerminalExpC : ITerminalExpression
{
    public void Interpret(Contex context)
    {
        if (context.HexValue.Contains("C"))
            context.OndalikValue += 12;
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        Contex c = new Contex { HexValue = "ABCABB" };
 
        List<ITerminalExpression> ExpList = new List<ITerminalExpression>();
 
        foreach (char item in c.HexValue.ToCharArray())
        {
            switch (item)
            {
                case 'A':
                    ExpList.Add(new TerminalExpA());
                    break;
                case 'B':
                    ExpList.Add(new TerminalExpB());
                    break;
                case 'C':
                    ExpList.Add(new TerminalExpC());
                    break;
                default:
                    throw new Exception("Geçersiz karakter " + item + " ...");
            }
        }
 
        foreach (ITerminalExpression item in ExpList)
        {
            item.Interpret(c);
        }
 
        Console.WriteLine(c.OndalikValue);
        Console.ReadKey();
    }
}
 
Uygulamamıdaki Context sınıfı işlenilecek değer ile ilgili verilerin tutulduğu, tasarım desenimizde ki Context yapısına karşılık gelen sınıftır. ITerminalExpression interface i  ile context de ki veriler üzerinde yorumlama yapabilecek sınıfların uygulaması gereken interface i tanımlamış olduk. Bu interface i uygulayan TerminalExpA, TerminalExpB, TerminalExpC sınıfları A,B ve C karakterlerini yorumlayan,  tasarım desenimizdeki TerminalExpression yapısına karşılık gelen sınıflardır. Program sınıfımız ise bu yapıyı kullanan, client yapısına karşılık gelmektedir. Main metodunda ilk önce işlenecek veriyi yani Context i oluşturuyoruz. Ardından Context deki veriyi işlemek için karakterlere göre ITerminalExpression interface i uygulayan  TerminalExpression yapısındaki sınıfları oluşturup generic list e ekliyoruz ve bu listedeki nesnelerin Interpreter metotlarını çağırıp Context in işlenmesini sağlıyoruz. Main metodunda ki TerminalExpression sınıflarının list e eklenmesi işlemi ve bu list deki sınıfların Interpreter metotlarının çağrılması işlemi metotlara bölünerek kod tekrarı yapılması engellenebilinir.
 
Örnek uygulamayı aşağıdaki linkden indirebilirsiniz.

InterpreterSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 1  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri