MrJazsohanisharma

Belajar Pemrograman Dart: Paradigma OOP

{tocify} $title={Daftar Isi}

Pendahuluan:

Paradigma object-oriented programming pada dasarnya memiliki empat pilar, yaitu:
  • Abstraksi
  • Enkapsulasi
  • Inheritance, dan
  • Polimorfisme
Empat pilar tersebut merupakan landasan penting saat membangun sebuah class objek sehingga rancangan dari sebuah objek dapat dibaca dengan jelas oleh tim yang terlibat dalam pengembangan.

Abstraksi:

Abstraksi merupakan mekanisme dari salah satu pilar oop di mana sebuah class dibuat private yang bertujuan untuk meminimalisir kompleksitas program, anda tidak dapat membuat instance / objek dari sebuah class abstrak untuk itu class abstrak biasanya dijadikan sebagai parent class untuk melakukan inisialisasi atribut berserta fungsi-fungsinya yang akan diimplementasi ke class turunannya, untuk menginisialisasi class abstract di Dart anda bisa menggunakan keyword abstract sebelum keyword class, contohnya sebagai berikut:

///File ini adalah contoh abstraksi class di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
//Format dasar:
abstract class NamaKelas{
//lakukan sesuatu
}
//Contoh:
abstract class Kendaraan {
Kendaraan(jenis) {
print("Jenis Kendaraan: $jenis");
}
}
view raw abstract.dart hosted with ❤ by GitHub

Dikarenakan pada constructor dari class abstract di atas memiliki parameter "jenis" maka class turunannya perlu mengakses parameter tersebut, anda dapat menggunakan keyword super untuk mengakses atribut "jenis" di mana ada dua cara untuk menggunakan keyword super, adapun contohnya sebagai berikut:

///File ini adalah contoh parameterized dan non-parameterized super keyword
///properti geekasmedia.blogspot.com
//parameterized super keyword
class Mobil extends Kendaraan {
Mobil(super.jenis) {
print("Jenis Mobil: ");
}
}
//non parameterized super keyword
class Mobil extends Kendaraan {
Mobil(String? merk) : super("Mobil") {
print("Merk Mobil: $merk");
}
}
view raw superkey.dart hosted with ❤ by GitHub

Encapsulation:

Enkapsulasi merupakan suatu metode dalam paradigma oop untuk membatasi akses pada atribut / field pada sebuah class yang bertujuan untuk menjamin keamanan data agar tidak mengalami perubahan akibat akses langsung atau kesalahan yang tidak disengaja contohnya saja sebagai berikut:

Transparansi tersebut tidak baik untuk program karena jika anda bekerja yang terdiri dari beberapa tim dan anda atau salah satu dari tim anda melakukan kesalahan karena mengakses atribut tersebut maka tentu akan mempengaruhi program anda, enkapsulasi dapat meminimalisir kesalahan tersebut, untuk melakukan enkapsulasi di bahasa Dart anda perlu menggunakan simbol garis bawah / underscore ( _ ), contohnya sebagai berikut:

///File ini adalah contoh melakukan encapsulation di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
abstract class Kendaraan{
String? _merk;
}

Setelah membuat atribut menjadi private anda belum bisa menggunakan atribut tersebut karena atribut tersebut tidak dapat di akses langsung maka sebagai gantinya anda akan membutuhkan method khusus yang bersifat public yaitu method setter yang digunakan untuk menampung / memberikan nilai ke field dan getter untuk mengambil / mengakses nilai dari suatu field, anda juga bisa menggunakan keyword set atau get yang dapat diikuti dengan tipe data kembalian (return) atau tanpa tipe kembalian (void), adapun contohnya sebagai berikut:

///File ini adalah contoh penggunaan method setter dan getter di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
abstract class Kendaraan {
//enkapsulasi
String? _jenis;
//method setter tanpa tipe kembalian (void)
void setType(String? type) {
_jenis = type;
}
//method setter dengan tipe kembalian (return)
String? setType2(String? type) {
_jenis = type;
return type;
}
//method getter
String? get type {
return _jenis;
}
//constructor
Kendaraan({required setType}) {
print("Jenis Kendaraan: $setType");
}
}
//class turunan
class Mobil extends Kendaraan {
Mobil(merk) : super(setType: "Mobil") {
print("Merk Mobil: $merk");
}
}
view raw setoget.dart hosted with ❤ by GitHub

Pada dasarnya dalam membuat method setter adalah sama sebagaimana anda membuat method biasa di mana anda dapat menggunakan tipe kembalian (return) atau tanpa tipe kembalian (void) namun untuk method getter jika berupa void maka anda harus mendeklarasikannya tanpa parameter dan selalu membutuhkan tipe kembalian, dengan demikian jika anda ingin memberikan nilai ke sebuah objek maka method setter yang anda gunakan bukan atribut dari class objek dan untuk mengambil nilainya dapat menggunakan method getter, contohnya sebagai berikut:

main() {
Mobil acanza = Mobil("Toyoti");
//akses method setter
acanza.setType("Mitshubatsa");
//akses method getter
print("Mitshubtasha: ${acanza.type}");
acanza;
}
view raw main.dart hosted with ❤ by GitHub

Dengan menggunakan method setter anda dapat memastikan keamanan data yang diterima oleh sebuah field, misalnya saja anda ingin memastikan sebuah field hanya dapat menerima angka positif sehingga jika user memasukan berapapun nilai negatif maka nilai tersebut akan selalu berganti menjadi positif, contohnya sebagai berikut:


Selain membuat method setter anda juga dapat membuat properti setter yang tujuannya sama sebagaimana method setter hanya saja tidak memiliki tipe kembalian dan tanpa menggunakan keyword void, selain itu anda juga dapat mempersingkat method getter dengan menggunakan arrow notation, contohnya sebagai berikut:

///File ini adalah contoh pendefinisian property setter di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
abstract class Kendaraan {
//enkapsulasi
String? _jenis;
//properti setter
set type(String? tipe) {
_jenis = tipe;
}
//method getter dengan arrow notation
String? get tipe => _jenis;
}

Inheritance:


Sebuah class dalam paradigma oop umumnya dapat menerapkan mekanisme inheritance atau pewarisan/penurunan di mana arti sebenarnya dari pewarisan adalah mengakses properti dan fungsi-fungsi yang ada pada suatu class untuk di implementasikan kepada class yang lain sehingga terbentuk menjadi sebuah hierarki class sebagaimana ilustrasi gambar di atas, inheritance sangat membantu ketika anda perlu membuat sebuah blueprint objek yang kiranya memiliki kesamaan sebagaimana contoh-contoh di atas sebelumnya, yaitu class Kendaraan dapat mewarisi setiap properti dan fungsi yang ada di dalamnya untuk di implementasikan ke class yang lain karena memiliki kesamaan, hal tersebut jauh lebih efisien ketimbang membuat banyak class yang sekiranya memiliki kesamaan karakteristik.

Bayangkan saja jika anda memiliki dua blueprint yang sekiranya memiliki kesamaan antara mobil dan motor di mana keduanya memiliki properti seperti merk kendaraan, warna, kecepatan min/max, cc, dll maka ketimbang anda membuat dua class yang hampir mirip dan mendeklarasikan ulang atribut yang sama lebih baik anda membuat satu buah class untuk menjadi parent class sehingga dapat mewarisi properti/fungsi yang ada di dalamnya. 

Penggunaan:

Inheritance di dalam bahasa pemrograman Dart dapat menggunakan beberapa keyword, diantaranya:

  • Extends:

keyword extends dapat mewariskan properti dan method yang ada pada parent class di mana class child memiliki akses penuh ke class parent, jika class parent tidak memiliki field atau method apapun alias hanya berupa class kosong maka pewarisan extends tetap dapat dilakukan, class child juga tidak harus mengimplementasikan setiap field dan method yang ada di class parentnya, contohnya sebagai berikut:

///File ini adalah contoh pewarisan dengan extends di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
class Contoh{
String? properti;
void contoh(){}
}
class Contoh2 extends Contoh{
//child class kosong
}
view raw extends.dart hosted with ❤ by GitHub

Jika class parent memiliki constructor dengan penggunaan keyword required atau this maka class child perlu mengakses constructor dari class parentnya dengan menggunakan keyword super, contohnya sebagai berikut:

///File ini adalah contoh pewarisan dengan extends di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
class Contoh{
String? properti;
Contoh({required this.properti}){
print("properti");
}
}
class Contoh2 extends Contoh{
Contoh2() : super(properti: "proper");
}

  • Implements:

Jika anda ingin mewarisi sebuah class yang identik dengan class parentnya anda dapat menggunakan keyword implements di mana class child perlu menulis ulang / mengimplementasikan setiap field, method, setter / getter yang ada di dalam class parentnya sebagaimana contoh berikut:

///File ini adalah contoh pewarisan dengan implements di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
class Contoh{
String? properti;
void contoh1(){
}
void contoh(){
}
}
class Contoh2 implements Contoh{
String? properti;
//method berikut belum di implementasi
//silahkan hapus tanda komentar
// void contoh1(){
// }
// void contoh(){
// }
}
view raw implements.dart hosted with ❤ by GitHub

Lalu dari contoh di atas mengapa anda mendapat pesan "Annotate overriden members"? Anotasi override digunakan oleh Dart analyzer yang dimaksudkan untuk memberikan peringatan terhadap beberapa potensi masalah program yang sebenarnya dinyatakan valid sehingga anotasi ini tidak memberikan dampak apapun namun pada best practicenya anda perlu menambah keyword @override, anotasi tersebut berlaku untuk method, getter / setter dan variable (field) pada class child dengan pewarisan implements, contohnya sebagai berikut:

///File ini adalah contoh penggunaan anotasi override di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
class Contoh{
String? properti;
void contoh1(){
print("A");
}
void contoh(){
}
}
class Contoh2 implements Contoh{
@override
String? properti;
@override
void contoh1(){
print("C");
}
@override
void contoh(){
print("O");
}
}
view raw override.dart hosted with ❤ by GitHub
  • With (Mixin) dan On:
Mixin digunakan untuk menambahkan kemampuan dari suatu atau beberapa class ke class utama anda, ilustrasinya mirip seperti sebuah adonan kue di mana anda dapat menambahkan bahan-bahan lainnya, anda dapat menggunakan keyword with diikuti dengan satu atau beberapa nama class lainnya atau bisa dengan keyword mixin diikuti dengan penggunaan keyword On dan satu atau beberapa nama class, contohnya sebagai berikut:

///File ini adalah contoh penggunaan with dan mixin di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
class Bumbu1{
//lakukan sesuatu
}
class Bumbu2{
//lakukan sesuatu
}
class Bumbu3 extends Bumbu1{
Bumbu3(){
//lakukan sesuatu
}
}
class Bumbu4 extends Bumbu2{
}
class Bumbu5 with Bumbu1, Bumbu2{
Bumbu5(){
//lakukan sesuatu
}
}
mixin Bumbu6 on Bumbu3, Bumbu4, Bumbu5{
}
view raw mixin.dart hosted with ❤ by GitHub

Jika anda menggunakan with maka pastikan pada class yang akan anda gunakan dengan with tidak memiliki constructor dan bukan merupakan class pewarisan dengan menggunakan keyword extends sedangkan mixin dan on, anda dapat mengkombinasikan keduanya di mana anda dapat menambahkan class yang merupakan class pewarisan.

Macam-macam bentuk inheritance:

Inheritance juga memiliki beberapa macam bentuk, diantaranya sebagai berikut:
  • Single inheritance - Hanya memiliki satu pewarisan / pewarisan tunggal:
///File ini adalah contoh dari single inheritance atau pewarisan tunggal di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
class Kendaraan{
void cetak(){
print("Kendaraan");
}
}
class Mobil extends Kendaraan{
@override
void cetak(){
print("Kendaraan");
}
}

  • Multiple inheritance - Pewarisan dari satu atau beberapa class sekaligus
///File ini adalah contoh dari multiple inheritance di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
//parent class
class Kendaraan{
void cetak(){
print("Kendaraan");
}
}
//child class 1
class Mobil extends Kendaraan{
@override
void cetak(){
print("Kendaraan");
}
}
//multiple inheritance
class Motor extends Kendaraan implements Mobil{
@override
void cetak(){
print("Kendaraan");
}
}

  • Multi-level inheritance - Pewarisan dari pewarisan yang lain (bertingkat)
///File ini adalah contoh dari multi-level inheritance di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
class Kendaraan{
void cetak(){
print("Kendaraan");
}
}
class Mobil extends Kendaraan{
@override
void cetak(){
print("Kendaraan");
}
}
class Sedan extends Mobil{
@override
void cetak(){
print("Kendaraan");
}
}

  • Hierarki inheritance - Pewarisan yang membentuk hierarki tertentu
///File ini berisikan contoh dari hierarchical inheritance
///properti geekasmedia.blogspot.com
class Kendaraan{
void cetak(){
print("Kendaraan");
}
}
class Mobil extends Kendaraan{
@override
void cetak(){
print("Kendaraan");
}
}
class Motor extends Kendaraan{
@override
void cetak(){
print("Kendaraan");
}
}

Polimorfisme:

Suatu class yang memungkinkan untuk memiliki banyak pewarisan maka disebut sebagai polimorfisme, tidak ada keyword khusus yang digunakan untuk menginisialisasi polimorfisme, adapun contohnya sebagai berikut:

///File ini adalah contoh dari polimorfisme di bahasa pemrograman Dart
///properti geekasmedia.blogspot.com
class Kendaraan{
//lakukan sesuatu
}
class Mobil extends Kendaraan{
//lakukan sesuatu
}
class Traktor extends Kendaraan implements Mobil{
//lakukan sesuatu
}
class Motor extends Kendaraan{
//lakukan sesuatu
}
class MotoGP extends Kendaraan implements Motor{
//lakukan sesuatu
}


Bayu Radityo

Seorang lulusan teknik informatika yang senang dalam berbagi ilmu pengetahuan, dan membuat karya digital berupa photomanipulation dan digital drawing. instagram external-link

Posting Komentar

Lebih baru Lebih lama