Menu
CoddyTech

Extension method

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 83 dari 110.

Terkadang kamu ingin menambahkan fungsionalitas ke class yang bukan milikmu, seperti tipe String atau int bawaan Dart. Kamu tidak bisa mengubah kode sumbernya, dan pewarisan tidak membantu untuk class final. Di sinilah extension methods berperan.

Ekstensi memungkinkan kamu menambahkan method baru ke tipe yang sudah ada tanpa mengubahnya atau membuat subclass:

extension StringExtras on String {
  String reverse() {
    return split('').reversed.join('');
  }
  
  bool get isPalindrome {
    var cleaned = toLowerCase().replaceAll(' ', '');
    return cleaned == cleaned.split('').reversed.join('');
  }
}

void main() {
  print('hello'.reverse());        // olleh
  print('radar'.isPalindrome);     // true
}

Sintaksnya adalah extension ExtensionName on Type. Di dalamnya, kamu mendefinisikan method dan getter seperti pada class biasa. Setelah didefinisikan, method ini muncul pada semua instance tipe tersebut seolah-olah sudah tersedia secara bawaan.

Extension berfungsi pada tipe apa pun, termasuk class milikmu sendiri dan tipe generik:

extension IntExtras on int {
  int squared() => this * this;
}

extension ListExtras<T> on List<T> {
  T? get secondOrNull => length >= 2 ? this[1] : null;
}

void main() {
  print(5.squared());                    // 25
  print([1, 2, 3].secondOrNull);         // 2
}

Perhatikan bahwa di dalam extension, this merujuk pada instance tempat method dipanggil. Extension adalah cara yang rapi untuk meningkatkan tipe yang sudah ada sambil menjaga kodemu tetap teratur dan mudah dibaca.

challenge icon

Tantangan

Mudah

Mari tingkatkan tipe bawaan Dart dengan fungsionalitas yang berguna menggunakan method extension! Kamu akan membuat extension yang menambahkan method berguna ke tipe String dan List, lalu menggunakannya di file utama.

Kamu akan mengatur kodemu ke dalam dua file:

  • extensions.dart: Buat dua extension yang menambahkan kemampuan baru ke tipe yang sudah ada:
    • Extension bernama StringUtils pada String dengan:
      • Method countVowels() yang mengembalikan jumlah huruf vokal (a, e, i, o, u, tanpa membedakan huruf besar dan kecil) dalam string
      • Getter initials yang mengembalikan huruf pertama dari setiap kata (dipisahkan berdasarkan spasi), digabungkan dan diubah menjadi huruf besar. Contohnya, "hello world" menjadi "HW"
    • Extension bernama ListUtils<T> pada List<T> dengan:
      • Method safeGet(int index) yang mengembalikan elemen pada indeks tersebut jika ada, atau null jika indeks berada di luar batas
      • Getter hasMultiple yang mengembalikan true jika list memiliki lebih dari satu elemen
  • main.dart: Impor extension-mu dan tunjukkan cara kerjanya:
    • Buat string "Object Oriented Programming" dan cetak jumlah huruf vokalnya dengan format: Vowels: [count]
    • Cetak inisial dari string yang sama dengan format: Initials: [initials]
    • Buat list bilangan bulat [10, 20, 30]
    • Cetak hasil safeGet(1) dengan format: Element at 1: [value]
    • Cetak hasil safeGet(5) dengan format: Element at 5: [value]
    • Cetak apakah list memiliki beberapa elemen dengan format: Has multiple: [true/false]

Ingat, di dalam extension, this merujuk pada instance tempat method dipanggil. Extension-mu akan membuat tipe ini terasa seolah-olah memiliki method tersebut secara bawaan!

Output yang diharapkan:

Vowels: 9
Initials: OOP
Element at 1: 20
Element at 5: null
Has multiple: true

Coba sendiri

import 'extensions.dart';

void main() {
  // Buat string
  String text = "Object Oriented Programming";

  // TODO: Cetak jumlah huruf vokal menggunakan countVowels()
  // Format: Vowels: [count]

  // TODO: Cetak inisial menggunakan getter initials
  // Format: Initials: [initials]

  // Buat list bilangan bulat
  List<int> numbers = [10, 20, 30];

  // TODO: Cetak hasil safeGet(1)
  // Format: Element at 1: [value]

  // TODO: Cetak hasil safeGet(5)
  // Format: Element at 5: [value]

  // TODO: Cetak apakah list memiliki lebih dari satu elemen
  // Format: Has multiple: [true/false]
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online