Understanding the Interpreter Design Pattern

3 min read

Interpreter Pattern là gì?

Interpreter Pattern là một trong những Pattern thuộc nhóm hành vi (Behavior Pattern).

Interpreter nghĩa là thông dịch, thông quan Interpreter chúng ta có thông dịch một mô tả đối tượng thành một đối tượng động với đúng mô tả đó.

Interpreter Pattern có hạn chế về phạm vi áp dụng. Mẫu này thường được sử dụng để định nghĩa bộ ngữ pháp đơn giản (grammar), trong các công cụ quy tắc đơn giản (rule), …

Cài đặt Interpreter Pattern

Đây là thiết kế đơn giản cho một Interpreter Pattern tôi sẽ song song giải thích từng phần nhưng trước đó hãy cùng đưa ra một bài toán đơn giản.

Từ chuỗi một chuỗi tính toàn bất kì như “5 + 3 – 2” hãy biến nó thành một phép tính hoàn chỉnh.

Bắt đầu xây dựng từng thành phần một:

Expression : là một interface hoặc abstract class, định nghĩa phương thức interpreter chung cho tất cả các node trong cấu trúc cây phân tích ngữ pháp. Expression được biểu diễn như một cấu trúc cây phân cấp, mỗi implement của Expression có thể gọi một node.

Bài toán của chúng ta yêu cầu thực hiện từng phép tính một nên tôi cần một function chung trả kết quả về một int.

// Abstract Expression
interface Expression {
    int interpret();
}

TerminalExpression (biểu thức đầu cuối): cài đặt các phương thức của Expression, là những biểu thức có thể được diễn giải trong một đối tượng duy nhất, chứa các xử lý logic để đưa thông tin của context thành đối tượng cụ thể.

Chúng ta sẽ bắt đầu từ đơn vị nhỏ nhất biến các text trong string kia thành số xử lý được

// Terminal Expression (concrete class for numbers)
class Number implements Expression {
    private int number;

    public Number(int number) {
        this.number = number;
    }

    @Override
    public int interpret() {
        return number;
    }
}

NonTerminalExpression (biểu thức không đầu cuối): cài đặt các phương thức của Expression, biểu thức này chứa một hoặc nhiều biểu thức khác nhau, mỗi biểu thức có thể là biểu thức đầu cuối hoặc không phải là biểu thức đầu cuối. Khi một phương thức interpret() của lớp biểu thức không phải là đầu cuối được gọi, nó sẽ gọi đệ quy đến tất cả các biểu thức khác mà nó đang giữ.

Từ các biểu thức đầu cuối hãy sử dụng biểu thức không đầu cuối để tương tác và xây dựng các phép tính với nó

// Non-terminal Expression (concrete class for addition)
class Add implements Expression {
    private Expression left;
    private Expression right;

    public Add(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret() {
        return left.interpret() + right.interpret();
    }
}

// Non-terminal Expression (concrete class for subtraction)
class Subtract implements Expression {
    private Expression left;
    private Expression right;

    public Subtract(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret() {
        return left.interpret() - right.interpret();
    }
}

Client : đại diện cho người dùng sử dụng lớp Interpreter Pattern. Client sẽ xây dựng cây biểu thức đại diện cho các lệnh được thực thi, gọi phương thức interpreter() của node trên cùng trong cây, có thể truyền context để thực thi tất cả các lệnh trong cây.

// Client Code
public class InterpreterPatternExample {
    public static void main(String[] args) {
        // "5 + 3 - 2" biểu thức
        Expression five = new Number(5);
        Expression three = new Number(3);
        Expression two = new Number(2);

        Expression add = new Add(five, three); // 5 + 3
        Expression subtract = new Subtract(add, two); // (5 + 3) - 2

        System.out.println("Result: " + subtract.interpret()); // Output: 6
    }
}

Lợi ích của Interpreter Pattern là gì

  • Dễ dàng thay đổi và mở rộng ngữ pháp. Vì mẫu này sử dụng các lớp để biểu diễn các quy tắc ngữ pháp, chúng ta có thể sử dụng thừa kế để thay đổi hoặc mở rộng ngữ pháp. Các biểu thức hiện tại có thể được sửa đổi theo từng bước và các biểu thức mới có thể được định nghĩa lại các thay đổi trên các biểu thức cũ.
  • Cài đặt và sử dụng ngữ pháp rất đơn giản. Các lớp xác định các nút trong cây cú pháp có các implement tương tự. Các lớp này dễ viết và các phân cấp con của chúng có thể được tự động hóa bằng trình biên dịch hoặc trình tạo trình phân tích cú pháp.

Link tham khảo

https://viblo.asia/p/interpreter-design-pattern-tro-thu-dac-luc-cua-developers-djeZ1d43KWz

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *