الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرمافزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفهجویی در زمان و تولید کد های با کیفیت، توسعهپذیر و انعطافپذیر استفاده میکنیم. در این مطلب قصد داریم الگوی طراحی 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 می توان برای تعریف زبان ها و عبارات بسیار پیچیده تر استفاده کرد.
برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همهی الگو های طراحی میشود، برای شما قرار گرفته است.
من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که مینویسم بدردتون بخوره.
ثبت دیدگاه