
আপনি যদি মোবাইল অ্যাপ ডেভেলপমেন্টে কাজ করেন, তবে আপনি জানেন যে আপনার কোড কীভাবে সাজাবেন তা বেছে নেওয়া কতটা ঝামেলার কাজ। বিষয়টি শুধু অ্যাপটিকে সচল রাখাই নয়, বরং প্রজেক্ট বড় হওয়ার সাথে সাথে এটিকে একটি বিশৃঙ্খল অবস্থায় পরিণত হওয়া থেকে রক্ষা করাও বটে। এখানেই আর্কিটেকচারাল প্যাটার্নের ভূমিকা আসে, যা একটি মানচিত্রের মতো কাজ করে এবং টিমকে ক্লাস ও ফাইলের ভিড়ে হারিয়ে যাওয়া থেকে বাঁচায়।
এই ইকোসিস্টেমের মধ্যে, মডেল-ভিউ-ইন্টেন্ট (MVI) প্যাটার্নটি বেশ জনপ্রিয়তা লাভ করেছে, বিশেষ করে অ্যান্ড্রয়েডে। যদিও এটিকে কখনও কখনও সামগ্রিক আর্কিটেকচারের সাথে গুলিয়ে ফেলা হয়, এটি আসলে একটি প্রেজেন্টেশন লেয়ার প্যাটার্ন যার লক্ষ্য হলো ইন্টারফেসের বিশৃঙ্খল অবস্থায় শৃঙ্খলা আনা এবং ডেটা যাতে সর্বদা একই দিকে প্রবাহিত হয় তা নিশ্চিত করা, যাতে সেই বিরক্তিকর ফ্যান্টম এররগুলো এড়ানো যায়।
মোবাইল স্থাপত্যের বিবর্তন পথ
আমরা এখন কোথায় আছি তা বুঝতে হলে, আমাদের দেখতে হবে আমরা কোথা থেকে এসেছি। মোবাইল জগতে আমরা বেশ কয়েকটি ধাপ পেরিয়ে এসেছি। শুরুতে, মডেল-ভিউ-কন্ট্রোলার (MVC) আর্কিটেকচারেরই জয়জয়কার ছিল । এটি সহজ ছিল, কিন্তু এর ফলে ভিউ এবং মডেল একে অপরের সাথে অতিরিক্ত জড়িয়ে পড়ত, যা অ্যাপের স্কেলিংকে দুঃস্বপ্নে পরিণত করত। এরপর আসে মডেল-ভিউ-প্রেজেন্টার (MVP) , যেখানে প্রেজেন্টারই সবকিছু সমন্বয়কারী প্রধান হয়ে ওঠে, যদিও কখনও কখনও এই ক্লাসগুলো বিশাল আকার ধারণ করত—সেই কুখ্যাত "গড ক্লাস"।
পরবর্তীতে আসে মডেল-ভিউ-ভিউমডেল (MVVM) , যা ছিল গুগলের পছন্দের মডেল এবং জেটপ্যাকের ভিত্তি। এটি লাইভডেটা বা স্টেটফ্লো-এর মাধ্যমে রিঅ্যাক্টিভ প্রোগ্রামিং চালু করে , যা ভিউকে নিজেকেই আপডেট করার সুযোগ দেয়। তবে, যারা স্টেট মেশিন নীতি এবং একমুখী প্রবাহের (USF) উপর ভিত্তি করে সম্পূর্ণ ও অনুমানযোগ্য স্টেট নিয়ন্ত্রণ চেয়েছিলেন, তাদের জন্য MVI একটি স্বাভাবিক বিবর্তন হিসেবে আবির্ভূত হয়।
MVI স্থাপত্যের বিশ্লেষণ
MVI-এর মূল ভিত্তি হলো এর একমুখী ডেটা প্রবাহ। অন্যান্য মডেলের মতো নয়, এখানে সবকিছু একটি বৃত্তাকার এবং কঠোরভাবে সংজ্ঞায়িত পথ অনুসরণ করে: ভিউ একটি ইনটেন্ট নির্গত করে, মডেল সেই ইনটেন্টটি প্রসেস করে এবং একটি নতুন স্টেট ফেরত দেয় যা ভিউ রেন্ডার করে। এটি অস্পষ্টতা দূর করে এবং স্টেট ম্যানেজমেন্টকে অনুমানযোগ্য করে তোলে ।
- মডেলটি: এটি শুধু একটি ডেটাবেস নয়, বরং এটি বিজনেস লজিক পরিচালনা এবং স্ক্রিনের বর্তমান অবস্থা বজায় রাখার জন্যও দায়ী।
- দৃশ্যটি: এটি একটি নিষ্ক্রিয় স্তর যা কেবল প্রাপ্ত ডেটা প্রদর্শন করে এবং ব্যবহারকারীর অঙ্গভঙ্গি ধারণ করে সেগুলোকে অভিপ্রায়ে রূপান্তরিত করে।
- অভিপ্রায় (উদ্দেশ্য): অ্যান্ড্রয়েড ইন্টেন্টের সাথে একে গুলিয়ে ফেলবেন না; এখানে এটি একটি নির্দিষ্ট কাজ যা ব্যবহারকারী সম্পাদন করতে চান (উদাহরণস্বরূপ,
ButtonClicked).
একটি গুরুত্বপূর্ণ বিষয় হলো, ইন্টারপ্রেটারটি সেতু হিসেবে কাজ করে যা এই উদ্দেশ্যগুলোকে মডেলের মধ্যে বাস্তব পরিবর্তনে রূপান্তরিত করে, ফলে কোড অনেক বেশি মডিউলার এবং পুনঃব্যবহারযোগ্য হয়ে ওঠে ।
কোটলিনে বাস্তব প্রয়োগ
অ্যান্ড্রয়েডে এটি বাস্তবায়ন করতে, আমরা সাধারণত ভিউমডেল এবং ডেটা ফ্লো-এর উপর নির্ভর করি। একটি সাধারণ কাউন্টারের কথা ভাবুন: ভিউটিতে একটি বাটন আছে, যেটি চাপলে Action.ButtonClicked নামক একটি অ্যাকশন ট্রিগার হয় । এই অ্যাকশনটি ভিউমডেলে পৌঁছায়, যা স্টেট কীভাবে পরিবর্তিত হবে তা নির্ধারণ করে।
রাষ্ট্রকে সাধারণত সংজ্ঞায়িত করা হয় একটি অপরিবর্তনীয় ডেটা ক্লাসএর মানে হলো, আমরা অভ্যন্তরীণ মানগুলো পরিবর্তন করি না, বরং ফাংশনটি ব্যবহার করে স্টেটের একটি নতুন অনুলিপি তৈরি করি। copy()ViewModel একটির মাধ্যমে এই অবস্থাটি প্রকাশ করে। MutableLiveData বা একটি StateFlowএবং অ্যাক্টিভিটি বা ফ্র্যাগমেন্টটি এর জন্য সাবস্ক্রাইব করে ইউজার ইন্টারফেস আপডেট করুন ডেটা পরিবর্তন হওয়ার সাথে সাথেই
MVI বনাম MVVM: কোনটি বেছে নেবেন?
MVI কি MVVM-কে প্রতিস্থাপন করবে, এই প্রশ্নটি মনে আসা স্বাভাবিক। বাস্তবতা হলো, তারা একে অপরের শত্রু নয় এবং প্রকৃতপক্ষে, প্রতিটি ফিচারের প্রয়োজন অনুসারে একই প্রোজেক্টে তারা সহাবস্থান করতে পারে । MVVM তার সরলতা এবং স্বয়ংক্রিয় ডেটা লিঙ্কিংয়ের জন্য বিশেষভাবে উল্লেখযোগ্য, যা এটিকে সাধারণ স্ক্রিনের জন্য আদর্শ করে তোলে।
অন্যদিকে, জটিল এবং নেস্টেড ডেটা স্ট্রাকচার পরিচালনার ক্ষেত্রে MVI হলো সর্বোত্তম টুল , কারণ এটি কাপলিং এড়িয়ে চলে এবং তথ্যের প্রবাহকে স্বচ্ছ করে তোলে। তবে, এটি মনে রাখা গুরুত্বপূর্ণ যে MVI শেখা বেশ কঠিন এবং খুব সাধারণ অ্যাপ্লিকেশনগুলিতেও এটি অপ্রয়োজনীয় কোড তৈরি করতে পারে।
ক্লিন আর্কিটেকচার এবং আরএক্স-এর সাথে সমন্বয়
প্রেজেন্টেশন প্যাটার্নকে সামগ্রিক আর্কিটেকচারের সাথে গুলিয়ে না ফেলাটা অত্যন্ত গুরুত্বপূর্ণ। এমভিআই একটি ক্লিন আর্কিটেকচার বা হেক্সাগোনাল আর্কিটেকচারের মধ্যে নিখুঁতভাবে প্রয়োগ করা যেতে পারে। এমভিআই যেখানে ভিউকে সংগঠিত করে, সেখানে ক্লিন আর্কিটেকচার ডেটা লেয়ার, ইউজ কেস এবং রিপোজিটরিগুলোকে আলাদা করার দায়িত্বে থাকে।
এছাড়াও, এই প্রসঙ্গে RxJava বা RxSwift-এর মতো লাইব্রেরি ব্যবহার করা একটি বিরাট সুবিধা। এই টুলগুলো রিঅ্যাক্টিভ ডেটা ফ্লো তৈরি করা সহজ করে, যার ফলে Redux বা MVI-এর মতো প্যাটার্নগুলোর বাস্তবায়ন অনেক বেশি অ্যাজাইল এবং দ্রুত হয় , যদিও আজকাল Kotlin Coroutines এবং Flow আরও বেশি নেটিভ ইন্টিগ্রেশনের সাথে একই ধরনের কাজ করে থাকে।
পরিশেষে, একটি অ্যাপের সাফল্য নির্ভর করে শক্তিশালী ডেটা প্রবাহ এবং কোডের সরলতার মধ্যে ভারসাম্য রক্ষার উপর। দীর্ঘমেয়াদী স্কেলেবিলিটি নিশ্চিত করতে, যখন স্টেটের পূর্বাভাসযোগ্যতা সর্বোচ্চ অগ্রাধিকার পায়, তখন MVI বেছে নেওয়া উচিত। এই নির্দেশিকাটি শেয়ার করুন যাতে আরও বেশি মানুষ এই বিষয়টি সম্পর্কে জানতে পারে ।