5.3 ডেকোরেটর্স কম্পোজিশনঃ
একটি ডিক্লারেশনে একের অধিক ডেকোরেটর্স ব্যবহার করে যায়। সেটা তখন গণিতের ফাংশন কম্পোজিশনের মত কাজ করে।
একটি ডিক্লারেশনে একের অধিক ডেকোরেটর্স ব্যবহার হলে তা নিম্নরুপের ধাপগুলো ব্যবহার করে মূল্যায়ণ করা হয়ঃ
১। প্রত্যেক ডেকোরেটরের expression উপর থেকে নিচে (top to bottom) মূল্যায়িত হয়ে থাকে।
২। এর পর ফলাফলটি ফাংশন হিসাবে নিচে থেকে উপরে (bottom to top) কল হয়ে থাকে।
ডেকোরেটর ফ্যাক্টরি দিয়ে নিম্ন ডেকোরেটর্সের ক্রম নির্ণয় করা যাবেঃ
![decoretors composition](https://staging.vivasoftltd.com/wp-content/uploads/2023/06/unnamed.png)
উপরে আমরা দুইটি ফাংশন লিখেছি, mac ও jack। উভয়ই আমাদের একটি ফাংশন রিটার্ন করে। আমরা mac ও jack দের ডেকোরেটর হিসেবে ব্যবহার করবো একই ক্লাসে। এখন বুঝতে হবে, যখন একের অধিক ডেকোরেটর ব্যবহার হয় তখন সেটা কিভাবে মূল্যায়িত হয়?
আমরা এখন একটি ক্লাসে এই দুইটি ডেকোরেটরকেই প্রয়োগ করি।
class ExampleClass {
@mac()
@jack()
method() {}
}
কন্সোলে নিম্নরুপ ফলাফল পাওয়া যাবেঃ
mac(): MacGyver is evaluated
jack(): Jack is evaluated
jack(): Jack a licensed pilot is evaluated
mac(): MacGyver a genious troubleshooter is evaluated
এইখানে আমরা দেখতে পাই যে, যদিও আমরা mac() ডেকোরেটরকে প্রথমে প্রয়োগ করে থাকি, কিন্তু ফাংশন মূল্যায়ণের ক্ষেত্রে প্রথমে তা নিচে থেকে উপরেই কল হয়ে থাকে। যা গণিতের ফাংশন কম্পোজিশনের রুল ফলো করে। তাই আমাদের প্রথমে প্রয়োগ করা ডেকোরেটরের রিটার্নকৃত ফাংশনটি সবার শেষে কন্সোলে প্রিন্ট করে থাকে।