ফ্লাটারে কোন স্টেট ম্যানেজমেন্ট সল্যুশন ভালো?
ফ্লাটারে স্টেট ম্যানেজমেন্ট একটা বহুল আলোচিত বিষয়। ঠিক আর্কিটেকচার যেমন সফটওয়্যার ইঞ্জিনিয়ারিং এর একটা বহুল আলোচিত বিষয় তেমন। এসব বিষয় সাধারণত অবজেক্টিভ এর চাইতে সাবজেক্টিভই হয় বেশি। আমি এই আলোচনায় আর যাবোনা।
অর্থাৎ কোন স্টেট ম্যানেজমেন্ট লাইব্রেরি কোনটার চাইতে ভালো সে বিষয়ে কিছু বলবোনা। আমি কি ইউজ করি সেটাও মূখ্য নয়।
আমি আজ মূলত এবিষয়ে ইলিগ্যান্ট একটা ওয়ে এবং তার সুবিধা অসুবিধা গুলো আলোচনা করবো।
আমরা হয়তো মোটামুটি জানি যে ফ্লাটারে UI = f(state).
অর্থাৎ ফ্লাটারে যেকোনো UI (দৃশ্যমান বা অদৃশ্য) হচ্ছে স্টেট এর ফাংশন। ঠিক যেমন নবম দশম শ্রেণির y = f(x).
এবং এটা একটা পিওর ফাংশন। অর্থাৎ এর কোনো সাইড ইফেক্ট নাই। এই ফাংশন শুধু ইনপুট বা আর্গুমেন্ট হিসেবে স্টেট নেয় এবং UI (উইজেট) রিটার্ন করে।
আচ্ছা! এখন এই স্টেট জিনিসটা কয় প্রকার?
এখানেই আমাদের মূল আলোচনা।
স্টেট দুই প্রকার: লোকাল বা এফিমেরাল স্টেট এবং গ্লোবাল স্টেট।
আমি আমার দীর্ঘ ডেভেলপমেন্ট ক্যারিয়ারের (ন্যাটিভ এ্যাপ, ফ্লাটার & ওয়েব এ্যাপ বা SPA) অভিজ্ঞতা থেকে জোর দিয়ে বলতে পারি যে আমাদের এই দুইধরনের স্টেটকে ভিন্নভাবে ট্রিট করা উচিৎ যা বেশিরভাগ ডেভেলপারই করেননা। আমি বলতে চাচ্ছি যে একটা প্রজেক্টের শুরুতে আমরা সিদ্ধান্ত নিয়ে ফেলি অমুক স্টেট ম্যানেজমেন্ট লাইব্রেরী ইউজ করবো এবং লোকাল স্টেট, গ্লোবাল স্টেট চিন্তা না করেই গণহারে ওই স্টেট ম্যানেজমেন্ট লাইব্রেরীই ইউজ করি সব যায়গায়।
এর অন্তত দুটি ভয়ানক অসুবিধা আছে:
১) ওই স্টেট ম্যানেজমেন্ট লাইব্রেরীর সাথে পুরো প্রজেক্ট টাইটলি কাপলড হয়ে যায়।
২) বেশিরভাগ সময়ই ওইসব লাইব্রেরী বেশিরভাগ যায়গাতেই ব্যবহার ওভারকিল হয়ে যায় ফলে অপ্রয়োজনীয় কম্পলেক্সিটি ইন্ট্রডিউস হয়। কিছুটা মশা মারতে কামান দাগার মতো অবস্থা।
লক্ষ করলে দেখবেন যে একটা এ্যাপে খুব বেশি গ্লোবাল স্টেট থাকেনা। যা থাকে সেগুলো দুই হাতের আঙুল দিয়েই গোনা যায়।
এই যেমন শপিং কার্ট, ইউজার অথেনটিকেশন স্ট্যাটাস, থিম ইত্যাদি।
আর আমাদের আসোলে আলাদা কোনো স্টেট ম্যানেজমেন্ট লাইব্রেরীর দরকার হয় এইসব হাতে গোনা কয়েক যায়গাতেই।
বাকি সবগুলো আসোলে লোকাল স্টেট। যেগুলোতে setState ই যথেষ্ট।
কিন্তু… হ্যাঁ! কিন্তু তো একটা আছেই। সেটা হচ্ছে উইজেট ট্রির আকার যদি বেশ বড়ো হয় সেক্ষেত্রে তো setState পারফর্মেন্স ইস্যু তৈরি করে (আননেসেসারি রিবিল্ড)। হ্যাঁ। যদিওবা const কন্সট্রাক্টরের কল্যাণে তার পরিমাণ অনেক কমে গেছে। তারপরও সম্পূর্ণ আনরিলেটেড প্রোপার্টি বা স্টেটের পরিবর্তন এক্ষেত্রে রিবিল্ড ঠেকাতে পারেনা।
তাহলে উপায়?
উপায় হচ্ছে উইজেট ট্রিকে যতোটা সম্ভব ছোটো করে ফেলা। আলাদা আলাদা কাস্টম ইউজেড বানানো। এখন এই কাজটা IDE গুলার কন্টেক্সট মেনুর বা শর্টকাটের সাহায্যে খুব সহজেই করে ফেলা যায়।
আসোলে যেখানেই এরকম এক শর্টকাটে ইউজেট এক্সট্রাক্ট করা যায় বুঝতে হবে সেখানেই আননেসেসারি রিবিল্ড হওয়ার সম্ভাবনা আছে। তাই এটাই করা উচিৎ।
এর সুবিধা অনেক। লুজ কাপলিং, কম ওভারহেড, মিনিমাল লার্নিং কার্ভ, রিইউজাবিলিটি ইত্যাদি।
অসুবিধা? অসুবিধা থাকবেনা তা কি হয়?
অসুবিধা হলো প্রজেক্টে ফাইলের সংখ্যা অনেক বেশি হবে। আর সেগুলোর প্রোপার নামকরণে পেরা খেতে হবে। 🙃