Flutter: Dart, bahasa yang penuh kemiripan dengan Javascript

Dart adalah bahasa yang cukup unik bagi saya, bagaimana tidak, bahasa pemrograman satu ini benar-benar membuat saya berkali-kali memastikan bahwa kode program yang saya lihat ini bukanlah potongan kode Java ataupun Javascript.

Dari sanalah Saya pikir bahwa Dart adalah bahasa yang menarik, berikut ini adalah pendapat saya dimana terdapat kemiripan syntax antara Dart dengan Java ataupun Javascript

Future VS Promise

Bagi kalian yang sudah paham betul tentang adanya Promise di Javascript, konsep ini ternyata juga di adopsi oleh Dart. Meskipun tidak seluruhnya, namun bagi kalian para programmer Javascript / NodeJS mungkin akan lebih memahami konsep Future jika mengetahui kemiripan cara kerjanya dengan Promise.

// Dart
Future<String> getName() =>
  Future.delayed(
    Duration(seconds: 2),
    () => 'Kresna',
  );

// Javascript
const getName = () =>
  Promise((res) => res('Kresna'))
Contoh kode Future dan Promise di Dart dan Javascript

Perbedaan paling mendasar ialah, Dart menggunakan keyword Future<T> untuk setiap fungsi atau operasi yang mengembalikan Future, sedangkan Javascript cukup mengembalikan objek Promise pada operasinya.

Karena tentunya perbedaan mendasar dari keduanya, dimana Dart merupakan bahasa static type dimana setiap penggunaan variabel atau objek harus menyertakan tipe datanya, sedangkan Javascript merupakan bahasa yang dinamis, dimana kita tidak perlu mendeklarasikan tipe data secara kongkrit karena sudah dibantu oleh VM.

Async Await

Karena konsep promise tadi (baca: Future di dart) diadopsi, maka adanya keyword Async dan Await agaknya tidak terlalu mengagetkan ya. Pada Dart kita dapat menggunakan keyword .then untuk menunggu proses yang dimaksud selesai, mirip seperti Promise().then() di Javascript.

Future<String> getName() async {
  final user = await db.getUser(this.id);
  return user.name;
}
Contoh Panggunaan Future di Dart

Namun kita bisa juga mengganti proses tadi dengan penggunaan async await pada fungsi-fungsi yang mengembalikan object Future.

Tipe Data Dynamic

Dart mempunyai satu tipe data yang cukup menarik, yaitu dynamic. Tipe data ini merupakan tipe data yang akan menyesuaikan dengan jenis data yang dibawanya, cukup menarik karena mirip seperti penggunaan any pada Typescript.

Hal yang perlu dicatat adalah, pada Dart sendiri sudah ada keyword var dimana hal tersebut mirip penggunaan dinamic namun berbeda dalam implementasi serta kebutuhannya.

Sebagai contoh dibawah ini merupakan kode yang valid.

void main() {
  var nama;
  
  nama = 'Kresna';
  print(nama); // Kresna
  
  nama = 18.5;
  print(nama); // 18.5
}
Penggunaan VAR pada Dart

Bila potongan kode diatas dijalankan, tidak ada sesuatu yang salah. Pada baris pertama akan mencetak Kresna dan 18.5 pada baris berikutnya.

Coba kita modifikasi kodenya menjadi seperti ini.

void main() {
  var nama = 'Kresna';
  print(nama); // Kresna
  nama = 18.5;
  print(nama); // error
}
Penggunaan VAR yang Salah pada Dart

Yang jika dijalankan akan memunculkan error A value of type 'double' can't be assigned to a variable of type 'String', mengapa?

Pada contoh pertama, penetapan jenis tipe data belum ditentukan alias secara non eksplisit kita membuat tipe data nama menjadi dynamic, oleh karena itu program dapat berjalan.

Sedangkan pada contoh selanjutnya kita menetapkan tipe data nama secara tidak langsung menjadi String (karena diisi dengan 'Kresna'), efeknya ketika di baris berikutnya diisi dengan 18.5 akan error, karena 18.5 merupakan tipe double.

Solusinya adalah kita menggunakan keyword dynamic tepat menggantikan keyword var di contoh sebelumnya.

void main() {
  dynamic nama = 'Kresna';
  print(nama); // Kresna

  nama = 18.5;
  print(nama); // 18.5
}
Penggunaan Dynamic secara Eksplisit

Functional with Object Oriented Support

Dart memerlukan kompilasi agar kode programnya dapat berjalan. Hal ini tentu saja berbeda dengan Javascript, namun mirip dengan C# atau Java.

Ilustrasi Kompiler - Photo by Danil Shostak / Unsplash

Pada bahasa ini kita disuguhkan dengan dukungan untuk menggunakan fungsi yang dinamis dan OO (Object Oriented) yang cukup membantu dalam merancang struktur dan alur kode program. Sebut saja deklarasi Extend, Interface sampai tipe Generic yang bisa kita gunakan.

class Person {
  String name;
  int age;
  
  Person({ this.name, this.age });
}

class Child extends Person {
  String interest;

  Child({ name, age, interest }) {
    this.name = name;
    this.age = age;
    this.interest = interest;
  }
}

void main() async {
  final Person p = new Person(name: 'Kresna', age: 60);
  final Child c = new Child(
    name: 'Ken',
    age: 2,
    interest: 'Car Toys',
  );
  print(p.name);
  print(c.interest);
}
Contoh Class dengan Extend pada Dart

Bila melihat contoh kode extends diatas, beberapa hal yang perlu dicatat adalah pada pada class yang melakukan extend atau child class, tidak akan membawa fungsi constructor yang sudah dibentuk oleh parent classnya, oleh karena itu pada contoh diatas kita mendeklarasikan kembali value untuk property name dan age pada constructor Child class.  

Mixins

Mekanisme yang mungkin cukup unik bagi saya dalam penggunaan OOP di Dart salah satunya adalah mixins. Pada bahasa Dart, keyword with digunakan untuk memasukan property dan methods ke suatu class melalui mekanisme mixins.

mixin HumanBehavior {
  String _hairColor;
  
  void speak(String words) {
    print(words);
  }
  
  String get hairColor => _hairColor;
}

class Human with HumanBehavior {
  Human({ String hairColor }) {
    this._hairColor = hairColor;
  }
}

class Person with HumanBehavior {
  String name;
  int age;

  Person({ String this.name, int this.age });
  
  void setHairColor(String color) {
    this._hairColor = color;
  }
}

void main() {
  Human h = new Human(hairColor: 'Brown');
  h.speak('Hello Im Human');
  print('My hair color is ${h.hairColor}');
  
  
  Person k = new Person(name: 'Kresna', age: 60);
  k.setHairColor('Yellow');
  print('${k.name} hair color is ${k.hairColor}');
}
Contoh penggunaan kode Mixins dengan Class

Hal yang perlu diperhatikan adalah pendeklarasian mixins tidak memerlukan constructor di dalamnya dan dengan mixins kita dapat mengkombinasikan satu atau lebih mixins ke dalam suatu class, dimana hal ini tentunya sangat mempermudah komposisi pembuatan suatu class di Dart.

Menurut saya itu dulu untuk hal-hal yang menarik mengenai kesamaan Dart dengan Javascript ataupun bahasa lainnya, di lain waktu akan saya update kembali jika menemukan hal menarik lainnya tentang Dart di artikel ini.