Dartda Equatable class uning ishlatilishi

Dartda Equatable class uning ishlatilishi

Ashurova Lobar
Equatable


Androiddan Flutterga o'tgan har bir dasturchi borki unga kotlindagi data class larning qadri dart da kod yozayotganida bilinadi. Ya'ni kotlindagi data class larda default holatda equal, hashcode va copy metodlari override qilingan bo'ladi.

Endi bir misolni ko'raylik:

class Person {
  const Person(this.name);

  final String name;
}
void main() {
  final Person bob = Person("Bob");
  print(bob == Person("Bob")); // false
}

Ko'rib turganimizdek, ikkala obyektning ham maydonlari bir xil bo'lsada false qiymat olayapmiz. Buni bartaraf etish uchun, classimzning uchun == va hashCode metodlarini override qilamiz va quyidagicha yozamiz:

class Person {
  const Person(this.name);

  final String name;

  @override
  bool operator ==(Object other) =>
    identical(this, other) ||
    other is Person &&
    runtimeType == other.runtimeType &&
    name == other.name;

  @override
  int get hashCode => name.hashCode;
}

Albatta applicationdagi har bir obyektlari taqqoslanadigan model classlar uchun bunaqa yozib chiqish(ayniqsa ularning maydoni ko'p bo'lsa) yaxshigina qiyinchilik tug'diradi.

Endi, shu ko'p bir xil kodlarni oldini oladigan, dasturchilarni ishini yengillashtirib beradigan Equatable packagei haqida gaplashamiz.

Bu package, equal va hashCode larni o'zi override qiladi va hech qanday kodni qo'lsa generatsiya qilish shart emas.

Bu package ni ishlatish uchun pubspec.yaml filega:

dependencies:
  equatable: ^2.0.0

ni qo'shamiz va

# Dart
pub get

# Flutter
flutter packages get

larni terminal da run beramiz.

Endi ishlatmoqchi bo'lgan classimizni Equatable abstract classidan voris olishi kerak bo'ladi va unda bitta metod override qilinishi zarur bo'ladi:

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  const Person(this.name);

  final String name;

  @override
  List<Object> get props => [name];
}

Jsonlar bilan ishlaganda esa:

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  const Person(this.name);

  final String name;

  @override
  List<Object> get props => [name];

  factory Person.fromJson(Map<String, dynamic> json) {
    return Person(json['name']);
  }
}

Endi biz bemalol hech qanday uzun kod generatsiyalarsiz 1 ta klassdan olingan obyektlarni taqqoslashimiz mumkin.

Bu package toString() methodini override qilish va const constructorlarni ham qo'llab quvvatlaydi.

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  const Person(this.name);

@override
  bool get stringify => true;


  final String name;

  @override
  List<Object> get props => [name];
}


Bundan tashqari Equatable Config orqali stringify metodini Equatablening har bir instance lari uchun boshqarish mumkin:

EquatableConfig.stringify = true;

Agar ma'lum bir Equatable sinfi uchun stringify metodi override qilingan bo'lsa, EquatableConfig.stringify qiymati e'tiborga olinmaydi. Boshqacha qilib aytganda, local konfiguratsiya har doim global konfiguratsiyadan ustun turadi.


Eslatma: EquatableConfig.stringify debug holatda true, release holatda esa false qiymat qaytaradi.

Endi bir savol tug'iladi:

Agar classimiz boshqa classdan voris olib qo'ygan bo'lsa-chi, axir dartda class faqat bitta boshqa classdan voris olishi mumkin-ku?

Bu holatda EquatableMixin dan foydalaniladi. U ham Equatable abstract classi bilan bir xil ishlaydi.

class EquatableDateTime extends DateTime with EquatableMixin {
  EquatableDateTime(
    int year, [
    int month = 1,
    int day = 1,
    int hour = 0,
    int minute = 0,
    int second = 0,
    int millisecond = 0,
    int microsecond = 0,
  ]) : super(year, month, day, hour, minute, second, millisecond, microsecond);

  @override
  List<Object> get props {
    return [year, month, day, hour, minute, second, millisecond, microsecond];
  }
}

Bundan tashqari bu package ni mashxur state managementlar hisoblangan Provider va Bloc larda ham state ning yangilanishdan oldingi va keyingi holatlarini taqqoslash uchun ishlatsak bo'ladi.

Performance(ishlash tezligi) taqqoslanuvi:

Siz bu package ni ishlatganda application performance iga qanaqa ta'sir qilishi haqida o'ylashingiz mumkin: Equatable.

Natijalar(10 marta rundagi o'rtacha hisobda)

A=A (tenglik taqqoslanganda)

Class Runtime (μs)

Qo'lda 0.193

Bo'sh Equatable 0.191

Gibrid Equatable 0.190

Instancelar(obyektlar) A()

Class Runtime (μs)

Qo'lda 0.165

Bo'sh Equatable 0.181

Gibrid Equatable 0.182




Ko'proq maqolalar uchun: https://t.me/just_android_blog

LinkedIn: www.linkedin.com/in/lobar-ashurova-9a053b259

Foydalanilgan manbaalar: https://pub.dev/packages/equatable

https://dev.to/arkroot/equatable-package-in-dart-3f7l

maqola


Report Page