Umumiy

Statik, final, const, dinamik, var – ning farqlari va o’xshashliklari

Dart – bu juda batafsil, statik tarzda yozilgan til. U sizga dasturchi sifatida o’zingiz xohlagan narsani aniq ifodalash imkonini beradigan turli xil kalit so’zlarni taklif etadi.

Ayniqsa, o’zgaruvchi biriktirish haqida gap ketganda, o’xshash, ammo boshqacha ma’noga ega bo’lgan bir nechta kalit so’zlar mavjud. Keling, ushbu kalit so’zlarni ko’rib chiqamiz va ular aniq nima qilishini tushunishga harakat qilamiz.

“static” kalit so’zi

static kalit so’zi o’zgaruvchilarni class o’zgaruvchilariga va usullarni class usullariga aylantirishi mumkin. Buning ma’nosi shundaki, o’zgaruvchi yoki usul classning namunasi emas, balki classga tegishli.

Boshqacha qilib aytganda: faqat class darajasidagi o’zgaruvchilar va usullar uchun static ishlatiladi. U ob’ekt yaratmasdan, faqat classga murojaat qilish orqali kirish mumkin bo’lganlarni aniqlaydi.

Siz undan shunday foydalanishingiz mumkin:

class MyClass {
  static int myInt = 1337;
}

int myNewInt = MyClass.myInt + 3;

Java-dan farqli o’laroq, siz statikdan “static class” yoki “static block” yaratish uchun foydalana olmaysiz. Bundan tashqari, class kontekstidan tashqarida foydalanish mumkin emas . Keling, uni class kontekstidan tashqarida ishlatishga harakat qilsak nima bo’lishini ko’rib chiqaylik.

void main() {
  static int myNumber = 6;
}

Yuqoridagi kod qismini kompilyatsiya qilmoqchi bo’lganimizda, kompilyator quyidagicha javob beradi:

Error: Can't have modifier 'static' here.
  static int myNumber = 6;
  ^^^^^^

Shuni yodda tutingki, statik o’zgaruvchilar va usullar ob’ektga yo’naltirilgan dasturlashni buzadi . Aniqroq qilib aytadigan bo’lsak, bu ob’ektlarda ma’lumotlarning inkapsulyatsiya qilinishiga qarshi.
Statik usullarni meros qilib olish yoki bekor qilish mumkin emas.
Bundan tashqari, statik o’zgaruvchilar dastur ishlaguncha xotirada qoladi, ob’ekt axlat yig’ilgandan so’ng misol o’zgaruvchilari xotirasi bo’shatiladi .

Bundan tashqari, faqat statik a’zolarni o’z ichiga olgan sinfni belgilashdan qochishingiz kerak. Buning o’rniga yuqori darajadagi funktsiyalardan foydalanishingiz mumkin.

Foydalanish holatlari

Garchi qat’iy OOP nuqtai nazaridan, static dan foydalanish ko’pincha yomon fikr bo’lishi mumkin bo’lsa-da, siz undan deyarli foydalana olmaydigan holatlar mavjud.

Bunday holatlardan biri izolatlardan foydalanishdir .

Izolyatsiyalar Dartda haqiqiy parallellikni amalga oshirishning bir usuli hisoblanadi . Dart’s VM ichidagi hamma narsa izolyatsiyada ishlaydi. Har bir izolyatsiyada alohida hodisa tsikli va izolyatsiya qilingan xotira to’plami mavjud. Agar sizda asosiy tarmoqqa katta yuk bo’ladigan og’ir hisoblash kodingiz bo’lsa, buning oldini olish uchun izolyatsiyalardan foydalanishingiz mumkin. Yangi izolyatsiyani yaratuvchi funktsiyaga o’tgan funktsiya spawn()yuqori darajadagi funksiya (bu classdan tashqarida ekanligini anglatadi) yoki statik usul bo’lishi kerak. Agar siz funktsiya classning bir qismi bo’lishini istasangiz, uni statik qilishdan cheklanasiz.

“final” kalit so’zi

final— bir martalik biriktirish semantik maʼnosiga ega boʻlgan kalit soʻz. U aniq bir marta tayinlanishi kerak (agar u ishlatilsa).

Agar biz biriktirilmagan final o’zgaruvchini aniqlasak, kompilyator foydalanishda shikoyat qiladi.

final int myNumber;
print(myNumber);

Natijada kompilyator xatosi chiqadi:

Error: Final variable 'myNumber' must be assigned before it can be used.
  print(myNumber);

Agar biz final ni bir necha marta tayinlaydigan o’zgaruvchini aniqlasak, kompilyator yana shikoyat qiladi:

final int myNumber = 7;
myNumber = 3;

Ushbu kod bloki quyidagi kompilyator xatosiga olib keladi:

Error: Can't assign to the final variable 'myNumber'. myNumber = 3; ^^^^^^^^ Error: Compilation failed.

Topshiriq ishga tushirish vaqtida darhol amalga oshishi muhim emas, shuning uchun bu xuddi shunday ta’sirga ega bo’ladi:

final int myNumber;
myNumber = 7;
myNumber = 3;

 final kalit so’zi ishlatilgan o’zgaruvchilar ortidagi g’oya shundan iboratki, kompilyator sizni o’zgaruvchining tasodifiy qiymati o’zgarishi holatlaridan saqlaydi, siz allaqachon qiymat o’zgarmasligini bilsangiz ham.

Avvaliga har bir o’zgaruvchini final qilish yaxshi amaliyotdir . Ish vaqti davomida uning qiymatini o’zgartirishingiz kerakligini tushunganingizda, keyin kalit so’zlarni olib tashlashingiz mumkin. Bu rasmiy linter ham shikoyat qiladigan narsa.

Yodda tutingki, final ishlatganda o’zgaruvchining turini yoki qiymatini o’zgartirish paytida birinchi tayinlashdan keyin qayta tayinlash mumkin emas. Biroq, bu ob’ektni o’zgarmas (immutable) qilmaydi!

Keling, quyidagi misolni ko’rib chiqaylik:

final myNumbers = [1,2,3,4];
myNumbers.add(5);
myNumbers = 'a different type';

Yuqoridagi kod misolidagi kabi turni belgilamasangiz, kompilyator o’zgaruvchini birinchi tayinlash turiga aylantiradi ( List<int> bu holda). add() usulini ishlatish muammosiz, sababi myNumbers o’zgarmas bo’lmasada, 3-qatordagi tayinlash muammo olib keladi, chunki final ishga tushirilgandan keyin keyingi qiymat biriktirilishlarini oldini oladi. Kodning bajarilishi quyidagi kompilyator xatosiga olib keladi:

Error: Can't assign to the final variable 'myNumbers'.
  myNumbers = 'a different type';
  ^^^^^^^^^
Error: Compilation failed.

“const” kalit so’zi

const yordamida kompilyatorga siz yaratmoqchi bo’lgan o’zgaruvchi qiymati o’zgarmas bo’lishi va shuning uchun kompilyatsiya vaqtida yaratilishi mumkinligini aytishingiz mumkin.

Aniqroq qilish uchun misolni ko’rib chiqaylik:

const List<int> myNumbers = <int>[1,2,3,4];
myNumbers.add(5);

Yuqoridagi kodning bajarilishi xatoga olib keladi:

Unhandled Exception: Unsupported operation: Cannot add to an unmodifiable list

Shuni ta’kidlash kerakki, bu xato kompilyatsiya vaqtida emas, balki ishlash vaqtida paydo bo’ladi, bu biroz chalkash, chunki kompilyatsiya vaqtida bu muvaffaqiyatsiz bo’lishini oldindan bilish mumkin. Bu masala GitHub’da ham muhokama qilingan.

“var” va “dynamic” kalit so’zlari

Dart statik tarzda yozilgan til bo’lsa-da, bizda dinamik tipdagi o’zgaruvchini belgilash imkoniyati mavjud. Buning uchun ishlatiladigan kalit so’z var deyiladi. Agar siz Javascript yoki Kotlinni bilsangiz, ushbu kalit so’zni bilishingiz mumkin.

“var” kalit so’zi yordamida o’zgaruvchini belgilash 2 ta holatga olib keladi:

  • O’zgaruvchining dastlab aniqlanmagan turi ( dynamic)
  • O’zgaruvchiga qiymat tayinlangandan so’ng, u qiymat turini oladi, keyin uni o’zgartirib bo’lmaydi.
var myVar = 7;
myVar = 'seven';

Bu ish vaqtida quyidagi xatolikka olib keladi:

Error: A value of type 'String' can't be assigned to a variable of type 'int'.
myVar = 'seven';
        ^
Error: Compilation failed.

Obyektni “dynamic” ga “cast” qilish orqali siz uning istalgan metodlaridan foydalana olishingiz mumkin. Lekin “var” ga “cast” qilib bunday natijaga erisha olmaysiz. Sababi “var” hech qanday tip emas.

(myObject as dynamic).whatever(); // Bu to'g'ri cast, shu uchun compiler indamaydi
(myObject as var).whatever(); // Bu esa noto'g'ri cast, sababi var tip emas

Agar siz o’zgaruvchiga tip biriktirishda “var” emas “dynamic” kalit so’zidan foydalansangiz ham o’xshash natijaga erishishingiz mumkin, lekin “dynamicdan” dan farqli o’laroq, “var” ishlatganingizda, o’zgaruvchiga dastlabki qiymatni berganingizdan so’ng, u shu tipni o’zlashtiradi va qayta o’zgartirishga yo’l qo’ymaydi.

dynamic myNumber = 1;   // myNumber ning tipi int.
myNumber = 2;           //Biriktirish o'zgaruvchi qiymatini 1 dan 2 ga o'zgartiradi.
myNumber = 'a';      // Biriktirish o'zgaruvchi qiymatini 2 dan 'a' ga o'zgartiradi.

var myNumber = 1;       // myNumber ning tipi int.
myNumber = 2;        // Biriktirish o'zgaruvchi qiymatini 1 dan 2 ga o'zgartiradi.
myNumber = 'a';         // Xatolik => Error: A value of type 'String' can't be assigned to a variable of typ

Xulosa

Dasturlash tilini o’zlashtirish uchun dasturchi asosiy kalit so’zlarning aniq ma’nosini va ulardan qachon va qanday foydalanish kerakligini bilishi kerak.

Dart juda murakkab turdagi tizimga ega bo’lganligi sababli, ushbu mavzu atrofida aylanadigan bir nechta kalit so’zlar haqida siz bilan gaplashdik.

Men har doim “statik” belgilashdan foydalanishni tavsiya qilaman. (Batafsil)
Shunda siz ushbu (“var” va “dynamic”) kalit so’zlar bilan bog’liq bo’lgan barcha muammolardan xalos bo’lishingiz mumkin.

final har bir yangi belgilangan o’zgaruvchi uchun “default” bo’yicha ishlatilishi kerak, chunki u dasturchini o’zgaruvchilarning istalmagan qayta tayinlanishidan himoya qiladi.

const dan qiymat kompilyatsiya vaqtida ma’lum bo’lsa va hech qachon o’zgarmasa ishlatilishi kerak. Statik tarkibga ega vidjetlar uchun ham yaxshi tanlov.

Telegramdagi kanalimizga qo’shiling: @flutterblogs

Prev Next