Ali Shobeyri
Ali Shobeyri
خواندن ۳ دقیقه·۴ سال پیش

الگویِ طراحیِ Interpreter (جاوا و کاتلین)

یکی از الگوهایِ Behavioral الگویِ Interpreter یا مفسر هست ، کاری که در این الگو انجام میشه از اسمش مشخصه ، تفسیر ! ما قراره عواقدِ زبانی رو در کد مشابه سازی کنیم ، یعنی یک عبارت رو به عبارت دیگه تفسیر کنیم ، مثلا "کیلوگرم" رو به "پوند" تفسیر کنیم . در این الگو چند بخش داریم :

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

Context

کلیه اطلاعاتی که در عملیات تفسیر ما نیاز هستند رو در خودش داره و در صورت لزوم توابعِ مورد نیازی رو برای Expression ها داره

Expression - TerminalExpression - NonTerminalExpression

یک interface یا abstract class که تابعی به نام interpret رو تعریف می‌کنه و باقی کلاس‌های مشتق شده ازش باید اونو override کنند ، ما دو نوع Expression داریم ، Terminal و NonTerminal ، اگه درس نظریه زبان یا درس کامپایلر رو در دانشگاه خونده باشید احتمالا فهمیدید می‌خوام چی بگم ، Terminal مقادیر ما (مثلا a و b و ...) و NonTerminal عملوند‌ها (مثلا + و - و ...) هستند ، این دو از Expression ارث می‌برند .

نکته : یکی از مهم‌ترین کاربرد‌های این الگو در SQL و تفسیر کردن اون هست

صورت مساله

فرض کنید یک جمله به فرم "a * b" داریم ، * می‌‌‌تونه + یا - باشه و a و b هم عدد هستند ، یک مدل ایجاد می‌کنیم که حاصلِ عبارت رو به ما بده .

توجه : مثال ما به شدت ساده است وگرنه اگه بیشتر از چند جمله بود باید از پشته برای حل مساله استفاده می‌کرد ، به صورت کلی از الگویِ Interpreter برای درست کردن گرامرِ زبان استفاده می‌کنند و شما با توجه به نوع گرامرتون باید الگوی خودتون رو درست کنید ، در اینجا چون صرفا قرار بوده جمع و تفریق رو حساب کنیم لزوم به پیچیدگی بیش از حدی نبود

مساله بسیار ساده است و تمامِ کد رو در یک فایل قرار می‌دیم :

https://gist.github.com/sasssass/85e7532558fa85296d358285cf44486f

سه نوع Expression داریم ، یکی عدد یکی جمع یکی تفریق ، وقتی شما از جمع یا تفریق استفاده می‌کنید دو Expression رو باید به عنوان ورودی بدید ، Expression سمت چپ و Expression سمتِ راستِ علامت ، شما در interpret ای که در این دو override کردید ، interpret دو Expression ورودی رو قرار می‌دید ، در مثال ما دو Expression لزوما از نوع Terminal هستند که در حالت کلی این طور نیست و باید از Stack یا پشته استفاده کرد ، در Terminal با استفاده از context رشته مورد نظر رو به صورت عدد صحیح درمیاره و در نهایت تفریق و جمع رو خواهیم داشت :

https://gist.github.com/sasssass/ff7d7960ac2be8de516121b80cf2b0b7
شاید برای شما همچنان این مساله گنگ باشه که چطوری گرامرهای دیگه رو با استفاده از این الگو پیاده کنیم ، برای همین یک مثال توضیحی دیگه هم میدم (نه کدی) ، فرضا اگه همون SQL رو بخواید پیاده سازی کنید نیاز به Expression هایی مثل SELECT و FROM و ... دارید ، هر کدوم از این Expression یک Expression دیگه نیاز داره ، مثلا وقتی بخواید SELECT کنید باید از یک Table به وسیله FROM اون رو بخونید پس در ورودی FROM بهش میدید و در override تابع interpret باید از from استفاده کنید و الی آخر .

باقی مقالات در مورد الگوی‌های طراحی رو در این مقاله بخونید .

من رو در لینکدین و اینستاگرام دنبال کنید ???

اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???


جاوااندرویدکاتلینdesign patternدیزاین پترن
برنامه نویس اندروید - https://www.linkedin.com/in/iryebohs/
شاید از این پست‌ها خوشتان بیاید