Dart Late va kechiktirilgan ishga tushirish

Dart dasturlash tilida late kalit so’zi o’zgaruvchilarni keyinroq ishga tushirish uchun ishlatiladi. Dartda eng kam ishlatiladigan kalit so’zlardan biri hisoblanadi late. Uning foydasi o’zgaruvchidan foydalanganda bo’ladi.

Jarayon ko'pincha o'zgaruvchilarning qiymatlari aniqlangandan keyin ma'lum bo'lganda yuzaga keladi. Masalan:

class Shaxs {
String ism = "";
int yosh = 0;
Shaxs(String ism, int yosh) {
if (ism != "shaxs") this.ism = ism;
else this.ism = "Noma'lum";

if (0 < yosh && yosh < 111) this.yosh = yosh;
else this.yosh = 18;
}

void display() => print("Ismi: $ism \nYoshi: $yosh");
}

Bu yerda ism va yosh maydonlarining qiymatlari shartga qarab konstruktorda o'rnatiladi. Biroq, sukut bo'yicha, null bo'lmagan barcha o'zgaruvchilar qandaydir qiymatga ega bo'lishi kerak. Ism va yosh maydonlariga ko'ra biz asosiy qiymatlarni o'rnatamiz:

String ism = "";
int yosh = 0;

Shu bilan bir qatorda, biz ushbu o'zgaruvchilarni null qiymat bo’lishi mumkin deb belgilashimiz ham mumkin:

String? ism;
int? yosh;

Biroq, bu mantiqan to'liq to'g'ri emas, chunki foydalanuvchining ismi ham, yoshi ham, qoida tariqasida, nullga teng bo'lmasligi ya’ni mavjud bo’lishi kerak. Ular har doim o'ziga xos ma'noga ega bo'lishi kerak. Dart dasturlash tili bu vaziyat uchun yechim beradi - biz late kalit so'zi bilan o'zgaruvchilarni aniqlashimiz mumkin :

class Shaxs {
late String ism;
late int yosh;
Shaxs(String ism, int yosh) {
if (ism != "shaxs") this.ism = ism;
else this.ism = "Noma'lum";

if (0 < yosh && yosh < 111) this.yosh = yosh;
else this.yosh = 18;
}

void display() => print("Ismi: $ism \nYoshi: $yosh");
}
void main (){
Shaxs talaba = Shaxs("Husanboy", 20);
talaba.display();
}

Late kalit so'z o'zgaruvchining keyinroq ishga tushirilishini bildiradi, ya'ni bu kechiktirilgan ishga tushirish deb ataladi. Bundan tashqari, siz qiymatlarni faqat konstruktorda emas, balki dasturning istalgan qismida belgilashingiz mumkin. Masalan, yosh maydonini alohida setAge() nomli funksiyaga belgilaymiz:

class Shaxs {
String ism;
late int yosh;
Shaxs(this.ism);

void setAge(int yosh){
if(yosh > 0 && yosh < 111) this.yosh = yosh;
else this.yosh = 18;
}
void display() => print("Ismi: $ism \nYoshi: $yosh");
}
void main (){
Shaxs talaba = Shaxs("Husanboy");
talaba.setAge(20);
talaba.display();
}
>> Ismi: Husanboy >> Yoshi: 20

Shu bilan birga, agar biz avval ishga tushirishda ularning qiymatini olishga harakat qilsak, o'zgaruvchilarning kechiktirilgan ishga tushirilishi xatolik berishi mumkin:

Shaxs talaba = Shaxs("Husanboy");
talaba.display();
>> Unhandled exception: LateInitializationError: Field 'yosh' has not been initialized

Bunda hali yosh maydoni ishga tushirilagani uchun uni topa olmaydi.

Ishlashni optimallashtirish

Late ham ishlashni optimallashtirish kabi foydali tomoniga ega. Masalan, quyidagi kodni oling:

class Sayt {
String nom;
late int yosh = getDefaultAge();

Sayt(this.nom);
void display() => print("Nom: $nom \nYosh: $yosh");
}

int getDefaultAge() => 2;

void main (){
Sayt sayt = Sayt("Uzbekdevs");
print(sayt.yosh);
}
>> Uzbekdevs

Bu yerda yosh o'zgaruvchisining qiymati qiymat qaytaradigan getDefaultAge tashqi funksiyasi yordamida ishga tushiriladi. Ammo bu dastur bajarilganda, yosh o'zgaruvchisi aslida ishga tushirilmaydi. Nega? Chunki, asosiy usulda yosh o'zgaruvchisiga to'g'ridan-to'g'ri yoki bilvosita kirish imkoni yo'q, bu kerak ham emas. Shuning uchun, late kalit so’zdan foydalanish tufayli ishga tushirilmaydi. Kechiktirilgan o'zgaruvchilar faqat birinchi marta murojaatda ishga tushiriladi. Shunday qilib, agar ishga tushirish jarayoni juda ko'p resurslarni talab qilsa va dasturni bajarish jarayonida o'zgaruvchining o'zi kerak bo'lmasa, late dan foydalanish foydali bo'lishi mumkin.

Late konstantalar

Late so'zi kechiktirilgan tarzda ishga tushirilgan doimiylarni aniqlash uchun final bilan ham birlashtirilishi mumkin. Masalan:

class Shaxs {
final String ism;
late final int yosh;
Shaxs(this.ism);

void setAge(int yosh){
if(yosh > 0 && yosh < 111) this.yosh = yosh;
else this.yosh = 18;
}
void display() => print("Ismi: $ism \nYoshi: $yosh");
}
void main (){
Shaxs talaba = Shaxs("Husanboy");
print(talaba.ism);
talaba.setAge(20);
talaba.display();
}
>> Husanboy >> Ismi: Husanboy >> Yoshi: 20

Oddiy final kabi konstantalardan farqli o'laroq, late ishga tushirish konstantalari deklaratsiyada yoki konstruktorning ishga tushirish ro'yxatidan foydalanishda ishga tushirilishi shart emas. Late konstantaga obyekt yaratilgandan so'ng dasturning istalgan qismida qiymat berilishi mumkin. Yagona cheklov shundaki, bu faqat bir marta amalga oshirilishi mumkin. Agar dasturni qayta tayinlashga harakat qilsangiz, u xatoga yo'l qo'yadi va quyidagicha xatoga duch kelasiz: