S.O.L.I.D 原則 - Liskov Substitution Principle (LSP)


Open Closed Principle yang sudah saya tulis di artikel sebelumnya merupakan salah satu kunci dari konsep Pemrograman Berbasis Objek (Object Oriented Programming) diman memungkinkan kamu untuk menulis コード yang 堅牢、dapat dimaintenance、および再利用可能なソフトウェア コンポーネント. Namun hanya mengadopsi prinsip ini saja tidak cukup untuk memastikan bahwa kamu dapat mengubah salah satu bagian dari sistemmu tanpa merusak bagian-bagian yang lain.クラスとインターフェイス yang kamu miliki juga perlu mengadopsi Liskov Substitution Principle (LSP) untuk menghindari side-effect.

Liskov Substitution Principle ini memperluas Open Closed Principle dengan memfokuskan pada behavior dari superclass dan turunannya.

Apa itu Liskov Substitution Principle (LSP)



💡 If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T. ~ Barbara Liskov



Kemudian Robert C. Martin merumuskan kembali definsi dari Liskov Substitution Principle yang dikemukakan oleh Barbara Liskov

💡 Subtypes must be substitutable for their base types.



プリンシプ・イニ・ダパット・ジュガ・ディアルティカン・バーワ・オブジェク・オブジェク・ダリ・スーパークラス・セハルスニャ・ダパット・ディガンティカン・デンガン・オブジェク・オブジェク・ヤン・メルパカン・トゥルナン・ダリ・スーパークラス・タンパ・メルサック・アプリカシ. Dimana mengharuskan objek-objek dari turunan superclass memiliki behavior yang sama dengan superclassnya.

Kenapa LSP ini Penting ?



Pelanggaran LSP akan membuat code anda bau. Kita mungkin telah mengeneralisasi sebuah konsep secara premature dan membuat superclass diman tidak diperlukan. Kebutuhan dimas mendatang untuk konsep tersebut mungkin tidak sesuai dengan hierarki class yang kita buat.

ジカ コード クリエン ティダック ダパット メンガンティカン レファレンシ スーパークラス デンガン オブジェク-オベジ サブクラス セカラ ベバス、マカ アカン ディパックサ アントゥク メラクカン ペメリクサーン インスタンス ダン メナンガニ ベベラパ サブクラス セカラ クス. Jika code seperti ini tersebar di seluruh code kita maka akan sulit untuk maintenancenya.

open class Product {
    protected val _discount: Double
    fun getDiscount(): Double {
        return _discount
    }
}



class SpecialProduct : Product() {
    fun applyExtraDiscount() {
        _discount = _discount * 0.2
    }
}



fun main(args: Array<String>) {
    val birds = listOf<Product>(Product(), SpecialProduct())
    birds.forEach { it ->
         if (it is SpecialProduct) it.applyExtraDiscount()
         println(it.getDiscount())
    }
}


設定された kali kita menambahkan atau memodifikasi サブクラス、kita harus menyusuri code base kita dan merubahnya di beberapa tempat、ini akan sulit dilakukan dan rawan akan kesalahan.

ソルジ LSP



Code diatas berarti objek Produk tidak dapat digantikan oleh objek SpecialProduct karena kita melakukan validasi bahwa jika produk merupakan SpecialProduk maka kita akan memanggil fungsi applyExtraDiscount() .

agar SpecialProduct dapat digunakan untuk menggantikan superclassnya maka kita akan menggunakan prinsip 「教えて、聞かないで!」、 dimana akan membantu kita untuk mengeliminasi 型キャスト/型チェック.

class SpecialProduct : Product() {

    override fun getDiscount() {
        applyExtraDiscount()
        return _discount
    }
    fun applyExtraDiscount() {
        _discount = _discount * 0.2
    }
}



fun main(args: Array<String>) {
    val birds = listOf<Product>(Product(), SpecialProduct())
    birds.forEach { it ->
         println(it.getDiscount())
    }
}


dengan begini kita tidak memerlukan typecasting karena kita telah mengubah method dengan cara mengoverride dan memanggil fungsi applyExtraDiscount() di dalamnya dengan begitu tidak diperlukan lagi untuk melakukan pengecekan bahwa untuk SpecialProduct. Serta コードは、堅牢で、テスト可能で、メンテナンスが容易な karena telah mengikuti LSP です.

アキル・カタ



Liskov Substitution Principle memperluas Open Closed Principle dan membuat kita dapat menggantikan objek dari superclass dengan objek-objeck turunannya tanpa merusak program yang sudah ada. Serta membantu kita untuk membuat hierarki yang sesuai antar tipe, dimana akan menjamin program kita untuk berjalan dengan benar tanpa side-effect yang tidak diinginkan.