Thursday, March 28, 2024

প্রোটোটাইপ

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

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

Prototype: এটি Creational Design Pattern দলের। এর মাধ্যমে আনকোড়া নতুন object তৈরির বদলে আগে থেকে বিদ্যমান object এর copy তৈরি করা হয়। আর copy করার কাজটি করা হয় clone() এর সাহায্যে। যখন নতুন object তৈরি করা বেশ সময় সাপেক্ষ তখন এই pattern বেশ কাজে দেয়।Subclass নির্ভরতা কমিয়ে নতুন behavior যোগ করতে এবং runtime এ প্রয়োজন অনুযায়ি object তৈরি করতে এই pattern বেশ কাজে দেয়। উদাহরণে Cycle তৈরির জন্য যেসব Parts এর দরকার হয় তার Prototype আগে থেকে তৈরি করে রেখে একেবারে runtime এ Cycle object তৈরির সময় এদেরকে ব্যবহার করা হয়েছে। এখানে Parts হচ্ছে Prototype interface আর Cycle, Wheel,Frame ও BackSeat হচ্ছে এর implementation । এদের সবার clone() নামক method আছে যা ঐ class এর instance/object তৈরি করে return করছে। Cycle class এ addWheel(),addFrame() ও addBackSeat() নামক method গুলো ঐ objectকে জুড়ে দেবার কাজ করছে। CycleFact হল Cycle object assemble করার interface আর ProtoFact হচ্ছে এর implementation। ProtoFact এর method গুলোর (getWheel(),getFrame() ইত্যাদি) মাধ্যমে যেসব objects কে ProtoFact এ argument হিসেবে pass করা হয়েছিল তাদেরকে clone() করে copy করা হচ্ছে ।Cycle আমরা কেমন চাই-- Back seat সহ না Back seat ছাড়া --তার উপর নির্ভর করে আমরা runtimeএ প্রয়োজন অনুযায়ি argument দিতে পারি ProtoFact এ। এজন্য ProtoFact এ দু'ধরণের constructor রয়েছে। Runtimeএ এটি না করলে আমাদের Factory method এর মত CycleWithBackSeat এবং CycleNoBackSeat নামে আলাদা subclass তৈরি করতে হত। এই Prototype pattern ব্যবহারের ফলে আমাদের Subclassing এর উপর বেশি নির্ভর করতে হচ্ছে না আর আমরা runtime এ দরকার অনুযায়ি object যোগ/বাদ দিতে পারছি। যেমন: BackSeat দরকার নেই বলে এর object আমরা runtime-এ ProtoFact এ argument হিসেবে দেইনি।উদাহরণে Back seat ছাড়া Cycle assemble করা হয়েছে।

উদাহরণ:
class Parts{
constructor(){}
clone(){}
des(){document.write("Parts");}
}
class Wheel extends Parts{
constructor(){super();}
clone(){return new Wheel(this);}
des(){document.write("Wheel");}
}
class Frame extends Parts{
constructor(){super();}
clone(){return new Frame(this);}
des(){document.write("Frame & seat");}
}
class BackSeat extends Parts{
constructor(){super();}
clone(){return new BackSeat(this);}
des(){document.write("Back seat");}
}
class Cycle extends Parts{
w=null;
f=null;
b=null;
constructor(){super();}
addWheel(w){this.w=w;}
addFrame(f){this.f=f;}
addBackSeat(b){this.b=b;}
clone(){return new Cycle(this);}
des(){document.write("Cycle:");
this.w.des();
this.f.des();
this.b.des();
}
}
class CycleFact{
constructor(){}
makeCycle(){ return new Cycle();}
getBackSeat(){return new BackSeat();}
getFrame(){return new Frame();}
getWheel(){return new Wheel();}
}
class ProtoFact extends CycleFact{
constructor(c,w,f,b){super();
this.c=c;this.w=w; this.f=f;this.b=b;}
static trio(c,w,f,b){
return new ProtoFact(c,w,f,null);
}
static whole(c,w,f,b){
return new ProtoFact(c,w,f,b);
}
makeCycle(){ return this.c.clone();}
getBackSeat(){return this.b.clone();}
getFrame(){return this.f.clone();}
getWheel(){return this.w.clone();}
}
var p=new ProtoFact(new Cycle (),new Wheel(),new Frame());
var a=p.makeCycle();
var w=p.getWheel();
var f=p.getFrame();
a.addWheel(w);
a.addFrame(f);
a.des();

চেষ্টা করা যাক:Progrgram টি আবার লিখি। এবার Cycle এ Back seat থাকবে। দরকারি পরিবর্তন যোগ করি।

কৃতজ্ঞতাঃ এই লেখা তৈরি করতে দরকারি তথ্য নেয়া হয়েছে 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