Interpreter Pattern একটি Behavioral Design Pattern যা সাধারণত ভাষা বা ভাষার সিনট্যাক্স বিশ্লেষণ করতে ব্যবহৃত হয়। এটি এমন ধরনের প্যাটার্ন যা একটি গ্রামার বা সিনট্যাক্স বিশ্লেষণ করতে সাহায্য করে, এবং একই ধরনের সমস্যা সমাধানে বিভিন্ন রুলস বা এক্সপ্রেশন ব্যবহার করে। Interpreter Pattern এর মূল উদ্দেশ্য হল একটি ভাষার জন্য ইন্টারপ্রেটার বা পার্সার তৈরি করা।
Interpreter Pattern এর উদ্দেশ্য:
- এটি একটি রুল বা এক্সপ্রেশন ভিত্তিক ডিজাইন প্যাটার্ন যা একটি ভাষা (যেমন গাণিতিক এক্সপ্রেশন বা সিনট্যাক্স) ব্যাখ্যা করতে সাহায্য করে।
- এটি সাধারণত এনএফএফএ (Expression Grammar) এবং অন্যান্য ভাষার ব্যবহৃত নিয়মগুলোকে কষ্টকর কাজের জন্য সহজে পরিণত করে।
Core Components of Interpreter Pattern:
- Abstract Expression: এটি একটি সাধারণ ইন্টারফেস প্রদান করে যা প্রতিটি এক্সপ্রেশন ক্লাস দ্বারা ইমপ্লিমেন্ট করা হয়।
- Terminal Expression: এটি একক এক্সপ্রেশন বা লেটার সিম্বল এবং গ্রামারের গুরুত্বপূর্ণ নিয়ম।
- Non-terminal Expression: এটি একাধিক এক্সপ্রেশন বা শাখার জন্য ব্যবহৃত হয় এবং এটি
AbstractExpressionকে ব্যবহার করে একটি কাঠামো তৈরি করে। - Context: এক্সপ্রেশনগুলির প্রক্রিয়াকরণের জন্য প্রয়োজনীয় ডেটা ধারণ করে।
Interpreter Pattern এর উদাহরণ: গাণিতিক এক্সপ্রেশন
ধরা যাক, আমাদের একটি গাণিতিক এক্সপ্রেশন যেমন 2 + 3 বা 5 * 3 + 2 ইন্টারপ্রেট করতে হবে। এই এক্সপ্রেশনগুলি ইন্টারপ্রেট করার জন্য Interpreter Pattern ব্যবহৃত হতে পারে। এখানে, আমরা একটি খুব সাধারণ ক্যালকুলেটর তৈরি করব যা +, -, *, / অপারেশন পরিচালনা করবে।
১. Abstract Expression Interface
interface Expression {
int interpret();
}
২. Terminal Expressions (সংখ্যা বা অপারেটর)
class Number implements Expression {
private int number;
public Number(int number) {
this.number = number;
}
@Override
public int interpret() {
return number;
}
}
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();
}
}
class Multiply implements Expression {
private Expression leftExpression;
private Expression rightExpression;
public Multiply(Expression left, Expression right) {
this.leftExpression = left;
this.rightExpression = right;
}
@Override
public int interpret() {
return leftExpression.interpret() * rightExpression.interpret();
}
}
class Divide implements Expression {
private Expression leftExpression;
private Expression rightExpression;
public Divide(Expression left, Expression right) {
this.leftExpression = left;
this.rightExpression = right;
}
@Override
public int interpret() {
return leftExpression.interpret() / rightExpression.interpret();
}
}
৩. Client Code (এন্টারপ্রেটার ব্যবহার করা)
public class InterpreterPatternTest {
public static void main(String[] args) {
// 5 + 3 - 2 * 10
Expression five = new Number(5);
Expression three = new Number(3);
Expression two = new Number(2);
Expression ten = new Number(10);
Expression add = new Add(five, three);
Expression multiply = new Multiply(two, ten);
Expression subtract = new Subtract(add, multiply);
System.out.println("Result: " + subtract.interpret()); // Output will be 5 + 3 - (2 * 10)
}
}
ব্যাখ্যা:
- Number ক্লাসটি একক সংখ্যা ধারণ করে এবং তার মান রিটার্ন করে।
- Add, Subtract, Multiply, এবং Divide ক্লাসগুলি Expression ইন্টারফেস ইমপ্লিমেন্ট করে, এবং তারা তাদের মধ্যে থাকা এক্সপ্রেশনগুলি থেকে ফলাফল বের করার জন্য তাদের ইন্টারপ্রেট মেথড ব্যবহার করে।
- InterpreterPatternTest ক্লাসে, আমরা
5 + 3 - (2 * 10)এই এক্সপ্রেশনটি তৈরি করেছি এবং তার ফলাফল প্রিন্ট করেছি।
আউটপুট:
Result: -9
এখানে, প্রথমে 5 + 3 = 8, তারপর 2 * 10 = 20, এবং পরে 8 - 20 = -9।
Interpreter Pattern এর সুবিধা:
- Simplicity in Expression Parsing:
- এক্সপ্রেশন পার্সিং বা ব্যাখ্যার জন্য খুবই সহজ এবং সহজে সম্প্রসারণযোগ্য।
- Easy to Maintain:
- নতুন এক্সপ্রেশন বা রুলস যোগ করা সহজ এবং পূর্ববর্তী কোডের সাথে সামঞ্জস্যপূর্ণ থাকে।
- Reusability:
- এক্সপ্রেশন এবং তাদের পার্সিং কোড পুনরায় ব্যবহার করা যায়, একাধিক প্রজেক্টে এটি কাজে আসতে পারে।
সারাংশ
Interpreter Pattern হলো একটি Behavioral Design Pattern যা বিভিন্ন ধরণের এক্সপ্রেশন (যেমন গাণিতিক, শর্তমূলক, বা ভাষাগত) ব্যাখ্যা বা পার্স করার জন্য ব্যবহৃত হয়। এটি মূলত Language Parsing বা Expression Evaluation এর জন্য ব্যবহৃত হয়। এই প্যাটার্নের মাধ্যমে, আপনি নতুন এক্সপ্রেশন রুল বা সিনট্যাক্স দ্রুত এবং কার্যকরীভাবে সংযোজন করতে পারেন এবং তাদের ব্যাখ্যা বা মূল্য নির্ধারণ করতে পারেন।
Key Takeaways:
- Interpreter Pattern জাভা প্রোগ্রামিং এ এক্সপ্রেশন বা ভাষা বিশ্লেষণের জন্য ব্যবহৃত হয়।
- এটি সাধারণত Syntax Parsing, Expression Evaluation, DSL (Domain-Specific Languages) ইত্যাদি ক্ষেত্রে ব্যবহৃত হয়।
- নতুন এক্সপ্রেশন রুলস যোগ করতে খুবই সুবিধাজনক এবং সিস্টেমের রক্ষণাবেক্ষণ সহজতর হয়।
Read more