یکی از الگوهایِ Behavioral الگویِ Interpreter یا مفسر هست ، کاری که در این الگو انجام میشه از اسمش مشخصه ، تفسیر ! ما قراره عواقدِ زبانی رو در کد مشابه سازی کنیم ، یعنی یک عبارت رو به عبارت دیگه تفسیر کنیم ، مثلا "کیلوگرم" رو به "پوند" تفسیر کنیم . در این الگو چند بخش داریم :
کلیه اطلاعاتی که در عملیات تفسیر ما نیاز هستند رو در خودش داره و در صورت لزوم توابعِ مورد نیازی رو برای Expression ها داره
یک interface یا abstract class که تابعی به نام interpret رو تعریف میکنه و باقی کلاسهای مشتق شده ازش باید اونو override کنند ، ما دو نوع Expression داریم ، Terminal و NonTerminal ، اگه درس نظریه زبان یا درس کامپایلر رو در دانشگاه خونده باشید احتمالا فهمیدید میخوام چی بگم ، Terminal مقادیر ما (مثلا a و b و ...) و NonTerminal عملوندها (مثلا + و - و ...) هستند ، این دو از Expression ارث میبرند .
نکته : یکی از مهمترین کاربردهای این الگو در SQL و تفسیر کردن اون هست
فرض کنید یک جمله به فرم "a * b" داریم ، * میتونه + یا - باشه و a و b هم عدد هستند ، یک مدل ایجاد میکنیم که حاصلِ عبارت رو به ما بده .
توجه : مثال ما به شدت ساده است وگرنه اگه بیشتر از چند جمله بود باید از پشته برای حل مساله استفاده میکرد ، به صورت کلی از الگویِ Interpreter برای درست کردن گرامرِ زبان استفاده میکنند و شما با توجه به نوع گرامرتون باید الگوی خودتون رو درست کنید ، در اینجا چون صرفا قرار بوده جمع و تفریق رو حساب کنیم لزوم به پیچیدگی بیش از حدی نبود
مساله بسیار ساده است و تمامِ کد رو در یک فایل قرار میدیم :
سه نوع Expression داریم ، یکی عدد یکی جمع یکی تفریق ، وقتی شما از جمع یا تفریق استفاده میکنید دو Expression رو باید به عنوان ورودی بدید ، Expression سمت چپ و Expression سمتِ راستِ علامت ، شما در interpret ای که در این دو override کردید ، interpret دو Expression ورودی رو قرار میدید ، در مثال ما دو Expression لزوما از نوع Terminal هستند که در حالت کلی این طور نیست و باید از Stack یا پشته استفاده کرد ، در Terminal با استفاده از context رشته مورد نظر رو به صورت عدد صحیح درمیاره و در نهایت تفریق و جمع رو خواهیم داشت :
شاید برای شما همچنان این مساله گنگ باشه که چطوری گرامرهای دیگه رو با استفاده از این الگو پیاده کنیم ، برای همین یک مثال توضیحی دیگه هم میدم (نه کدی) ، فرضا اگه همون SQL رو بخواید پیاده سازی کنید نیاز به Expression هایی مثل SELECT و FROM و ... دارید ، هر کدوم از این Expression یک Expression دیگه نیاز داره ، مثلا وقتی بخواید SELECT کنید باید از یک Table به وسیله FROM اون رو بخونید پس در ورودی FROM بهش میدید و در override تابع interpret باید از from استفاده کنید و الی آخر .
باقی مقالات در مورد الگویهای طراحی رو در این مقاله بخونید .
من رو در لینکدین و اینستاگرام دنبال کنید ???
اگه دوست داشتید میتونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???