Operator Kaskade Dart

Terdapat dua jenis sintaks kaskade: .. dan ?..

Lakukan beberapa penugasan properti dan pemanggilan metode secara berurutan pada objek yang sama, menghilangkan variabel sementara dan membuat kode lebih lancar serta terhubung.

Sintaks kaskade bukan operator, melainkan gula sintaks khusus milik Dart.

1. Kaskade Biasa ..

Gunakan ketika objek pasti tidak bernilai null

Semua operasi .. berlaku pada objek asli di awal, nilai balik dari setiap metode diabaikan.

Contoh resmi

import 'dart:ui';

void main() {
  // Penulisan dengan kaskade
  var paint = Paint()
    ..color = Colors.black
    ..strokeCap = StrokeCap.round
    ..strokeWidth = 5.0;

  // Penulisan terpisah yang setara (tanpa kaskade, perlu ulangi nama variabel)
  var paint2 = Paint();
  paint2.color = Colors.black;
  paint2.strokeCap = StrokeCap.round;
  paint2.strokeWidth = 5.0;
}Code language: JavaScript (javascript)

Contoh ini mengimpor pustaka dart:ui milik Flutter, hanya bisa dipakai di proyek Flutter. Karena kita membahas Dart murni, cukup pahami sintaks di atas. Contoh selanjutnya menggunakan kelas bawaan Dart murni yaitu StringBuffer.

Kelas manipulasi string: StringBuffer

void main() {
  // Sintaks kaskade
  var sb = StringBuffer()
    ..write("Hello ")
    ..write("FoxDevelop.com ")
    ..writeln("Cascade");

  print(sb.toString());

  // Versi setara tanpa kaskade
  var sb2 = StringBuffer();
  sb2.write("Hello ");
  sb2.write("FoxDevelop.com ");
  sb2.writeln("Cascade");
  print(sb2.toString());
}Code language: PHP (php)

Hasil eksekusi

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Hello FoxDevelop.com Cascade

Hello FoxDevelop.com CascadeCode language: CSS (css)

Sintaks di atas dipakai jika kamu yakin objek paint, sb, sb2 tidak akan pernah null: bisa menugaskan nilai dengan cepat tanpa mengulangi nama objek. Namun jika objek bernilai null, akan muncul error secara langsung.

void main() {

  var sb = null
    ..write("Hello ")
    ..write("FoxDevelop.com ")
    ..writeln("Cascade");

  print(sb.toString());
}Code language: JavaScript (javascript)

Oleh karena itu, tersedia cara penggunaan kedua seperti di bawah ini.

2. Kaskade Aman Null ?..

Jika objek bernilai null, seluruh rantai kaskade tidak akan dijalankan, sehingga menghindari error pointer null. Hanya bagian awal rantai pakai ?.., sisanya langsung pakai ...

void main() {

  var sb = null
    ?..write("Hello ")
    ..write("FoxDevelop.com ")
    ..writeln("Cascade");

  print(sb.toString());
}Code language: Dart (dart)

Perhatikan tanda tanya di depan ?..write(“Hello “)

Saat dikompilasi ulang, program berjalan normal

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
nullCode language: CSS (css)

Tidak ada error yang muncul

Berikut contoh resmi: pembaca cukup pahami bentuk sintaksnya saja.

// Mulai dengan ?.., setelahnya hanya pakai ..
document.querySelector('#confirm')
  ?..textContent = 'Confirm'
  ..classList.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'))
  ..scrollIntoView();

// Bentuk terpisah aman null yang setara
final button = document.querySelector('#confirm');
button?.textContent = 'Confirm';
button?.classList.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();Code language: JavaScript (javascript)

Kaskade Bersarang

final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      // Kaskade terpisah untuk objek dalam PhoneNumberBuilder
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();Code language: PHP (php)

Properti phone adalah objek yang dibuat dengan pemanggilan PhoneNumberBuilder() lalu diberi nilai.

Catatan Penting

Kaskade hanya bisa diterapkan pada instansi objek; jika diletakkan setelah metode yang mengembalikan void, akan terjadi error kompilasi.

var sb = StringBuffer();
sb.write('foo') // write mengembalikan void
  ..write('bar'); // Error: tipe void tidak punya metode writeCode language: Dart (dart)

Di sini kita membuat objek StringBuffer bernama sb terlebih dahulu

Tetapi perintah diakhiri titik koma sebelum memanggil fungsi write dari objek sb, dan fungsi write mengembalikan void sehingga tidak bisa dirangkaikan dengan ..write selanjutnya, kecuali write mengembalikan instansi objek.

Cara penulisan yang benar

var sb = StringBuffer()
  ..write('foo')
  ..write('bar');Code language: Dart (dart)

Ringkasan

  1. .. setiap operasi akan kembali ke objek utama awal, tidak menerima nilai balik metode. Fungsinya mirip rantai metode di bahasa lain seperti JavaScript.
  2. ?.. adalah kaskade aman null untuk mencegah error ketika objek bernilai null. Hanya dipakai di awal rantai, jika bagian awal berhasil dijalankan berarti objek tidak null sehingga bagian berikut tidak perlu pakai ?..
  3. Mendukung kaskade bersarang
  4. Tidak boleh menambahkan kaskade setelah metode yang mengembalikan tipe void
  5. .. bukan operator, melainkan gula sintaks milik Dart
Apa itu gula sintaks?

Gula sintaks adalah singkatan ringkas yang disediakan bahasa pemrograman untuk logika dasar yang sama pada tahap analisis sintaks; tidak menambah kemampuan baru ke bahasa. Kompiler atau interpreter akan otomatis mengubah singkatan ini menjadi kode standar setara sebelum menghasilkan kode perantara.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *