ডিজাইন প্যাটার্নের শুরু হোক বাংলায় – Facade

ডিজাইন প্যাটার্ন নিয়ে বকবক করার সিদ্ধান্ত নেয়ার পেছনে কারণ অনেক। অদ্ভুত হলেও সত্য সি.এস.ই. গ্র্যাজুয়েট দের এই বস্তুটা কারিকুলাম এ নাই। OOP শিখিয়ে এটা না শিখানো ঠিক কতটা যক্তিযুক্ত আমি জানিনা।
কথা নাই বার্তা নাই Facade নিয়ে হঠাং ব্লগবক শুরু করার যৌক্তিক কারণ না থাকলেও ঐতিহাসিক কারণ বিদ্যমান। জীবনে এক মহাপুরুষ (নাম বলা যাবেনা :P) এর সাথে সাক্ষাৎ আমার হয়েছিলো। তার মুখেই প্রথম এটার নাম শোনা। তখনো বুঝিনাই উনি কি বলছিলেন। আজ বুঝলাম, তা্ই লিখতে বসা আর কি।
আমার এই টিউটোরিয়াল পড়ার আগে আপনার কি কি জানা দরকার দেখে নিন:

১. OOP এর উপর সাধারন ধারনা। ডিজাইন প্যাটার্ন কি তার সম্পর্কে হালকার উপর ঝাপসা থাকলেই চলবে। এগুলো এখন বলতে ইচ্ছুক নই। সি শার্পের গোড়া থেকে যে সিরিজটা শুরু করবো সেটায় চোখ রাখলেই হবে। 😀

২. সি শার্প এর উপর কাজ চালানোর মতো জ্ঞান, অন্য কোন ল্যাংগুয়েজ জানলেই হবে। সিনট্যাক্স থেকে স্ট্রাকচার আন্দাজ করতে পারলেই চলবে।

৩. আমার ব্লগবক সহ্য করার ধৈর্য।

তো শুরু করা যাক। এই টিউটোরিয়াল সম্পূর্নই বাংলায় তার কারণ বাংলায় কোন কিছু বোঝা বাঙালির জন্যে সোজা। আর তেমন কোন কারণ নাই। আমার কোড গুলো নেট থেকেই সংগৃহীত। কপিরাইটে ফাঁসাবেন না ভাই..

আগে বলি কেন Facade দরকার। একটা টিমে একজন ক্যাপ্টেন থাকে যার কাজ বাকিরা কে কি করবে বলে দেয়া, সবার নিয়ন্ত্রণ রাখা, দায়ভার স্বীকার করা। মানে সহজ বাংলা কথায় সব শরীরে ঘাড়ের উপর একটা মাথা থাকবেই। যদি এমন কোন সিস্টেম দাঁড় করানো যায় যেটা সবার খেয়াল রাখবে। এমন একটা ক্লাস যেটা সবার খেয়াল রাখবে । সব সিস্টেমের মন ভালো করে দেবে (বেশি হয়ে গেলো রে :P)

Facade এ যেটা হয় সেটা হচ্ছে একটা class বাকি সব subsystem কে control করে। গুলিয়ে যাচ্ছে এই তো? আচ্ছা সহজ করে বলি। মনে করুন আপনার একটি ফুড শপ আছে। ফুড শপের তিনটি আলাদা টাইপের বার্গারের শেফ তিন জন (হে হে, মাথা খারাপ হইলে যা হয় আর কি)। আপনি বসে আছ্নে ফুড কোর্টের অর্ডার টার্মিনালে। লোকজন তাহলে অবশ্যই আপনার কাছে এসেই খাবার চাইবে। আপনি ভালো করেই জানেন কোন বার্গারের শেফ কে। সুতরাং আপনার জন্য খুবই সোজা ঠিক করা কোন অর্ডার কোন শেফের কাছে যাবে। এই সহজ ব্যাপারটুকু যদি আপনি বুঝে থাকেন জেনে রাখুন প্রোগ্রামিং জানুন আর নাই জানুন আপনি Facade ঠিকই বুঝে গেছেন। সেই হিসেবে আপনি এখানে Facade এবং আপনার তিন শেফ হচ্ছে আপনার Subsystem.

অনেক ব্লগবক করলাম। কাজের কথায় আসি। তাহলে কোড শুরু করা যাক।

প্রশ্ন হতে পারে আমি কাকে দিয়ে শুরু করবো। আসলে সত্যি বলতে আমিও জানিনা্। আমি সহজ ভাষায় একজন Duct tape কোডার। দেখি সফল হতে পারি কিনা সবাইকে কিছু বোঝাতে। UML দেখানো উচিত ছিলো। আর না হয় না্ই গেলাম ওইদিকে। যাদের টার্গেট করে এই লাইনগুলো লিখছি তারা বুঝলেই আমি খুশি। 😀

তো একটা facade based system তৈরী করতে হলে আপনার লাগছে একটি Facade class এবং এক বা একাধিক Subsystem । আজকের উদাহরণের জন্য আমি ব্যবহার করছি একটি সি শার্প কনসোল অ্যাপ্লিকেশন। যেহেতু প্রথম টিটু লিখছি সি শার্পের জন্য আমি কিঞ্চিৎ অপ্রস্তুত। আশা করি পরবর্তীতে আরো ভালো উদাহরন উপহার দিতে পারবো। আজকের টিউটোরিয়ালের জন্য:

Facade : FoodShopManager

SubSystems: Chef_ChickenBurger, Chef_VegiBurger

প্রথমে আসুন সাবসিস্টেম গুলো চিনে নেই। মনে করুন আপনার ফুড শপে দুইজন Chef । একজন Chicken Burger এর জন্য আর অপরজন Vegi Burger এর জন্য। মনে করুন আপনার দুই শেফের জন্য দুইটি Subsystem তৈরী হয়েছে। এদের দুটি দেখতে নিচের মতো:

Class Chef_ChickenBurger হবে এরকম:


internal class Chef_ChickenBurger
 {
 internal string OrderRecieved()
 {
 return "Order recieved of Chicken Burger\n";
 }

internal string MakeBunsReady()
 {
 return "Making Buns Ready\n";
 }

internal string HereGoesTheChicken()
 {
 return "Chicken is in, awesomeness inside\n";
 }

internal string PerpareDressings()
 {
 return "The burger looks beautiful\n";
 }

internal string ReadyToServe()
 {
 return "Chicken burger is ready to serve\n";
 }
 }

আসলেই হাস্যকর, যাই হোক বুঝতে পারলেই হলো। মেথডগুলো শুধুমাত্র কাজ বোঝানোর জন্যই। তাহলে Chef_VegiBurger  হবে দেখতে এরকম:

 internal class Chef_VegiBurger
 {
 internal string OrderRecieved()
 {
 return "Order recieved of Vegitable Burger\n";
 }

internal string SliceAndDiceTomatoes()
 {
 return "Slicing and Dicing Tomatoes\n";
 }

internal string PrepareTheVegi()
 {
 return "The Vegi burger is on the way...blah blah\n";
 }

 internal string ReadyToServe()
 {
 return "Vegi Burger is ready to serve\n";
 }
 }

দুটো Subsystem তাহলে আমাদের পাওয়া শেষ। এবার আসি Facade এ। আগেই বলেছি ফুডশপের ম্যানেজার ই হচ্ছেন Facade। তাহলে..

public static class FoodShopManager
 {
 static Chef_ChickenBurger chef_ChickenBurger=new Chef_ChickenBurger();
 static Chef_VegiBurger chef_VegiBurger=new Chef_VegiBurger();

public static void OrderChickenBurger()
 {
 Console.WriteLine(chef_ChickenBurger.OrderRecieved() +
 chef_ChickenBurger.MakeBunsReady() +
 chef_ChickenBurger.HereGoesTheChicken() +
 chef_ChickenBurger.PerpareDressings()+
 chef_ChickenBurger.ReadyToServe());

}

public static void OrderVegiBurger()
 {
 Console.WriteLine(chef_VegiBurger.OrderRecieved() +
 chef_VegiBurger.SliceAndDiceTomatoes() +
 chef_VegiBurger.PrepareTheVegi() +
 chef_VegiBurger.ReadyToServe());
 }
 }

আসল কথাগুলো এখানেই, লক্ষ্য করে দেখুন, Facade Class টিতে আপনার দুজন শেফ এর ই দুটি Static Object তৈরী করা হয়েছে। এটি অবশ্য জরুরী নয়, পুরোটাই অনেকাংশে আপনার উপর নির্ভর করছে কি করে Structure টা দাঁড় করাবেন, মূল বিষয় ঠিক থাকাই বাঞ্ছনীয়।

আমরা এখানে দুটো ডামি মেথড দাঁড় করিয়েছি। একটি OrderChickenBurger এবং অপরটি OrderVegiBurger। দুটো মেথডের নামই আপনাকে বলে দেবে এদের কাজ। (আমার মতো একটু আধটু খেতে ভালোবাসলে আর কিছুই বলা লাগবেনা)।

খেয়াল করে দেখুন, Facade ক্লাসটি নিজেই তার Subsystem এর অবজেক্টগুলোর (chef_VegiBurger এবং chef_ChickenBurger ) মেথড নিজের মেথডের ভেতর থেকে Invoke করেছে। Subsystem গুলোকে আলাদা কোন Control দেয়নি। অবশ্য একটি Subsystem কে আপনি আবার অন্য একটি Subsystem গ্রুপের Facade হিসেবে ব্যবহার করতে পারেন।

তাহলে একটি Facade ই যখন Subsystem গুলোর সবকিছু দেখছে তখন Main এ শুধুমাত্র Facade এর মেথড গুলো Invoke করলেই আশা করি ঝামেলা মিটে যাবে। আসলেই তাই!


static void Main(string[] args)
{
FoodShopManager.OrderChickenBurger();
FoodShopManager.OrderVegiBurger();

Console.ReadKey();
}

দেখতেই পাচ্ছেন Main এ শুধুমাত্র Facade ক্লাসটির মেথড দুটিই Invoke করা হয়েছে। একটি Facade ক্লাসই সকল Subsystem এর সবকিছু নিয়ন্ত্রন করছে।

আজ তাহলে এটুকুই। Facade নিয়ে আরো একদিন লিখবো ঠিক করলাম মাত্র। আর ভালো কথা, চাইলে ঘুরে আসতে পারেন আমার ভালো বন্ধু অমিতের ব্লগ – Singleton Pattern এর আইডিয়া যদি পেতে চান।