ট্রেইট নিয়ে কথা বলতে এতো উৎসাহিত হওয়ার কারণ অনেকেই এটাকে লারাভেলের ফিচার মনে করে। কিন্তু এটা মোটেই লারাভেলের ফিচার নয়, বরং এটা পিএইচপি-র ডিজাইন প্যাটার্ন-এরই একটা অংশ। এবার আসেন আমার মতো যারা মুখ্যু-সুখ্যু মানুষ তারা বুঝে দেখি ট্রেইট কি। আর জ্ঞানিরা দূরে থাকুন।
লাভাভেলে কাজ করার সময় একটি সমস্যা থেকে এই লেখাটির অবতারনা। সমস্যাটির বিস্তারিত দেখে নিতে এখানে ক্লিক করুন ও সমস্যা নং-৭ -এ যান।
এবার আসুন Trait, Collision ও Aliasing -এর বিস্তারিত:
Trait
প্রথমেই দেখা যাক সোজা ইংরেজিতে ট্রেইট (Trait) মানে কি? ট্রেইট মানে বিশেষ কোন লক্ষণ বা চিহ্ন যেটা দ্বারা কাউকে বা কোন কিছুকে আলাদাভাবে চিহ্নিত বা শনাক্ত করা যায়। যেমন, আমরা বলি - আরে জানিস না, অমুকে তো খুব জেলাস একটা লোক। কিংবা ধরেন তমুক এমন ভাব করে যেন সবজান্তা। কিংবা ধরুন কারও কথা বলায় বিশেষ আঞ্চলিক টান, এই সবগুলো বিশেষ আচরণ বা চিহ্ন যার দ্বারা আমরা ওই অমুক বা তমুককে চিহ্নিত করছি (মানে গীবত করছি আর কি!)। এগুলোই হচ্ছে ওই অমুক বা তমুকের বিশেষ বৈশিষ্ট বা Trait।
এখন দেখা যাক পিএইচপি-তে Trait কি। কম্পিউটার প্রোগ্রামিংয়ে ইনহেরিটেন্স তো আমরা সবাই বুঝি তাই না? যার কারণে একটা প্যারেন্ট বা বেজ ক্লাসকে এক্সটেন্ড করে আরেকটি চাইল্ড ক্লাস তৈরি হয়। কিন্তু যদি চাইল্ড ক্লাসে আরেকটি বিশেষ সুবিধার বা বৈশিষ্ট বা মেথডের দরকার হয় যা প্যারেন্ট ক্লাসে নেই কিন্তু অন্য কোন একটা ক্লাসে ইতিমধ্যে লেখাই আছে? আমরা হয়তো সেই সুবিধা বা ফাংশনটুকু কপি করে নিয়ে এসে চাইল্ড ক্লাসে বসিয়ে দেবো। কারণ পিএইচপি-তে একই চাইল্ড ক্লাসকে একাধিক বেজ ক্লাস থেকে এক্সটেন্ড করা যায় না। কিন্তু ট্রেইট এই চমৎকার সুবিধাটি করে দিয়েছে। ওই অন্য ক্লাসটিকে যদি ট্রেইট হিসেবে ডিফাইন করা হয় তাহলে খুব সহজেই ওই ট্রেইট এর ভেতরে থাকা কোন ফাংশন/মেথডের কোডকে আমরা চাইল্ড ক্লাসে রি-ইউজ করতে পারি, যা চাইল্ড ক্লাসটি-র একটি বিশেষ বৈশিষ্ট বা special characteristics-এর মতো হয়ে দাঁড়াবে। এভাবে যতখুশি ট্রেইট থেকে যত খুশি বিশেষ characteristics আমরা আমাদের চাইল্ড ক্লাস-এ নিয়ে আসতে পারি।
Collision
এখন কিন্তু খুব খিয়াল কইরা! লক্ষ্য করে দেখুন, ঠিক এই যায়গায় এসে আমরা ট্রেইট কলিশন-এর সামনে দাঁড়িয়ে আছি। কিভাবে?.... ভেবে দেখুন দুটি ট্রেইট, যেগুলোকে আমরা চাইল্ড ক্লাসে নিয়ে এসেছি, তাদের ভেতর যদি একই নামের একটি করে মেথড থাকে, তাহলে কি হবে?
হা হা হা!...ঠিক ধরেছেন। হৃদয়ে দোলা দেয়ার মতো এমন কোন সুবিশাল এরর (Error) -এর দেখা মিলবে। এবং এই এরর-টার কারণ দুটো ট্রেইট, মানে EntrustUserTrait ও SoftDeletes ট্রেইট restore নামক একই নাম-এর দুটো আলাদা মেথড নিয়ে নিজেদের মধ্যে ধাক্কাধাক্কি (collision) বাঁধিয়ে বসেছে।
Aliasing
তাহলে এবার আমরা এই দুই ট্রেইটের একই নামের দুটো মেথডের সমস্যা সমাধান করার জন্য কি করবো? এটারও খুব সিম্পল রিয়াল লাইফ সমাধান আছে! যেমন ধরুন, একটা শ্রেণীকক্ষে দুটো ছাত্রের নাম একই হয়ে গেলো। এসব ক্ষেত্রে আমাদের শিক্ষক মহোদয় কি করতেন? দুজনকে আলাদাভাবে চেনার ব্যবস্থা করতেন, তাই না? যেমন সাগর(১), সাগর(২)। আর বন্ধুরা তো আরো সরেস। তারা নাম দিত - ঢ্যাঙ্গা সাগর, বাটু সাগর, আরও কত কি, সব নাম জনসমক্ষে বলাও যাবে না। তো ঠিক এই পথটাকেই collision সমস্যার সমাধান করার কাজে লাগানো হয়েছে, আর এটাই হচ্ছে অ্যালাইসিং (aliasing)! EntrustUserTrait -এর restore মেথডকে নতুন নাম দেওয়া হয়েছে restoreA ও SoftDeletes ট্রেইট-এর restore মেথডকে নতুন নাম দেওয়া হয়েছে restoreB। Piece of cake!
এবং আরেকটা দারুণ ব্যপার এখানে উপলব্ধি করার বিষয় আছে। এই যে পুরো কাজটা করা হলো এটা কিন্তু শুধু মাত্র User ক্লাসের জন্যই করা হলো। EntrustUserTrait ও SoftDeletes ট্রেইট-এর ভিতরে কিন্ত restore মেথডকে স্পর্শও করা হয়নি। শুধুমাত্র শ্রেণিকক্ষে (বা ক্লাসে) সাগরদ্বয়ের ডাকনাম পরিবর্তন হয়ে গেল সাগর (১) অথবা সাগর (২) হিসেবে, কিন্তু তাদের নিজ নিজ পরিবার-আত্মীয়-স্বজনের কাছে তারা সাগর নামেই পরিচিত থেকে গেলো। বাবা-মা তো আর সাগর(১) কিংবা সাগর(২) বলে ডাকাডাকি করবে না, তাই না?
Simple & Lovely, isn't it? 💘
© A.S.M. Shahriar Zahan | www.zahantech.com
No comments:
Post a Comment