বাংলায় Android MVVM আর্কিটেকচারাল প্যাটার্ণ (পর্ব -১)

বাস্তব জীবনে যখন আমরা সফটওয়ার ডেভেলপ করি তখন কোড হয়ে যায় হাজার হাজার লাইন। এই হাজার হাজার লাইনের কোড কি কি অসুবিধা করে আর এদের সমাধানে ডিজাইন প্যাটার্ন কিভাবে ভূমিকা রাখে তা জেনে নিন লিংকে ক্লিক করে।

এন্ড্রয়েড এপ ডেভেলপিংয়েও কিছু আর্কিটেকচারাল ফলো করতে পারি যা করলে আমাদের কোড হবে আরো ম্যানেজেবল এবং কোডের টেষ্টিং এবং ডিবাগিং হবে আরো দ্রুত। বর্তমানে এন্ড্রয়েড ডেভেলপিংয়ে অন্যতম একটি জনপ্রিয় আর্কিটেকচারাল প্যান্টার্ণ হল MVVM ।

MVVM মানে হল MODEL – VIEW -VIEWMODEL

সকল ডিজাইন প্যান্টার্নের মত এখানেও কোডকে আলাদা জায়গায় লেখার মূলনীতি মেনে চলা হয়েছে।আসলে আপনি যখন একটি একটিভিটিতে ভিউ রিলেটেড কাজ করবেন সাথে সাথে বিজনেস লজিক লিখবেন এমন কি যদি নেটওয়ার্ক কলের লজিকসহ যাবতীয় সকল কিছু লিখবেন তখন তা খুব বাজে ধরনের কোড হবে।আপনি এখানে কোন বাগের সম্মুখীন হলে তা ডিবাগ করতে অনেক বাধা পাবেন।সাথে সাথে নতুন কোন ফিচার আনতেও অনেক বাধা পাবেন।তাই এই প্যান্টার্ন ফলো করলে আপনি পাবেন অনেক সুবিধা যা আপনার ডেভেলপিং টাইমকে অনেক কমিয়ে দিবে,আপনি অনেক কম সময় ডেভেলপিং করতে পারবেন। MVVM মূলত তিনটি অংশে বিভক্ত।

১)মডেল

২)ভিউ

৩)ভিউ মডেল

MVVM এর ব্যাসিক আর্কিটেকচার।

ভিউ – এই ভিউ আসলে Android এর View class (Textview,EditText ইত্যাদি) এর কোন কিছু না।এটি আসলে কোন ইউজার কোন এপের কোন এক্টিভিটতে যা দেখছে মানে UI ,সেই UI এর সাথে ইউজারের ইন্টারেকশনকে হেন্ডেল করে।মানে আপনি ধরেন একটি বাটনে ক্লিক করলে একটি একটিভিটিতে যাবে বা একটি ইমেজে টাচ করলে একটি ডায়লগ শো হবে এইসব ছোট খাটো ইন্টারকেশনের লজিক এই ভিউ বা একটিভিটিতে থাকতে পারে।ভিউতে কোন বিজনেস লজিক বা ডাটাবেজ কোয়েরি অপারেশন এমন কাজ হওয়া যাবে না। এর প্রধান কাজই হবে ভিউ মডেল থেকে সে যা ডাটা পাবে তা স্ক্রিণে দেখাবে এবং কি ইন্টারেকশন হচ্ছে তা ভিউ মডেলকে পৌছে দিবে।মানে ধরুন এই বাটন ক্লিক হয়েছে।এখন বাটনটি যে ক্লিক হয়েছে তা ভিউ মডেলকে জানানো।

ভিউমডেল- এই ভিউমডেলের কাজ হচ্ছে ভিউ এবং বিজনেস লজিকের ভিতর সেতুবন্ধন তৈরী করা। মানে ধরুন ভিউ মডেল রিপোজিটরি থেকে ডাটা পাবে এবং তা ভিউকে বলবে সেই ডাটা শো করাতে।রিপোজিটরি আসলে ফরমালি MVVM এর কোন অংশ না হলেও এটি এই প্যান্টার্ণে খুব জরুরী একটি অংশ যা ব্যবহার করা উচিত। নিচে আমরা তা নিয়ে একটু পর আলোচনা করব।খুবই একটি গুরুত্বপূর্ণ কথা মনে রাখতে হবে তা হল ভিউমডেলে ভিউয়ের কোন রেফারেন্স থাকা যাবে না মানে হল ভিউ ক্লাসটির কোন অবজেক্ট ভিউমডেলে তৈরি করা যাবে না।এটি তৈরী হয় না বলেই এই ভিউ মডেল ক্লাসটি অনেক ভাল ভাবে টেষ্ট করা যায় কারন অনেক সময় টেষ্ট করার সময় যদি কোন ক্লাসে এন্ড্রয়েড এক্টিভিটি , এপ্লিকেশন বা কন্টেক্স অবজেক্ট থাকে তাহলে টেষ্টিং অনেক কঠিন হয়ে যায় কারন এগুলো এন্ড্রয়েডের নিজস্ব প্রোপার্টি যা সব সময় পাওয়া যায় না টেষ্টিংয়ের সময়।

কিন্তু ভিউমডেলেরতো অবশ্যই ভিউতে কোন ডাটা শো করাতে হবে।তো রেফারেন্স না থাকার সত্ত্বেও সে যেই পদ্ধতিতে তা করে তা হল Observer pattern ফলো করে।মানে ভিউ মডেলটি প্রথমে Observable করে তোলা হয় মানে তাকে অন্য কোন অবজেক্ট সব সময় দেখাশোনা করতে পারবে কখন তার অবস্থা চেঞ্জ হচ্ছে।তাই ভিউতে ভিউমডেলের রেফারেন্স থাকে ফলে ভিউ সব সময় অবজার্ভ করতে থাকে কখন ভিউমডেলটি অবস্থা চেঞ্জ হচ্ছে তখন সে সেই চেঞ্জ হবার সংকেত পেতে নিজেও পরিবর্তন হয়।

ভিউ মডেল বানানোর জন্য গুগল অফিসিয়াল ভাবে ViewModel নামের একটি ক্লাস দিয়ে থাকে যাকে Android Architectural Component এর মাধ্যমে যা extends করে আপনি আপনার ভিউমডেলটি বানাতে পারেন ।আপনি চাইলে BaseObservable ব্যবহার করে নিজের কাস্টম ViewModel বানাতে পারেন।কিন্তু তা উচিত হবে না কারন আপনার বানানো ভিউমডেলটি এন্ড্রয়েড কনফিগারেনশন চেঞ্জ হলে কি হবে তা জানে না (যেমন স্ক্রিণ রোটেট করলে) কিন্তু গুগলের দেয়া ভিউমডেলটি তা জানে । কারন আমরা জানি কনফিগারেশন চেঞ্জ হলে কোন একটিভিটি আবার নতুন করে তৈরী হয়।তাই তখন BaseObservable কে extends করে বানানো ভিউমডেলের ডাটাগুলো খালি হয়ে যায়।সেই সাথে ভিউও ডাটাশূন্য হয়ে পরে কারন আমরা জানি যে ভিউ ভিউমডেলকে অবজার্ভ করছে।তাই আমাদের এন্ড্রয়েডের দেয়া ভিউমডেলকে এক্সটেন্ডস করে কাজ করা উচিত কারন এটি এন্ড্রয়েন্ডের লাইফ সাইকেলের সাথে নিজেকে খুব ভালভাবে নিজে নিজে ম্যানেজ করে মানিয়ে চলে।ফলে আমরা কোন একটি এক্টিভিটি নতুন তৈরী হবার পরেও ভিউমডেলের ভিতরে থাকা ডাটাগুলোকে পেয়ে থাকবো।তাই আমরা যদি Android এর ভিউমডেল ব্যবহার না তাহলে আমাদের এই লাইফ সাইকেলের সাথে আমাদের এই ভিউ মডেলকে নিজে নিজে হেন্ডেল করাতে হত যা অনেক সময় সাপেক্ষ ব্যাপার। গুগলের ViewModel class এর আবার আরেকটি চাইন্ড ক্লাস আছে নাম তার AndroidViewModel ।এর কাজ হল যদি কোন কারনে আপনার ভিউ মডেলে কোন সময় Context,Application,Activity অবজেক্ট দরকার হয় তাহলে তখন আপনি AndroidViewModel ক্লাসটি ব্যবহার করতে পারেন।

আমরা জানি যে ভিউ মডেল ভিউ এবং বিজনেস লজিকের সেতুবন্ধন হিসাবে কাজ করে। ভিউমডেলের ভিতরে ডাটাগুলোকেও অবজারভেবল বানাতে হবে কারন ভিউ এগুলাকেই মুলত অবজার্ভ করে। একটি ভিউমডেলের সকল ডাটাগুলোকে আমরা চাইবোনা তাহলে বার বার কল করুন করে দেখুক ভিউ যে তাদের অবস্থার পরিবর্তন হয়েছে কিনা।আমরা চাইবো যে ডাটাগুলো পরিবর্তন হলে যেন ভিউ নিজেই টের পাক।আর এই প্রসেসটুকু করার জন্য দুইটি পদ্ধতি ব্যবহার করা হয় দুইটি লাইব্রেরী দিয়ে।

১) লাইভ ডাটা (Live data)

২) আর এক্স জাভা (Rx java)

লাইভ ডাটাটি গুগলের অফিসিয়াল লাইব্রেরী যা আর্কিটেকচারাল কম্পোনেন্টের ভিতরে অন্তর্ভূক্ত।এইটিও এপের লাইফ সাইকেল খুব ভালভাবে হ্যান্ডেল করে।

কেন লাইভ ডাটা ব্যবহার করব ?

আপনি যদি লাইভ ডাটা ব্যবহার না করতেন তাহলে আপনে অবশ্যই অবজার্ভেবল ফিন্ড ব্যবহার করতে হতো কারন আপনি চান ডাটাগুলো ভিউ সব সময় অবজার্ভ করুক।কিন্তু ধরুন আপনি বিশাল একটি ডাটা সার্ভারে কল দিয়ে নিয়ে আসছেন। কিন্তু এরই ভিতরে এপটি বন্ধ করে দিয়েছেন আপনি।যখন ডাটা আসবে তখন কিন্তু সে আর কোন একটিভিটি পাবেনা যেখানে তার ডাটা শো করানোর কথা ছিল।তখন এপ ক্রেশ করবে।এই সকল সমস্যার জন্য আসলে লাইভ ডাটা ব্যবহার করা হয় যা ভিউ মডেলের মত ভিউ মডেলের ডাটাগুলোকেও এক্টিভিটি লাইফ সাইকেলের সাথে সুন্দর করে ম্যানেজ করে।কেউ যখন এপ্লিকেশন বন্ধ করে দেয় তখন লাইভ ডাটা আর ভিউকে ডাটা অবজার্ভ করতে দেয় না।

সুতরাং আমরা বলতে পারি ভিউ মডেলের মেইন কাজ হল প্রেজেন্টেশন লজিক রাখা মানে ভিউ কোন জিনিস কিভাবে দেখাবে তা রাখা ।

মডেল-

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

রিপোজিটরি –

এটিই মূলত লোকাল স্টোরেজের ডাটার সাথে সার্ভারের ডাটার সিংক করে থাকে।রিপোজিটরি আসলে ভিউমডেলের জন্য এক এবং অদ্বিতীয় ডাটা সোর্স নিশ্চিত করে।ভিউ মডেল শুধু ডাটা চায় সেই ডাটা রিপোজিটরি কই থেকে এনে দিবে হোক সার্ভার বা লোকাল স্টোরেজ তা ভিউমডেলের দেখার বিষয় না।

এখানে খেয়াল করুন।ভিউতে ভিউমডেলের রেফারেন্স আছ ,আবার ভিউমডেলে রিপোজিটরির রেফারেন্স আছে।আবার রিপোজিটরিতে মডেলের রিফারেন্স আছে।এভাবে দেখা যাচ্ছে যে একে অপরের উপর নির্ভরশীলতা কমে যাচ্ছে।সেই সাথে আমাদের কোডের মডিউলারিটি বাড়ছে ,কোড পড়ার সুবিধা বাড়ছে একই সাথে কোড মেইনটেইন করার সুবিধাও বাড়ছে ফলে এপের কোন নতুন ফিচার দরকার হলে আমরা তা দ্রুত এড করতে পারি একই সাথে টেষ্টিং ও করতে পারি।

ফেসবুক এ শেয়ার করুন

Leave a Reply

Your email address will not be published. Required fields are marked *