Kelas LinkedList ada dengan fungsi-fungsi seperti add_first (), add_last (), add_after (), remove_first (), remove_last (), dan remove ()
Sekarang ada kelas Stack yang menyediakan fungsionalitas seperti push (), pop (), peek () atau top (), dan untuk mengimplementasikan metode ini ia memperluas metode kelas LinkedList. Apakah ini merupakan pelanggaran terhadap Prinsip Pergantian Liskov?
Sebagai contoh, pertimbangkan case add_after () untuk menambahkan node di posisi ke-n dari Daftar Tertaut. Ini bisa dilakukan di kelas dasar tetapi tidak di kelas Stack. Apakah postconditions dilemahkan di sini atau Anda memodifikasi metode add_after () untuk ditambahkan ke bagian atas Stack?
Juga, jika bukan pelanggaran, apakah desain yang buruk ini? Dan bagaimana Anda mengimplementasikan fungsionalitas Stack menggunakan kelas LinkedList?
LinkedList
? Anda mungkin ingin memperhatikan saran dari Joshua Bloch tertentu (yang memainkan peran utama dalam merancang kerangka koleksi Java) ketika dia berkata "Lebih suka komposisi daripada warisan" - Mungkin memiliki bagianLinkedList
dalam kelas stack Anda, tetapi tidak benar-benar memperpanjangnya?LinkedList
yang melakukan mengangkat berat di belakang layar (komposisi). Dengan begitu pengguna kode Anda tidak dapat secara tidak sengaja menggunakan Stack di mana mereka membutuhkan Daftar atau sebaliknya.Jawaban:
Tidak apa-apa menambahkan metode dalam subtipe.
Ini merupakan pelanggaran terhadap LSP. LSP mengatakan bahwa instance subtipe harus dapat diganti untuk instance supertype tanpa mengubah sifat yang diinginkan dari suatu program. Jika subtipe menghapus metode, maka kode apa pun yang memanggil metode itu akan macet (atau mendapatkan
NoMethodError
pengecualian, atau sesuatu di sepanjang baris itu). Jelas, "tidak menabrak" adalah properti yang diinginkan.Memodifikasi
add_after()
metode dengan cara ini adalah pelanggaran terhadap History Rule (yang paling penting dari aturan!) Dan dengan demikian tidak membantu memperbaiki pelanggaran terhadap LSP.Dengan menggunakan komposisi.
CATATAN: Semua yang saya tulis di atas hanya berlaku untuk bahasa yang membingungkan subtyping dan subclassing! LSP adalah tentang subtyping , bukan subclassing. Dalam bahasa yang tidak bingung dua, akan diterima untuk membuat
Stack
subclass dariLinkedList
, selama Anda tidak membuatnya menjadi subtipe dariLinkedList
.sumber
Karena semuanya sudah ditangani oleh Jörg W Mittag, saya hanya menjelaskan sedikit pada bagian berikut:
Pada dasarnya, ketika ada pertanyaan apakah beberapa hierarki melanggar LSP, itu tergantung pada kontrak apa yang Anda ajukan. Jadi, kontrak apa yang
add_after
dimiliki? Jika kedengarannya gila, betapapun gila, seperti "Tambahkan simpul di posisi ke-n atau di atas", daripada Anda baik-baik saja, kondisi pasca terpenuhi, LSP tidak dilanggar. Kalau tidak, ini merupakan pelanggaran LSP.sumber