Interpreter design pattern'ini bir aptala anlatır gibi Java ile anlatır mısın?



Elbette, "Interpreter" tasarım desenini basit bir şekilde açıklayayım:


Interpreter tasarım deseni, bir dilin gramerini tanımlamak ve bu dilde yazılan ifadeleri işlemek için kullanılır. Bu desen, genellikle programlama dilleri, komut satırı yorumlayıcıları veya ayrıştırıcılar (parsers) geliştirirken kullanılır.


Java'da Interpreter desenini anlatmak için basit bir örnek yapalım:


Diyelim ki, çok basit bir matematiksel işlem dili oluşturuyorsunuz. Bu dilde sadece toplama ve çıkarma işlemleri yapılıyor. Bu dili yorumlamak için Interpreter desenini kullanabiliriz.


Expression Interface: Öncelikle, tüm ifadelerin uygulaması gereken bir interface tanımlayalım. Bu interface, ifadenin nasıl değerlendirileceğini (evaluate) tanımlar.


java

Copy code

interface Expression {

    int interpret();

}

Terminal Expression: Sonra, sayıları temsil eden bir sınıf oluştururuz. Bu sınıf Expression interface'ini uygular ve interpret metodunda kendisini döndürür.


java

Copy code

class Number implements Expression {

    private int number;


    public Number(int number) {

        this.number = number;

    }


    @Override

    public int interpret() {

        return number;

    }

}

Non-terminal Expression: Şimdi, toplama ve çıkarma işlemlerini temsil eden sınıfları oluşturalım. Bu sınıflar da Expression interface'ini uygular ve interpret metodunda sol ve sağ ifadelerin sonuçlarını toplar veya çıkarır.


java

Copy code

class Add implements Expression {

    private Expression leftExpression;

    private Expression rightExpression;


    public Add(Expression left, Expression right) { 

        this.leftExpression = left; 

        this.rightExpression = right;

    }


    @Override

    public int interpret() {

        return leftExpression.interpret() + rightExpression.interpret();

    }

}


class Subtract implements Expression {

    private Expression leftExpression;

    private Expression rightExpression;


    public Subtract(Expression left, Expression right) {

        this.leftExpression = left;

        this.rightExpression = right;

    }


    @Override

    public int interpret() {

        return leftExpression.interpret() - rightExpression.interpret();

    }

}

Client: Son olarak, bu ifadeleri kullanarak bir cümleyi yorumlayan bir client oluştururuz. Bu örnekte, basit bir ifadeyi parse edip değerlendiririz.


java

Copy code

public class InterpreterDemo {

    public static void main(String[] args) {

        Expression islem = new Add(new Number(5), new Subtract(new Number(10), new Number(3)));

        System.out.println(islem.interpret()); // 5 + (10 - 3) = 12

    }

}

Bu örnek, Interpreter tasarım deseninin temel bir uygulamasını gösterir. Gerçek dünyada, bu desen daha karmaşık diller ve gramatik yapılar için genişletilebilir.


Avantajları ve kullanım alanları


Interpreter tasarım deseninin avantajları ve kullanım alanları şu şekilde özetlenebilir:


Avantajları

Esneklik: Interpreter deseni, yeni yorumlama kuralları eklemeyi kolaylaştırır. Böylece dilinizi genişletmek istediğinizde, mevcut kod yapısını büyük ölçüde değiştirmeniz gerekmez.


Yeniden Kullanılabilirlik: Desen, ifadeleri ayrı sınıflar halinde tanımlar, böylece bu ifadeleri farklı bağlamlarda yeniden kullanabilirsiniz.


Okunabilirlik ve Bakım: Kod, genellikle dilin gramerine benzer şekilde yapılandırıldığı için okunabilir ve bakımı yapılırken gramerin anlaşılması kolaylaşır.


Genişletilebilirlik: Dilin gramerini genişletmek, yeni sınıflar ekleyerek ve mevcut olanları değiştirmeden yapılabilir, bu da sistemin genişletilebilirliğini artırır.


Kullanım Alanları

Programlama Dili Yorumlayıcıları: Özel amaçlı küçük programlama dilleri veya betik dilleri için yorumlayıcılar oluşturmak.


SQL ve Sorgu Dilleri: Veritabanı sorgulama dillerinin yorumlanması ve işlenmesi.


Komut Satırı Yorumlayıcıları: Komut satırı araçları için komutların yorumlanması ve işlenmesi.


Konfigürasyon Dosyaları: Yazılım ayarlarını tanımlayan konfigürasyon dosyalarının okunması ve yorumlanması.


Sembolik Matematik Sistemleri: Matematiksel ifadelerin ve formüllerin işlenmesi için.


Dil Tabanlı Araçlar: Kod biçimlendirme, sözdizimi vurgulama veya dil tabanlı araçların geliştirilmesi.


Interpreter deseninin avantajları, esnek ve modüler bir yaklaşım sunarken, dezavantajı olarak performans sorunları ve karmaşık gramatik yapılar için uygun olmaması gösterilebilir. Karmaşık dilleri işlemek için daha gelişmiş ayrıştırma tekniklerine ihtiyaç duyulabilir.


Önceki örneğe bir Context sınıfı ekleyerek nasıl kullanılabileceğini göstereceğim. Context sınıfı, yorumlama işlemi sırasında gerekli olabilecek ekstra bilgileri saklayacak. Bu örnekte, Context sınıfını, değişkenlerin değerlerini saklamak için kullanabiliriz.


Önce Context sınıfını tanımlayalım ve daha sonra önceki örneğimizi bu yeni sınıfı kullanacak şekilde güncelleyelim:


Context Sınıfı: Bu sınıf, değişkenlerin değerlerini saklar ve yorumlayıcının bu değerlere erişmesine olanak tanır.


java

Copy code

import java.util.HashMap;

import java.util.Map;


class Context {

    private Map<String, Integer> variables;


    public Context() {

        variables = new HashMap<>();

    }


    public void setVariable(String name, int value) {

        variables.put(name, value);

    }


    public int getVariable(String name) {

        return variables.getOrDefault(name, 0);

    }

}

Interpreter Sınıflarını Güncelleme: Şimdi, Number sınıfını değişkenleri de destekleyecek şekilde güncelleyelim. Eğer bir değişken ismi verilirse, Context'ten değerini alacak.


java

Copy code

class Variable implements Expression {

    private String name;


    public Variable(String name) {

        this.name = name;

    }


    @Override

    public int interpret(Context context) {

        return context.getVariable(name);

    }

}

Diğer ifadeleri (Add, Subtract vb.) Context'i kullanacak şekilde güncelleyelim:


java

Copy code

class Add implements Expression {

    // ... aynı kalır, sadece interpret metodunu güncelleyin


    @Override

    public int interpret(Context context) {

        return leftExpression.interpret(context) + rightExpression.interpret(context);

    }

}


class Subtract implements Expression {

    // ... aynı kalır, sadece interpret metodunu güncelleyin


    @Override

    public int interpret(Context context) {

        return leftExpression.interpret(context) - rightExpression.interpret(context);

    }

}

Aynı zamanda, Expression interface'ini güncelleyelim:


java

Copy code

interface Expression {

    int interpret(Context context);

}

Client Kullanımı: Son olarak, Context'i kullanarak bir ifadeyi yorumlayalım:


java

Copy code

public class InterpreterDemo {

    public static void main(String[] args) {

        Context context = new Context();

        context.setVariable("x", 5);

        context.setVariable("y", 10);


        Expression expression = new Add(new Variable("x"), new Subtract(new Variable("y"), new Number(3)));

        System.out.println(expression.interpret(context)); // 5 + (10 - 3) = 12

    }

}

Bu kod, Context sınıfının nasıl kullanılacağını gösterir. Burada Context, değişkenlerin değerlerini saklar ve interpret metoduna bu değerlerin nasıl alınacağını söyler. Bu yaklaşım, yorumlayıcının esnekliğini ve kullanım kolaylığını artırır.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال