'স্ট্রং স্কিপিং' হল কম্পোজ কম্পাইলারে উপলভ্য একটি মোড। চালু করা হলে, এটি কম্পাইলারের আচরণ দুটি উপায়ে পরিবর্তন করে:
- অস্থির প্যারামিটার সহ কম্পোজেবল এড়িয়ে যাওয়া যায়
- অস্থির ক্যাপচার সহ ল্যাম্বডা মনে রাখা হয়
স্ট্রং স্কিপিং মোড চালু করুন
Kotlin 2.0.20-এ ডিফল্ট হিসেবে স্ট্রং স্কিপিং চালু করা থাকে।
২.০.২০-এর আগের কোনও রিলিজে Gradle মডিউলের জন্য স্ট্রং স্কিপিং চালু করতে,
আপনার Gradle কনফিগারেশনের composeCompiler ব্লকে
নিম্নলিখিত বিকল্পটি অন্তর্ভুক্ত করুন:
android { ... }
composeCompiler {
enableStrongSkippingMode = true
}
কম্পোজেবল স্কিপ করার সুবিধা
স্কিপিং ও কম্পোজেবল ফাংশনের ক্ষেত্রে, কম্পোজ কম্পাইলারের মাধ্যমে সাধারণত প্রয়োগ করা কিছু স্টেবিলিটি সংক্রান্ত নিয়ম, স্ট্রং স্কিপিং মোড শিথিল করে দেয়। ডিফল্ট হিসেবে, Compose কম্পাইলার কোনও কম্পোজেবল ফাংশনের সব আর্গুমেন্টের ভ্যালু স্টেবল হলে, সেটিকে এড়িয়ে যাওয়ার মতো হিসেবে চিহ্নিত করে। স্ট্রং স্কিপিং মোড এটি পরিবর্তন করে।
স্ট্রং স্কিপিং চালু থাকলে, সব রিস্টার্ট করা যায় এমন কম্পোজেবল ফাংশন স্কিপ করা যায়। এতে অস্থির প্যারামিটার থাকুক বা না থাকুক, এটি প্রযোজ্য হয়। রিস্টার্ট করা যায় না এমন কম্পোজেবল ফাংশন এড়িয়ে যাওয়া যায় না।
কখন এড়িয়ে যেতে হবে
রিকম্পোজিশনের সময় কোনও কম্পোজেবল এড়িয়ে যাওয়া হবে কিনা তা নির্ধারণ করতে, Compose প্রতিটি প্যারামিটারের ভ্যালু তার আগের ভ্যালুর সাথে তুলনা করে। তুলনার ধরন প্যারামিটারের স্থায়িত্বের উপর নির্ভর করে।
- ইনস্ট্যান্স ইকুয়ালিটি (
===) ব্যবহার করে অস্থির প্যারামিটার তুলনা করা হয় - অবজেক্ট ইকুয়ালিটি (
Object.equals()) ব্যবহার করে স্টেবল প্যারামিটার তুলনা করা হয়
সব প্যারামিটার এইসব শর্ত পূরণ করলে, কম্পোজিশন আবার করার সময় Compose কম্পোজেবল এড়িয়ে যায়।
আপনি হয়ত কম্পোজেবলকে স্ট্রং স্কিপিং থেকে অপ্ট-আউট করতে চান। অর্থাৎ, আপনি হয়তো
রিস্টার্ট করা যায় কিন্তু এড়িয়ে যাওয়া যায় না এমন কম্পোজেবল চান। এই ক্ষেত্রে, @NonSkippableComposable অ্যানোটেশন ব্যবহার করুন।
@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}
ক্লাসকে স্টেবল হিসেবে অ্যানোটেট করুন
আপনি যদি চান যে কোনও অবজেক্টকে ইনস্ট্যান্স ইকুয়ালিটি (===)-এর পরিবর্তে
অবজেক্ট ইকুয়ালিটি (Object.equals()) ব্যবহার করে তুলনা করা হোক, তাহলে প্রদত্ত ক্লাসকে
@Stable বা @Immutable দিয়ে অ্যানোটেট করা চালিয়ে যান।
@Stable বা @Immutable যোগ করার আগে নিম্নলিখিত ট্রেড-অফের কথা মাথায় রাখুন:
- Compose মডিউলে স্টেবল প্রপার্টি সহ ক্লাস আগে থেকেই স্টেবল: Compose কম্পাইলারের
মাধ্যমে কম্পাইল করা মডিউলে স্টেবল ধরনের
valপ্রপার্টি সহ ক্লাস অটোমেটিক স্টেবল হিসেবে অনুমান করা হয় এবং@Immutableবা@Stableছাড়াই.equals()ব্যবহার করে। - শুধুমাত্র সস্তা
.equals()চেক সহ ক্লাস অ্যানোটেট করুন: কম্পাইলার যখন স্টেবিলিটি অনুমান করতে পারে না (যেমন, নন-কম্পোজ মডিউল থেকে ক্লাস) এবং একই মান সহ নতুন ইনস্ট্যান্স ঘন ঘন অ্যালোকেট করা হয়, তখন@Stableবা@Immutableযোগ করুন, তবে শর্ত হল ক্লাসের.equals()চেক সস্তা হতে হবে। - কালেকশন সহ মডেল অ্যানোটেট করার সময় সতর্ক থাকুন: কালেকশন সহ মডেলে
@Stableবা@Immutableযোগ করলে (অথবাList-এর পরিবর্তেImmutableListব্যবহার করলে) Compose প্রতিটি রিকম্পোজিশন পাসে কালেকশনের প্রতিটি এলিমেন্টকে.equals()-এর সাথে তুলনা করে। লেজি লেআউটে (LazyColumn,LazyRow,LazyGrid) ব্যবহৃত বড় কালেকশন বা মডেলের জন্য, প্রতিটি এলিমেন্ট তুলনা করা ইনস্ট্যান্স ইকুয়ালিটি (===) ব্যবহার করা বা সরাসরি রিকম্পোজ করার চেয়ে ধীরগতির হতে পারে।
ল্যাম্বডা মেমোইজেশন
স্ট্রং স্কিপিং মোড কম্পোজেবলের মধ্যে ল্যাম্বডার আরও বেশি মেমোইজেশন চালু করে। স্ট্রং স্কিপিং চালু থাকলে, কম্পোজেবল ফাংশনের মধ্যে থাকা প্রতিটি ল্যাম্বডা অটোমেটিক মনে রাখা হবে।
উদাহরণ
স্ট্রং স্কিপিং ব্যবহার করার সময় কম্পোজেবলের মধ্যে ল্যাম্বডার মেমোইজেশন অর্জন করতে,
কম্পাইলার আপনার ল্যাম্বডাকে remember কলের মাধ্যমে র্যাপ করে। এটি ল্যাম্বডার ক্যাপচারের সাথে
কী করা হয়েছে।
এমন একটি কেস বিবেচনা করুন যেখানে আপনার কাছে নিম্নলিখিত উদাহরণের মতো একটি ল্যাম্বডা আছে:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = {
use(unstableObject)
use(stableObject)
}
}
স্ট্রং স্কিপিং চালু থাকলে, কম্পাইলার ল্যাম্বডাকে remember কলে র্যাপ করে মেমোয়াইজ করে:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = remember(unstableObject, stableObject) {
{
use(unstableObject)
use(stableObject)
}
}
}
কীগুলি কম্পোজেবল ফাংশনের মতো একই তুলনামূলক নিয়ম অনুসরণ করে। রানটাইম ইনস্ট্যান্স ইকুয়ালিটি ব্যবহার করে অস্থির কী তুলনা করে। এটি অবজেক্ট ইকুয়ালিটি ব্যবহার করে স্টেবল কী তুলনা করে।
মেমোইজেশন ও রিকম্পোজিশন
এই অপ্টিমাইজেশন কম্পোজেবলের সংখ্যা অনেক বাড়িয়ে দেয় যা রানটাইম রিকম্পোজিশনের সময় এড়িয়ে যায়। মেমোইজেশন ছাড়া, রানটাইম রিকম্পোজিশনের সময় ল্যাম্বডা প্যারামিটার নেয় এমন যেকোনো কম্পোজেবলে একটি নতুন ল্যাম্বডা বরাদ্দ করার সম্ভাবনা অনেক বেশি। এর ফলে, নতুন ল্যাম্বডাতে এমন প্যারামিটার আছে যা শেষ কম্পোজিশনের সমান নয়। এর ফলে রিকম্পোজিশন হয়।
মেমোইজেশন এড়িয়ে চলুন
আপনার কাছে এমন কোনও ল্যাম্বডা থাকলে যা আপনি মেমোয়াইজ করতে চান না, তাহলে @DontMemoize
অ্যানোটেশন ব্যবহার করুন।
val lambda = @DontMemoize {
...
}
APK সাইজ
কম্পাইল করার সময়, এড়িয়ে যাওয়া যায় এমন কম্পোজেবল, এড়িয়ে যাওয়া যায় না এমন কম্পোজেবলের চেয়ে
বেশি কোড জেনারেট করে। 'এড়িয়ে যাওয়া' ফিচার চালু থাকলে, কম্পাইলার
প্রায় সব কম্পোজেবলকে 'এড়িয়ে যাওয়া যাবে' হিসেবে চিহ্নিত করে এবং সব ল্যাম্বডাকে
remember{...}-এ র্যাপ করে। এর ফলে, স্ট্রং স্কিপিং মোড চালু করলে আপনার অ্যাপ্লিকেশনের APK সাইজের উপর
খুব সামান্য প্রভাব পড়ে।
Now In Android-এ স্ট্রং স্কিপিং চালু করার ফলে APK-এর সাইজ ৪ কেবি বেড়ে গেছে। সাইজের পার্থক্য মূলত নির্ভর করে প্রদত্ত অ্যাপে আগে থেকে থাকা এড়িয়ে যাওয়া যায় না এমন কম্পোজেবলের সংখ্যার উপর, তবে এটি তুলনামূলকভাবে কম হওয়া উচিত।