معرفی الگوی طراحی Interpreter

معرفی الگوی طراحی Interpreter

مدت مطالعه : 4 دقیقه

31 فروردین 1402

الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرم‌افزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفه‌جویی در زمان و تولید کد های با کیفیت، توسعه‌پذیر و انعطاف‌پذیر استفاده می‌کنیم. در این مطلب قصد داریم الگوی طراحی Interpreter را معرفی کنیم.

الگوی طراحی مُفَسِر یا Interpreter یک الگوی طراحی رفتاری(Behavioral) است که راهی برای تفسیر جملات یا عبارات در یک زبان تعریف شده، ارائه می دهد. اگر درجایی از برنامه جملات و عبارات خاصی بکار گرفته شد و برای تجزیه تحلیل، درک و محاسبه آن جملات و عبارات به راهکاری نیاز داشتید، الگوی طراحی Interpreter یک الگوری مفید خواهد بود.

این الگو از اجزای زیر تشکیل شده است:

Abstract Expression: یک رابط(Interface) یا کلاس انتزاعی برای تمام عبارات در زبان تعریف می کند. این رابط معمولا دارای یک متد interpret است که در انواع عبارات اصلی پیاده سازی می شود.

Terminal Expression: یک پیاده سازی از رابط AbstractExpression است. این پیاده سازی نشان دهنده یک عنصر هسته ای در زبان تعریف شده است. یعنی این عبارت قابل تجزیه به بخش های ریز تر نیست. مثل متغیر های موجود در یک عبارت.

Non-terminal Expression: این مورد نیز یک پیاده سازی مشخص از رابط AbstractExpression است. این یک عنصر ترکیبی در زبان را نشان می دهد، مانند عبارتی که از چندین متغیر و عملگر تشکیل شده است.

Client: موجودیتی است که عبارت ورودی را ایجاد می کند و آن را برای ارزیابی به مفسر ارسال می کند.

 

الگوی Interpreter می تواند برای تعریف یک زبان برای یک دامنه خاص استفاده شود و راهی برای ارزیابی جملات یا عبارات در آن زبان ارائه می دهد. در مواقعی که نیاز به تجزیه و تفسیر ساختارهای داده یا عبارات پیچیده دارید، مانند کامپایلرها یا زبان های پرس و جو مفید است.

نمونه‌هایی از این الگو در برنامه‌های دنیای واقعی مواردی از جمله مفسر های پرس و جوی SQL، تطبیق‌ دهنده های regular expression و مفسر زبان های برنامه‌نویسی است. در ادامه با مثالی ساده این الگو را بهتر درک می‌کنیم.

فرض کنید می‌خواهیم یک ماشین حساب ساده بسازیم که بتواند چهار عمل اصلی جمع، تفریق، ضرب و تقسیم را انجام دهد. ما می توانیم از الگوی Interpreter برای نمایش این عبارات و ارزیابی آنها استفاده کنیم.

ابتدا رابط انتزاعی عبارات را تعریف می کنیم:

public interface IExpression
{
    int Interpret();
}

در مرحله بعد، عبارتی از دسته عبارات پایه که شامل عبارت های غیر قابل تجزیه به بخش های کوچک تر هستند را برای نمایش اعداد تعریف می کنیم:

public class NumberExpression : IExpression
{
    private readonly int _number;
    public NumberExpression(int number)
    {
        _number = number;
    }
    public int Interpret()
    {
        return _number;
    }
}

مشاهده می‌کنید که این عبارت که علت پایه ای بودن، عملیات خاصی برای تفسیر نیاز ندارد و فقط مقدار را برمی‌گرداند. سپس، چهار عبارت اصلی برای عملیات جمع، تفریق، ضرب و تقسیم تعریف می کنیم:

public class AddExpression : IExpression
{
   private readonly Expression _leftExpression;
   private readonly Expression _rightExpression;
   public AddExpression(Expression leftExpression, Expression rightExpression)
   {
       _leftExpression = leftExpression;
        _rightExpression = rightExpression;
   }
   public override int Interpret()
   {
       var leftOperand = _leftExpression.Interpret();
        var rightOperand = _rightExpression.Interpret();
        return leftOperand + rightOperand;
   }
}
public class SubtractExpression : Expression
{
//Similar to AddExpression Class
}
public class MultiplicationExpression : Expression
{
//Similar to AddExpression Class
}
public class DivisionExpression : Expression
{
//Similar to AddExpression Class
}

در نهایت، کد استفاده را که عبارات را ایجاد و به‌کارگیری می کند، تعریف می کنیم:


public static void Main()
{
// Create the expression tree: ((3 + (4 * 5)) - (6 / 2))
                var expression = new SubtractExpression(
                                new AddExpression(
                                                new NumberExpression(3),
                                                new MultiplicationExpression(
                                                                new NumberExpression(4),
                                                                new NumberExpression(5))),
                                new DivisionExpression(
                                                new NumberExpression(6),
                                                new NumberExpression(2)));
                // Evaluate the expression
                var result = expression.Interpret();
                Console.WriteLine($"Result: {result}");
}

در این مثال، ابتدا عبارتی ایجاد می‌کنیم که بیانگر عبارت 3+4*5-6/2 است و آن را با استفاده از متد Interpret محاسبه می‌کنیم. توجه داشته باشید که این یک مثال ساده است. از الگوی Interpreter می توان برای تعریف زبان ها و عبارات بسیار پیچیده تر استفاده کرد.

 

برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همه‌ی الگو های طراحی می‌شود، برای شما قرار گرفته است.

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

در چشم انداز همیشه در حال تحول توسعه نرم افزار، معماری میکروسرویس ها به دلیل مقیاس پذیری، انعطاف پذیری و توسعه پذیری محبوبیت قابل توجهی به دست آورده است. با این حال، با افزایش تعداد میکروسرویس ها در یک برنامه، مدیریت ارتباطات آنها و اطمینان از رؤیت صحیح همه آنها به طور فزاینده ای چالش برانگیز می شود. اینجاست که سرویس مش وارد عمل می شود.

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه