• Home
  • /
  • Coding Tips
  • /
  • SOLID Principles: Pentingnya Prinsip Liskov Substitution

SOLID Principles: Pentingnya Prinsip Liskov Substitution

 

Dalam pengembangan perangkat lunak, memastikan bahwa kode tetap konsisten dan tidak menimbulkan efek samping yang tidak terduga adalah hal yang penting. Salah satu prinsip dalam SOLID Principles yang membantu mencapai tujuan ini adalah Liskov Substitution Principle (LSP). Pada artikel ini, kita akan membahas konsep LSP, mengapa prinsip ini penting, dan bagaimana mengimplementasikannya dengan baik menggunakan contoh dalam Java dan Python.

Apa Itu SOLID Principles?

SOLID adalah kumpulan lima prinsip desain dalam Object-Oriented Programming (OOP) yang bertujuan untuk membuat kode lebih mudah dibaca, dipelihara, dan diperluas tanpa menyebabkan perubahan besar yang dapat merusak sistem. SOLID terdiri dari:

  1. S – Single Responsibility Principle (SRP)
  2. O – Open-Closed Principle (OCP)
  3. L – Liskov Substitution Principle (LSP)
  4. I – Interface Segregation Principle (ISP)
  5. D – Dependency Inversion Principle (DIP)

Mengapa SOLID Principles Penting?

Penerapan SOLID Principles membantu dalam membangun sistem perangkat lunak yang lebih modular, fleksibel, dan mudah diuji. Dengan menerapkan prinsip-prinsip ini, kita dapat mengurangi kompleksitas kode, meningkatkan skalabilitas, dan menghindari berbagai masalah umum dalam pengembangan perangkat lunak, seperti kode yang terlalu tergantung satu sama lain atau sulit diperbaiki.

Apa Itu Liskov Substitution Principle (LSP)?

Liskov Substitution Principle (LSP) menyatakan bahwa subclass harus dapat menggantikan superclass tanpa mengubah perilaku atau behavior atau method yang diharapkan dari program. Dengan kata lain, jika suatu kelas induk (superclass) dapat digunakan dalam suatu konteks, maka semua kelas turunannya juga harus dapat digunakan dalam konteks yang sama tanpa menyebabkan error atau perubahan yang tidak terduga.

Mengapa Liskov Substitution Principle Penting?

Tanpa LSP, subclass dapat mengubah perilaku dasar yang diharapkan dari superclass, yang dapat menyebabkan bug tersembunyi dan membuat kode menjadi sulit dipahami serta dipelihara. Dengan menerapkan LSP, kode menjadi lebih konsisten, dapat diuji dengan mudah, dan lebih fleksibel dalam pengembangan jangka panjang.

Contoh Bad Practice (Melanggar LSP)

Mari kita lihat contoh kode dalam Java dan Python yang melanggar prinsip Liskov Substitution.

Java (Melanggar LSP)

class Bird {
    void fly() {
        System.out.println("Burung bisa terbang");
    }
}

class Penguin extends Bird {
    void fly() {
        throw new UnsupportedOperationException("Penguin tidak dapat terbang");
    }
}

Masalah: Jika kode kita mengasumsikan bahwa semua objek dari kelas Bird bisa terbang, tetapi objek dari Penguin tidak bisa, maka ini melanggar LSP. Jika ada kode yang mengandalkan fly(), maka saat menerima objek Penguin, akan terjadi error.

Python (Melanggar LSP)

class Bird:
    def fly(self):
        print("Burung bisa terbang")

class Penguin(Bird):
    def fly(self):
        raise Exception("Penguin tidak bisa terbang")

Masalah: Sama seperti contoh Java, Penguin tidak bisa terbang tetapi tetap mewarisi metode fly(). Ini dapat menyebabkan bug jika kode lain mengasumsikan bahwa semua Bird bisa terbang.

Contoh Good Practice (Mengikuti LSP)

Untuk memperbaiki masalah di atas, kita perlu memastikan bahwa subclass tidak mengubah kontrak yang didefinisikan oleh superclass.

Java (Mengikuti LSP)

class Bird {}

class FlyingBird extends Bird {
    void fly() {
        System.out.println("This bird is flying");
    }
}

class Sparrow extends FlyingBird {}

class Penguin extends Bird {}

Sekarang, hanya burung yang bisa terbang yang memiliki metode fly(). Penguin tidak perlu mewarisi metode ini dan tidak akan menyebabkan error.

Python (Mengikuti LSP)

class Bird:
    pass

class FlyingBird(Bird):
    def fly(self):
        print("This bird is flying")

class Sparrow(FlyingBird):
    pass

class Penguin(Bird):
    pass

Nah.. Sekarang, Penguin tidak lagi memiliki metode fly(), sehingga kode tetap konsisten dengan LSP.

Manfaat dari Penerapan Liskov Substitution Principle

Dengan menerapkan LSP, kita mendapatkan berbagai manfaat sebagai berikut:

  • Menghindari error yang tidak terduga akibat subclass yang tidak kompatibel dengan superclass.
  • Memastikan bahwa semua subclass dapat digunakan tanpa mempengaruhi perilaku yang diharapkan dari superclass.
  • Mempermudah pengujian karena kita tahu bahwa semua subclass akan bekerja dengan cara yang sama seperti superclass.

Ciri-ciri Class yang Perlu Menerapkan LSP

Tidak semua class harus diuji terhadap LSP, akan tetapi class yang memiliki ciri berikut sebaiknya mematuhi prinsip ini: (1) Class yang digunakan sebagai dasar untuk inheritance (misalnya Animal, Vehicle, Shape); (2) Class yang sering digunakan dalam polimorfisme (misalnya dalam desain berbasis antarmuka); (3) Class yang memiliki metode yang bisa berbeda implementasinya pada subclass; (4) Class yang sering digunakan dalam berbagai konteks sistem yang berbeda

Pada artikel berikutnya, kita akan membahas prinsip keempat dalam SOLID: Interface Segregation Principle (ISP). Pastikan Anda mengikuti blog ini agar tidak ketinggalan pembahasannya!


Assalaamu'alaikum.. aktivitas keseharian saya mengajar di Universitas Sebelas Maret, dengan matakuliah pemrograman dan basis data. Adapun bidang penelitian saya tentang computational thinking dan computer-aided learning.

Leave a Reply