Saturday, March 9, 2024

ইন্টারপ্রেটার

কাদের জন্যঃ Object-oriented programming language সম্পর্কে ধারণা আছে এমন মানুষ।

যা প্রয়োজনঃclass,inheritance,composition,JavaScript সম্পর্কে পূর্ব ধারণা।

Interpreter:অক্ষর আর ধ্বনি নিয়ে হয় শব্দ আর অনেক শব্দ নিয়ে হয় বাক্য। আবার বাক্যে শব্দের ব্যবহার ,বাক্য গঠন , সময়/কাল অনুযায়ী বাক্যের ধরণ এসব বিষয় ঠিক করতে তৈরি করা হয়েছে ব্যাকরণ। কাজেই ভাষার ব্যাকরণটি বুঝতে পারলে আমরা বাক্যের অর্থ আর কোন কাল/সময়কে নির্দেশ করছে সেটি বুঝতে পারি। ঠিক তেমনিভাবে program লিখতে গিয়ে আমরা যদি তার ভেতরের ব্যাকরণগুলিকে সুনির্দিষ্ট করতে পারি এবং তা ব্যাখ্যা করবার জন্য কোন interpreter এর সাহায্য নেই তবে সেটি হয়ে দাঁড়ায় আমাদের Interpreter Design Pattern। উদাহরণে চিহ্ন দিয়ে ডানে/বামে যাবার দিক নির্দেশনা দেয়া হচ্ছে। যে চিহ্ন ব্যবহার করা হচ্ছে তার প্রত্যেকটিকে এক একটি নিয়ম/ব্যাকরণ হিসেবে ধরা যায়। এজন্য “->” এই নিয়মটি/ব্যাকরণকে ব্যাখ্যা করা হচ্ছে “ Go right” এবং “<-” এটিকে ব্যাখ্যা/interpret করা হচ্ছে “ Go left” হিসেবে। ABS class এই নিয়মগুলির একটি abstract class যার method হচ্ছে interpret() আর Right ও Left হচ্ছে তার implementation। Context class টিতে interpret() এ কোন ব্যাখ্যা বা interpretation যাবে তা দেয়া আছে যথাক্রমে right() ও left() নামক method দু'টিতে। Context class এর object এ একটি string variable দেয়া আছে যাকে বলা হবে ডান/বামে যাবার কথা। Client class এর object এ Context এর object আর string variable pass করা হচ্ছে ডান/বামের চিহ্ন বোঝানোর জন্য।ABS class টিতেও Context এর object pass করা হয়েছে। Client এ প্রথমে ABS class এর object গঠন করা হয়েছে ,পরে চিহ্ন/string variable অনুযায়ী প্রযোজ্য subclass এর object assign করা হয়েছে এবং তার interpret () কে invoke করা হয়েছে। এখানে Open-Closed Principle এর প্রয়োগ হচ্ছে। আমরা চাইলে "U" নামে (যার interpretation হচ্ছে "Make a U-turn") subclass যোগ করে ABS interface এর বিকাশ ঘটাতে পারি। Interpreter Design Pattern কে Behavioral Design Pattern এর দলে ফেলা হয়।

উদাহরণ:
class Context{
constructor(c){this.c=c;}
plain(c){return new Context(" ");}
special (c){return new Context(c);}
right(){
return this.c+" Go right";
}
left(){
return this.c+" Go left";
}
}
class ABS{
constructor(t){this.t=t;}
interpret(){
}
}
class Right extends ABS{
constructor(t){super(t);}
interpret(){
return this.t.right();
}
}
class Left extends ABS{
constructor(t){super(t);}
interpret(){
return this.t.left();
}
}
class Client{
constructor (c){
this.c=c;}
transInter(s){
var a=new ABS(this.c);
if(s=="->")
{
a=new Right(this.c);
return a.interpret ();
}
else if(s=="<-")
{
a=new Left(this.c);
return a.interpret ();
}
else{
return "Sorry, not defined.\n";
}
}
}
var c=new Context("w");
var a=new Client(c);
document.write(a.transInter("->"));

চেষ্টা করা যাক: একটি program লিখি যা একটি সংখ্যাকে decimal ও percentage এ প্রকাশ করবে। Context class এবার argument হিসেবে নিবে একটি integer আর method হিসেবে থাকবে decimal() আর percent() যেখানে decimal আর percent বের করবার নিয়ম দেয়া আছে । আর ABS class এর implementation হিসেবে Decimal ও Percentage নামের দুটি subclass থাকবে। যাদের interpret() মেথড থাকবে যেখান থেকে Context এর object এর মাধ্যমে প্রযোজ্য ব্যখ্যা কে call করা হবে। ABS class এ কিন্তু Context এর object দেয়া আছে। Client class ও Context এর object নিচ্ছে আর তার interpret() method একটি string variable নিচ্ছে argument হিসেবে যেটি “dec” বা “percent” নামক string এর সাথে মিলে গেলে প্রযোজ্য object গঠন করে interpret() method invoke করবে। নচেৎ “Sorry,not defined!” বার্তা দেখাবে।

কৃতজ্ঞতাঃ এই লেখা তৈরি করতে দরকারি তথ্য নেয়া হয়েছে Wikipedia, আকর বই "'Design Patterns:Elements Of Reusable Object-Oriented Software' by Eric Gamma,Richard Helm,Ralph Johnson and John Vlissides(Addisson-Wesley.1994)" ও আমার তৈরি করা নানা program থেকে।
মন্তব্য ও যোগাযোগঃ mrh4478@gmail.com

No comments:

Post a Comment