আচ্ছা, আপনার মাঝে মাঝে মনে হয় না আমি তো আমার ক্লাসের মধ্যে সব লিখেই দিচ্ছি তাহলে ইন্টারফেস কেন লিখব? আবার এই একই কাজ তো আমি অ্যাবস্ট্রাক্ট ক্লাসের মধ্যে করতে পারছি, সেই সাথে আমরা অতিরিক্ত কিছু সুবিধাও নিতে পারছি, তাহলে আমি ইন্টারফেস নিতে যাব কেন?
চলেন আমরা আমাদের দৈনন্দিন ব্যবহৃত একটা এলিমেন্টস নিয়ে সামনে আগাই।
আমরা টাইপ সি ক্যাবল ইউজ করি না? তো এই ক্যাবলটারে ডিজাইন করা হয়েছিল ইউনিভার্সাল একটা কানেক্টর হিসেবে যেটা দিয়ে অনেক স্পিডে ডাটা ট্রান্সফার করা যাবে। এখন তো এটার বহুল ব্যবহার আমরা দেখতে পাই, এবং প্রতিনিয়ত সেটা আপডেট হচ্ছে, এবং এই আপডেটও কারো সাথে কনফ্লিক্ট করছে না। যেমন আপনার পাওয়ার অ্যাডাপ্টার হচ্ছে ৩০ওয়াটের আপনার ক্যাবল হচ্ছে ১০ওয়াটের অথবা আপনার অ্যাডাপ্টার ৩০ওয়াটের ক্যাবলও ৩০ ওয়াটের কিন্তু আপনার ফোন ১০ওয়াট সাপোর্টেড এখানেও কোনো সমস্যা হচ্ছে না (সতর্কতা— নন ব্র্যান্ড প্রোডাক্টে ট্রাই করতে যাবেন না)। কেমনে সম্ভব? আবার এখন এই একটা ক্যাবল দিয়েই, চার্জ দেয়া যায়, ডিভাইস টু ডিভাইস ডাটা ট্রান্সফার করা যায়, ইথারনেট হিসেবেও ইউজ করা যায় আবার এখন মনিটরে ও এইচডিএমআই বাদ দিয়ে ইউজ করা যায়। টাইপ-সি বিভিন্ন ক্যাবল আছে যেগুলো দিয়ে অনেক দ্রুত ডাটা ট্রান্সফার করা গেলেও চার্জ খুবই স্লো হয়। আবার কোনোটা ফাস্ট চার্জ হলেও ডাটা ট্রান্সফার খুব স্লো হয়। কোনো কোনো ক্যাবল দিয়ে আবার 4K মনিটরে কানেক্ট করে খুব সুন্দর আউটপুট পাওয়া যায়। এইটা ক্যামনে সম্ভব?
তো আপনাকে এমন একটা স্পেসিফিকেশন আপনাকে বিল্ড করতে দিলে আপনার হাতে অপশন কী? আমার হাতে ভাই ইন্টারফেস ছাড়া গতি নাই। আপনার ইউজার আপনার কাছে ডাটার রিকোয়েস্ট পাঠাবে, আপনি শুধু দেখবেন আপনার কাছে তার এক্সপেক্টেড ডাটা আছে নাকি নাই। আপনি লারাভেল বিভিন্ন ক্লাসে দেখবেন $className->toArray()
মেথড কল দিলে সব ডাটা একটা অ্যারেতে দিয়ে দিচ্ছে, আবার সেম ক্লাসে $className->toJson()
মেথড কল দিলে পুরো ক্লাসের পাবলিক ডাটা জেসন আকারে চলে আসছে।
তো চলেন আবার টাইপ-সি তে যাই। টাইপ-সি এর যে ম্যানাজার আছে বা আপনার অ্যাপ্লিকেশনের যে টাইপসি হ্যান্ডল করতেছে সে দেখবে এ আমার স্পেসিফিকেশনের কোন ইন্টারফেস সে ইমপ্লিমেন্ট করছে, সে অনুযায়ী ডাটা প্রোভাইড করবে। হোস্টের কাছে ডাটা আছে আর কিছু ইন্টারফেসের নাম আছে। সে অনুযায়ী ডিসাইড করে কোন কোন মেথডে হিট করবে। যেমন আমরা লারাভেলের কনভেনশনে যদি চিন্তা করি তাহলে ব্যাপারটা এমন দাঁড়ায়, অডিও ইন্টারফেসের জন্য যদি কল করে, তাহলে ইউজারকে আমার ফরওয়ার্ড করতে হবে toAudio()
মেথডে। আবার যদি ভিডিও এর জন্য রিকোয়েস্ট করে তাহলে আমাকে কল দিতে হবে toVideo()
মেথডকে। হোস্ট মেশিনের কাছে আপনার রিকোয়েস্ট প্রসেস করার জন্য আসলে কয়েকটা ইন্টারফেস ছাড়া আর কিছুই রাখার প্রয়োজন পড়ছে না। আপনার রিকোয়েস্ট প্রসেসর চিন্তা করবে, এই রিকোয়েস্টটা কাকে ফরওয়ার্ড করা যায়। এবার তাহলে আপনার মনে প্রশ্ন জাগতে পারে, মিয়া কি জিনিস নিয়া আইছেন ‘এই সমস্যা তো আমি একটা ইফ চেক দিয়েই করে ফেলতে পারতেছি, ইন্টাফেসের লেঞ্জা টানতে যাব কেন?’
“You should program to an interface, not an implementation.” – Robert C. Martin. এই বুইড়া সবকিছুতেই প্যাচাল পাড়ে। ক্লিনকোড, অ্যাজাইল হেন-তেন ভুগিচুগি কতো কি নিয়ে আসছে, এতো কিছু দেখার কি দরকার। কোডে কাজ করতেছে এইটাইতো অনেক।
আবার আমি চাইলে এভাবেও দেখতে পারি, if($user->expects(‘audio)) {$data[‘audio’]}
এভাবেও তো করতে পারি তাই না? হ্যা আমরা তাও করতে পারি। সেই সাথে আমাদের অনেকগুলো if লেখা লাগবে। এরপরে আবার আপনাকে সেটা ম্যানেজ করা লাগবে। আসেন আমরা আরেকটা প্রবলেম নিয়ে আসি।
আমরা যখন, ইথারনেট হিসেবে ডাটা ট্র্যান্সফার করছি আমাদের দুইটা মেথড ব্যবহৃত হচ্ছে, rx
এবং tx
আবার আমরা যখন অডিওতে ডাটা নিচ্ছি তখন আমাদের আরো কিছু মেথড লাগবে যেমন play
, pause
, stop
আবার যখন পাওয়ার নিচ্ছি তখন আমাদের জানার প্রয়োজন পাওয়ারটা কতো ওয়াটের দরকার। আবার যখন ভিডিওতে ডাটা নিচ্ছি তখন, আমাদের দরকার কোন মুডে ডাটা নিচ্ছি, 4K নাকি 2K তে নিচ্ছি এসব অনেক কিছুই আমাদের চেক করা লাগবে। সে নাহয় আপনি ম্যানেজ করেই নিলেন। এবার আসেন আরেকটা কেস দেখি। অ্যাপল কি করল, তারা তাদের ডিভাইসে শুধুই টাইপ-সি দিয়ে ছেড়ে দিয়েছে এবং পোর্ট খুবই সীমিত। মানে আপনি ইথারনেট ইউজ করলে, পোর্টেবল এসএসডি আর কানেক্ট করার সুযোগ পাচ্ছেন না। এখন কি অ্যাপল আবার হাবও বানাবে? আবার আমরা চাইনিজ হাবে দেখতে পাই, আমরা এইচ ডি এম আই, ভিজিএ, ল্যান অনেক গুলো পোর্ট থাকে। এই হাব শুধু রিসিভ করতে পারে এমন না, সেন্ডও করতে পারে। একই সময়ে একাধিক টাইপের ডাটা নিয়ে কাজ করতে পারে। তো আপনি একা হাতে if চেক দিয়ে কতোটা দিক সামলাবেন?
এখনকার সিনারিও দেখেন, যার যেমনে ইচ্ছা এক্সটেন্ড করতে পারছে, আবার অনেক ওয়েতে ইউজ করতে পারছে। এখন মূলত তারা যেটা করেছে, তারা একটা বেজ রেডি করে দিয়েছে। আমাদের এই স্পেসিফিকেশন মিট করলেই চলবে। এবার তোমার যেমনে ইচ্ছা ডাটা নেও, আমার সমস্যা নাই। মোদ্দাকথা আমি বলে দিচ্ছি তোমার ডাটা তুমি এই এই ওয়েতে নিতে পারবা। আবার একেকটা ওয়েতে নেয়ার প্রসিডিওর একেকরকম। অডিওতে নিতে গেলে তোমাকে অডিওর রিকোয়ারমেন্ট ম্যাচ করতে হবে। আবার ভিডিওতে নিতে গেলে তোমার ভিডিওর রিকোয়ারমেন্ট ম্যাচ করতে হবে। ইমপ্লিমেন্টেশন তুমি নিজে করো আমার সমস্যা নাই আমার রিকোয়ারমেন্ট ম্যাচ করলেই হল।
এবার প্রথমে রাখা আমাদের প্রশ্নের উত্তর দিয়ে পক পকের ইতি টানি, অধিকাংশ ল্যাঙ্গুয়েজই মাল্টিপল এক্সটেন্ড সাপোর্ট করে না। মাল্টিপল ইমপ্লিমেন্টেশন সবাই-ই সাপোর্ট করে।
আর পক পক না করে, ইতি টানি।
‘‘আমি জানি না, আমি কতোটা সাবলীলভাবে উপস্থাপন করতে পেরেছি, চেষ্টা ছিলো ইউজকেসটা পরিষ্কার করার। ভুলত্রুটি ধরিয়ে দিয়ে কৃতজ্ঞ রাখবেন আশা করছি।’’