Skip to main content

Menulis Clean Code: Prinsip Liskov Substitution Principle (LSP) Pada SOLID

Prinsip Liskov Substitution Principle (LSP) Pada SOLID
Pada prinsip  Liskov Substitution Principle (LSP) objek dari subclass harus dapat menggantikan objek dari superclass tanpa mengubah keakuratan program. Hal ini mencegah adanya perilaku tak terduga ketika menggunakan turunan kelas.

Ilustrasi Prinsip Liskov Substitution Principle (LSP) Pada SOLID (Gak nyambung sih)

Java mendukung prinsip ini dengan polimorfisme. Jika Anda memiliki superclass atau interface, maka objek dari subclass harus dapat menggantikannya tanpa mengubah perilaku program. Misalnya, jika Rectangle adalah superclass, subclass Square harus memenuhi kontrak yang sama agar tidak ada efek samping yang tidak diinginkan saat digunakan.

Contoh Implementasi LSP Pada Java

Catatan: Rectangle = Persegi Panjang, dan Square = Kotak

Berikut adalah contoh kasus nyata penerapan Liskov Substitution Principle (LSP) dalam Java. Prinsip ini menyatakan bahwa subclass harus dapat menggantikan superclass-nya tanpa mengubah perilaku yang diharapkan. Artinya, objek dari kelas turunan harus bisa digunakan sebagai pengganti objek dari kelas induk tanpa masalah atau efek samping.

Misalkan kita memiliki sistem untuk menghitung area bentuk-bentuk geometris, seperti persegi panjang (Rectangle) dan persegi/kotak (Square). Kelas Rectangle awalnya dirancang sebagai berikut: 

public class Rectangle {
protected int width;
protected int height;

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

public int getArea() {
return width * height;
}
}

Masalah ketika Square Mewarisi Rectangle

 Ilustrasi untuk Square dan Rectangle

Kita mungkin berpikir untuk membuat Square sebagai subclass dari Rectangle, karena secara umum persegi adalah jenis persegi panjang dengan sisi yang sama panjang.
public class Square extends Rectangle {
@Override
public void setWidth(int width) {
this.width = width;
this.height = width; // memastikan lebar = tinggi
}

@Override
public void setHeight(int height) {
this.width = height; // memastikan lebar = tinggi
this.height = height;
}
}

Namun, ini melanggar prinsip LSP. Seorang pengguna mungkin mengharapkan Rectangle dan Square untuk berperilaku sama ketika diperlakukan sebagai Rectangle, tetapi Square tidak berperilaku seperti yang diharapkan. Misalnya, saat kita mencoba menetapkan lebar dan tinggi yang berbeda pada objek Square, ia akan mengubah kedua nilai secara bersamaan, yang bertentangan dengan perilaku Rectangle.

Contoh Pelanggaran LSP dalam Penggunaan

public class Main {
public static void main(String[] args) {
Rectangle rectangle = new Rectangle();
rectangle.setWidth(5);
rectangle.setHeight(10);
System.out.println("Area persegi panjang: " + rectangle.getArea()); // Output: 50

Rectangle square = new Square();
square.setWidth(5);
square.setHeight(10);
System.out.println("Area persegi: " + square.getArea()); // Output tidak sesuai: 100
}
}

Pada contoh di atas, kita mengharapkan square berperilaku seperti rectangle dan memberikan area 50 saat kita menetapkan lebar 5 dan tinggi 10, tetapi hasilnya adalah 100, karena Square mengatur lebar dan tinggi secara bersamaan. Ini melanggar LSP karena Square tidak mempertahankan kontrak perilaku yang diharapkan dari Rectangle.

Solusi yang Mematuhi LSP adalah Alih-alih menjadikan Square sebagai subclass dari Rectangle, kita bisa membuat Rectangle dan Square sebagai kelas yang terpisah dan mengimplementasikan antarmuka yang sama, misalnya Shape.


public interface Shape {
int getArea();
}

public class Rectangle implements Shape {
protected int width;
protected int height;

public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}

@Override
public int getArea() {
return width * height;
}
}

public class Square implements Shape {
protected int side;

public Square(int side) {
this.side = side;
}

@Override
public int getArea() {
return side * side;
}
}

Dalam penggunaan sekarang, kita bisa menggunakan Rectangle dan Square tanpa melanggar LSP karena mereka tidak lagi terikat dalam hierarki pewarisan yang menyebabkan perilaku tidak konsisten.

public class Main {
public static void main(String[] args) {
Shape rectangle = new Rectangle(5, 10);
System.out.println("Area persegi panjang: " + rectangle.getArea()); // Output: 50

Shape square = new Square(5);
System.out.println("Area persegi: " + square.getArea()); // Output: 25
}
}

Dengan desain ini maka

LSP terpenuhi karena Rectangle dan Square memiliki perilaku independen yang konsisten sesuai dengan bentuknya masing-masing.

Tidak ada perubahan atau efek samping yang tidak diinginkan saat kita mengganti Rectangle dengan Square dalam konteks Shape.

Kode lebih mudah dipahami dan dipelihara, dengan perilaku yang jelas dan sesuai dengan prinsip KISS.

Liskov Substitution Principle (LSP) sangat berhubungan dengan KISS (Keep It Simple, Stupid) karena penerapan LSP membantu menjaga kode tetap sederhana, terstruktur, dan mudah dipahami. Berikut beberapa cara di mana LSP mendukung prinsip KISS:

Membuat Kode Konsisten dan Diprediksi

Dengan mengikuti LSP, kita memastikan bahwa kelas turunan dapat menggantikan kelas induknya tanpa perilaku yang tidak konsisten atau mengejutkan. Hal ini membuat kode lebih diprediksi dan mudah dipahami, sesuai dengan prinsip KISS.

Menghindari Kompleksitas yang Tidak Diperlukan:

LSP membantu menghindari logika tambahan atau pengecekan kondisi untuk menangani perilaku kelas turunan yang berbeda dari kelas induk. Contohnya pada kasus Square dan Rectangle, ketika Square tidak dipaksakan untuk mewarisi Rectangle, kode tidak perlu if-else tambahan untuk membedakan keduanya. Ini membuat kode lebih sederhana dan bersih.

Mendukung Pemahaman dan Pemeliharaan yang Lebih Mudah:

Saat LSP dipatuhi, setiap kelas memiliki tanggung jawab yang jelas dan terpisah, serta perilaku yang sesuai dengan kontraknya. Dengan begitu, kode menjadi lebih mudah dipahami, karena kita bisa yakin bahwa kelas turunan berperilaku sesuai dengan kelas induknya tanpa kejutan, sesuai dengan prinsip KISS yang menekankan kesederhanaan dalam pemahaman.

Meminimalkan Risiko Bug:

Kelas yang mematuhi LSP cenderung bebas dari bug yang disebabkan oleh perilaku tidak terduga ketika mengganti kelas induk dengan kelas turunan. Hal ini membuat kode lebih stabil dan lebih mudah untuk diuji, sesuai dengan tujuan KISS untuk menjaga kode tetap sederhana dan mudah diuji.

Secara keseluruhan, LSP mendukung KISS dengan memastikan bahwa kelas dan subclass memiliki perilaku yang konsisten, mudah dipahami, dan bebas dari kompleksitas yang tidak perlu. Dengan mematuhi LSP, kita menjaga kode tetap sederhana dan mudah dipelihara, yang merupakan inti dari prinsip KISS.


Artikel ini terkait dengan: menulis clean code dengan prinsip solid dan kiss

Related Article:

1. Menulis clean code dengan prinsip solid dan kiss

2. Menulis Clean Code: Prinsip Single Responsibility Principle (SRP) pada SOLID

3. Menulis Clean Code Dengan Open Closed Principle 

4. Menulis Clean dengan Interface Segregation Principle

5. Menulis Clean Code: Prinsip Dependency Inversion Principle (DIP) Pada SOLID

6. Prinsip Liskov Substitution Principle (LSP) Pada SOLID


Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Semalam kemarin (09 Januari 2019) tidak sengaja kami sekeluarga lewat Bandung Digital Hub saat pulang dari Fish Wow Cheeseee  yang di Jl. Lombok. Bandung Digital Hub ini sendiri berlokasi tidak jauh dari dari tempat kami makan tersebut, yaitu berlokasi di Jl. Laswi No.7, Kacapiring, Batununggal, Kota Bandung, Jawa Barat 40271. Berhubung untuk bulan Januari 2019 ini sedang tidak masuk ke kantor maka saya putuskan untuk besoknya (hari ini 09 Januari 2019) nyoba untuk bekerja remote dari Bandung Digital Hub , apalagi istri yang kebetulan follower pak Ridwan Kamil di Instagram juga Facebook dan tampaknya pernah lihat ulasan mengenai tempat ini sehingga tampak antusias supaya saya datang ketempat ini ini dan mencoba bekerja dari gedung creative hub dan coworking yang keren ini.  Tempat Parkir Masalah utama saat kita datang ke coworking space terutama yang berlokasi di Bandung (atau mungkin kota-kota lainnya) adalah lahan parkir, kadang lahan parkir ...

Numpang Kerja Remote dari Bandung Digital Valley

Satu lagi co-working place  gratisan dan keren yang cukup populer dikota Bandung, co-working place yang juga memberikan fasilitas tempat kerja (co-working place) dan fitur-fitur menarik lainnya,  co-working place keren  ini adalah Bandung Digital Valley atau yang sering disingkat BDV . C o-working place  Bandung Digital Valley ini  merupakan bagian dari Telkom , mulai aktif digunakan dari sekitar tahun 2012 lalu .  Tempat ini biasanya menjadi tempat favorit bagi para pengiat startup, freelancer, dan mahasiswa . Gedung BDV Gedung BDV Gedung BDV Co-working space Bandung Digital Valley ini sendiri berlokasi di Menara Bandung Digital Valley, Jl. Gegerkalong Hilir No.47, Sukarasa, Sukasari, Kota Bandung, Jawa Barat, detailnya bisa dilihat di Google map berikut. Pemandangan jalan setelah pintu satpam. Free Co-working Space Membership Untuk mulai menggunakan fasilitas co-working space ini secara gratis maka yang pe...

Membuat Authentikasi Berbasis Token pada Spring Boot dengan Spring Security dan JWT

Setelah beberapa kali mencari tutorial tentang otentikasi aplikasi web Spring Boot dengan menggunakan JWT yang mudah dipahami akhirnya saya menemukan artikel berbahasa Inggris tapi sangat mudah dipahami  dan diikuti, artikel tersbut berada disini , dengan judul " Spring Boot Token based Authentication with Spring Security & JWT ". Untuk memudahkan orang-orang yang terbiasa membaca artikel dalam bahasa indonesia (termasuk saya sendiri), artikel ini saya buat dan susun ulang (artikel aslinya tidak tertulis dengan runtut dan dapat membuat pemula bingung dengan berbagai error yang muncul) supaya lebih mudah untuk diikuti dan dapat di gunakan bersama. Applikasi yang akan kita buat adalah aplikasi web yang setiap endpoint-nya hanya bisa di akses oleh role tertentu. 1. Tools Yang Diperlukan IntelliJ Idea text editor. Spring Assistant Plugin. Postman. PostgreSQL + DBeaver. Min Java 8 Spring Boot 2.1.8 (dengan Spring Security, Spring Web, Spring Data JPA). jjwt 0.9.1. Maven 3.6.1....