() translation by (you can also view the original English article)
যখন ডিজাইন প্যাটার্নের প্রসংঙ্গ আসে, আপনি জিজ্ঞাসা করতে পারেন:
কেন আামাদের প্রোগ্রামিং-এ ডিজাইন প্যাটার্ন ব্যবহার করা উচিত? এটা ছাড়াই আমাদের কোড তো ভালভাবেই কাজ করে।
যদি তাই হয়, উল্টো আমি জিজ্ঞাসা করব: "আপনি কি চার দেয়ালের একটি সাধারন কুঠরিতে বসবাস করতে পছন্দ করবেন নাকি বরং একটি বিলাসবহুল বাড়িতে বসবাস করতে পছন্দ করবেন?" সর্বোপরি, উভয়েই আমাদের চাহিদা পুরণ করে।
সাধারনত, আমরা বিলাসবহুল বাড়িতে বসবাস করতে পছন্দ করব কারন এখানে অনেক সুবিধা থাকে এবং রক্ষণাবেক্ষণের প্রয়োজনীয়তাও কম, এবং সহজেই রক্ষণাবেক্ষণ করা যায় কারন মৌলিক ভিত্তি সেভাবেই প্রস্তুত করা থাকে।
একই জিনিস প্রোগ্রামিং-এর ক্ষেত্রেও প্রযোজ্য: যে কোড ডিজাইন প্যাটার্ন প্রয়োগ করে লিখা হয় তা বুঝতেও সহজ, রক্ষণাবেক্ষণ করা সহজ, এবং পরিবর্ধণ করা সহজ।
এই সিরিজের টিউটোরিয়ালগুলোতে, আমরা কিছু ভিন্ন ভিন্ন ডিজাইন প্যাটার্নসম্পর্কে আলোচনা করব যা প্রোগ্রামিংয়ে ব্যবহৃত হয়। আপনি তাদের সুবিধা ও অসুবিধা সম্পর্কে জানবেন, এবং কি কারনে কিভাবে ব্যবহার করতে হবে তাও জানবেন।
এই টিউটোরিয়ালগুলির সর্বত্র, আমি ডিজাইন প্যাটার্নের বর্ননা করার জন্য
পিএইচপিকে প্রধান ভাষা হিসেবে নিব; তাসত্ত্বেত্ত, তারা আসলে একটি ধারণা যা
যেকোন প্রোগ্রামিং ভাষায় প্রয়োগ করা যেতে পারে—আপনার পছন্দের ভাষা
অনুযায়ী এটা শুধু একটি সিনট্যাক্স পরিবর্তনের ব্যাপার।
ডিজাইনের নিয়ম চার ভাগে বিভক্ত:
- ক্রিয়েশনাল বা উদ্ভাবনী প্যাটার্নসমুহ
- স্ট্রাকচারাল বা সংগঠনী প্যাটার্নসমুহ
- বিহ্যাভিয়রাল বা আচরণগত প্যাটার্নসমুহ
- কংকারেন্সি বা সহঘটনী প্যাটার্নসমুহ
এই টিউটোরিয়ালে, আমরা ফ্যাসাড ডিজাইন প্যাটার্ন নিয়ে আলোচনা করব। এটা স্ট্রাকচারাল বা সংগঠনী প্যাটার্নের মধ্যে পরে কারন এর কারবার হল
কিভাবে সহজ বোধগম্য কোডের কাঠামো প্রস্তুত করতে হয় এবং দীর্ঘমেয়াদী রক্ষণাবেক্ষণ
করতে হয়।
ফ্যাসাড ডিজাইন প্যাটার্ন
ইউএমএল



সমস্যা
মনে করুন আপনাকে একই ধারায় কিছু অপারেশন করতে হবে, এবং আপনার এপ্লিকেশনের বেশ কয়েক জায়গায় এই একই কাজ করতে হবে। আপনাকে বিভিন্ন জায়গায় একই কোড বার বার লিখতে হবে। আপনি লিখলেন, কিছুদিন পর আপনি দেখলেন ঐ কোডে কিছু পরিবর্তন করা প্রয়োজন।
আপনি কি সমস্যাটি দেখতে পাচ্ছেন? যেখানে যেখানে এই কোড লিখেছিলেন তার সব
জায়গায়ই আপনাকে এখন পরিবর্তন করতে হবে। এটা কষ্টকর, তাই না?
সমাধান
সমাধানসরূপ, আপনাকে একটি লীড বা প্রধান কন্টোলার তৈরি করতে হবে, যে এইসব বাহুল ব্যবহৃত কোডগুলো নিয়ন্ত্রন করবে। ব্যবহারিক দৃষ্টিকোন থেকে, আমরা শুধুমাত্র লীড বা প্রধান কন্টোলারকে কল করব প্রাপ্ত প্যারামিটার বা স্থিতিমাপের উপর ভিত্তি করে কাজ সম্পাদনের জন্য।
এখন যদি আমাদের প্রক্রিয়ায় কোন পরিবর্তনের প্রয়োজন হয়, তাহলে যেখানে যেখানে
কোড ব্যবহার করেছি তার সবজাগায় পরিবর্তন না করে আমরা শুধুমাত্র লীড বা
প্রধান কন্টোলারে পরিবর্তন করব।
উদাহরণ
এই টিউটোরিয়ালে, চলুন একটি পাঠ নির্বাচন করি যাতে জিনিষটি আরো পাঠযোগ্য
করা যায়। ধরা যাক আপনাকে আপনার বন্ধুর বিয়ের পরিকল্পনা করার কাজ দেয়া হল। যদি আপনি নিজেই সব কিছু করেন, তহলে ভেবে দেখুন আপনাকে কতকিছু করতে হবে। এখানে ভুল হবার যথেষ্ট সম্ভাবনা থাকবে, এবং কিছু বাদ পরারও সম্ভাবনা থাকবে
যা আপনার বন্ধুর বিয়েতে বিরূপ প্রভাব ফেলতে পারে।
এক্ষেত্রে, নিজেই সবকিছু না করে, আপনি বিবাহ পরিকল্পনাকারী ব্যবহার করতে
পারেন এবং যেখানে ভুল হবার সম্ভাবনা কম থাকবে আর কাজটি যেন ভালভাবে
সম্পন্ন হয় তা নিশ্চিত করতে পারেন।
এখানে, আপনি ক্লায়েন্ট হিসেবে আচরণ করছেন যে প্রক্রিয়া শুরু করবে, এবং
বিবাহ পরিকল্পনাকারী আপনার জন্য ফ্যাসাড হিসেবে কাজ করবে, কাজ সম্পন্ন হবে
আপনার নির্দেশনা অনুযায়ী।
কোড উদাহরণ
এই অংশে আমরা আরও একটি উদাহরণ দেখব, যা ওয়েবসাইটের জন্য খুবই সাধারণ, অবশ্যই একটি কোড উদাহরণ দিয়ে। আমরা একটি পণ্য চেকআউট প্রক্রিয়ার মাধ্যমে ফ্যাসাড ডিজাইন প্যাটার্নের একটি বাস্তবায়ন দেখব। কিন্তু ফ্যাসাড ডিজাইন প্যাটার্ন দিয়ে সঠিক কোড দেখার আগে, একই কোডে কি সমস্যা হয় তা দেখা যাক।
একটি সাধারণ চেকআউট প্রক্রিয়ায় নিচের ধাপগুলো থাকে:
- কার্টে পণ্য যোগ করা।
- শিপিং চার্জ গণনা করা।
- ডিস্কাউন্ট বা ছাড় গণনা করা।
- অর্ডার প্রস্তুত করা।
সমস্যা
1 |
// Simple CheckOut Process |
2 |
$productID = $_GET['productId']; |
3 |
|
4 |
$qtyCheck = new productQty(); |
5 |
|
6 |
if($qtyCheck->checkQty($productID) > 0) { |
7 |
|
8 |
// Add Product to Cart |
9 |
$addToCart = new addToCart($productID); |
10 |
|
11 |
// Calculate Shipping Charge |
12 |
$shipping = new shippingCharge(); |
13 |
$shipping->updateCharge(); |
14 |
|
15 |
// Calculate Discount Based on |
16 |
$discount = new discount(); |
17 |
$discount->applyDiscount(); |
18 |
|
19 |
$order = new order(); |
20 |
$order->generateOrder(); |
21 |
}
|
উপরের কোডে, আপনি দেখতে পাবেন চেকআউট অপারেশন সম্পন্ন করার জন্য চেকআউট পদ্ধতিতে বিভিন্ন অবজেক্ট রয়েছে। মনে করুন আপনাকে বিভিন্ন জায়গায় এই প্রক্রিয়া সম্পন্ন করতে হবে। যদি তাই হয়, তবে কোড পরিবর্তনের সময় সমস্যার উদ্ভব হবে। সব জায়গার পরিবর্তন একসাথে এক জায়গায় করাই অধিকতর শ্রেয়।
সমাধান
আমরা একই কোড ফ্যাসাড প্যাটার্নে লিখব, যা একই কোডকে আরো রক্ষণীয় এবং পরিবর্ধনশীল করে তোলে।
1 |
class productOrderFacade { |
2 |
|
3 |
public $productID = ''; |
4 |
|
5 |
public function __construct($pID) { |
6 |
$this->productID = $pID; |
7 |
}
|
8 |
|
9 |
public function generateOrder() { |
10 |
|
11 |
if($this->qtyCheck()) { |
12 |
|
13 |
// Add Product to Cart
|
14 |
$this->addToCart(); |
15 |
|
16 |
// Calculate Shipping Charge
|
17 |
$this->calulateShipping(); |
18 |
|
19 |
// Calculate Discount if any
|
20 |
$this->applyDiscount(); |
21 |
|
22 |
// Place and confirm Order
|
23 |
$this->placeOrder(); |
24 |
|
25 |
}
|
26 |
|
27 |
}
|
28 |
|
29 |
private function addToCart () { |
30 |
/* .. add product to cart .. */
|
31 |
}
|
32 |
|
33 |
private function qtyCheck() { |
34 |
|
35 |
$qty = 'get product quantity from database'; |
36 |
|
37 |
if($qty > 0) { |
38 |
return true; |
39 |
} else { |
40 |
return true; |
41 |
}
|
42 |
}
|
43 |
|
44 |
|
45 |
private function calulateShipping() { |
46 |
$shipping = new shippingCharge(); |
47 |
$shipping->calculateCharge(); |
48 |
}
|
49 |
|
50 |
private function applyDiscount() { |
51 |
$discount = new discount(); |
52 |
$discount->applyDiscount(); |
53 |
}
|
54 |
|
55 |
private function placeOrder() { |
56 |
$order = new order(); |
57 |
$order->generateOrder(); |
58 |
}
|
59 |
}
|
এখন যেমন, আমাদের পন্যের অর্ডার ফ্যাসাডে প্রস্তুত আছে। সবমিলিয়ে আমাদের যা করতে হবে তা হল, আগের অংশে যেরকম একগুচ্ছ কোড লিখেছিলাম তার পরিবর্তে মাত্র কয়েক লাইন কোড লিখতে হবে।
নিচের কোডের পরিমান দেখুন যা কিনা বিভিন্ন জায়গায় চেকআউট প্রক্রিয়া বসানোর জন্য আপনাকে লিখতে হবে।
1 |
// Note: We should not use direct get values for Database queries to prevent SQL injection
|
2 |
$productID = $_GET['productId']; |
3 |
|
4 |
// Just 2 lines of code in all places, instead of a lengthy process everywhere
|
5 |
$order = new productOrderFacade($productID); |
6 |
$order->generateOrder(); |
এখন মনে করুন আপনাকে চেকআউট প্রক্রিয়ায় কিছু পরিবর্তন করতে হবে। এখন তাহলে যত জায়গায় চেকআউট প্রক্রিয়া বসানে হয়েছে তার সব জায়গায় পরিবর্তন করার পরিবর্তে শুধুমাত্র আমরা যে ফ্যাসাড ক্লাশ তৈরি করেছি, সেখানে পরিবর্তন করলেই হয়ে যাবে।
উপসংহার
সহজ ভাবে বললে, আমরা বলতে পারি যে ফ্যাসাড প্যাটার্ন আমরা তখন ব্যবহার করব যেখানে একাধিক পদ্ধতি সম্পন্ন করার জন্য একটি একক ইন্টারফেস প্রয়োজন, উদাহরণ হিসাবে বিবাহ পরিকল্পনাকারী আপনার জন্য ফ্যাসাড হিসাবে কাজ করছে বিভিন্ন প্রক্রিয়া সম্পন্ন করার জন্য।
কোনো মন্তব্য বা প্রশ্ন করতে চাইলে নীচের ফিডের মাধ্যমে তা উপস্থাপন করতে পারেন।