Bagaimana penguatan prasyarat dan melemahnya postkondisi melanggar prinsip substitusi Liskov?

19

Saya membaca bahwa prinsip substitusi Liskov dilanggar jika:

  1. Prasyarat diperkuat, atau

  2. Postconditions melemah

Tapi saya belum mengerti sepenuhnya bagaimana kedua poin ini akan melanggar prinsip substitusi Liskov. Bisakah seseorang tolong jelaskan dengan sebuah contoh. Secara khusus, bagaimana salah satu dari kondisi di atas menyebabkan situasi di mana objek subclass tidak dapat diganti dengan objek superclass?

Kutu buku
sumber

Jawaban:

29
  1. Anggap baseclass Anda berfungsi dengan int anggota. Sekarang subtipe Anda mengharuskan int untuk menjadi positif. Ini diperkuat pra-kondisi, dan sekarang setiap kode yang berfungsi dengan baik sebelum dengan int negatif rusak.

  2. Demikian juga, asumsikan skenario yang sama, tetapi kelas dasar digunakan untuk menjamin bahwa anggota akan positif setelah dipanggil. Kemudian subtipe mengubah perilaku untuk memungkinkan int negatif. Kode yang berfungsi pada objek (dan mengasumsikan bahwa post-condition adalah int positif) sekarang rusak karena post-condition tidak ditegakkan.

Ini tentu saja merupakan contoh sepele, tetapi konsepnya berlaku. Hal-hal seperti membiarkan koneksi file / basis data terbuka adalah contoh dari kondisi pasca mereda yang mengarah ke masalah.

Telastyn
sumber
1

masukkan deskripsi gambar di sini

Invariant - Templat SelfDrivingVehicle yang tetap tidak berubah di semua subtipe yaitu Urutan di mana ia mengeksekusi perilaku yang ditimpa untuk mencapai tujuan.

Mari Asumsikan satu metode lagi di sini

           -List<SelfDrivingVehicle> vehicles 
           +Add(SelfDrivingVehicle vehicle)
            vehicles.add(vehicle)

Prekondisi - SelfDriveVehicle Tipe Dasar tidak memiliki kendaraan di dalamnya (di sini konteksnya adalah Tambah) dan Prasyaratnya yang Melemah yang tidak dapat diubah oleh salah satu sub jenisnya dengan mengubah kendaraan properti dan Memperkuatnya Secara Eksplisit. Sub jenis apa pun hanya dapat memanggil Tambah.

Postcondition - Setelah Add dipanggil, Base Type dalam Postcondition yang diperkuat yang tidak dapat dilemahkan oleh sub tipe dengan mengubah nilai kendaraan.

Keadaan Tipe Basis kembali ke Keadaan semula setelah Tambah Perilaku dipanggil.

Vishal Patwardhan
sumber
-1

Contoh ini cukup banyak dipukuli sampai mati, tetapi pertimbangkan kemungkinan Square / Rectangle atau Circle / Ellipse. Misalkan Anda memiliki Rectangle kelas dasar yang mendefinisikan objek dengan panjang dan lebar. Jika Anda memiliki kelas Kotak yang mewarisi kelas Kotak, itu akan memiliki aturan dalam setter / pengambil yang akan mengharuskan setiap perubahan panjang atau lebar akan mengubah pasangannya. Persyaratan dimensi ini memperkuat pra-kondisi karena persegi panjang yang diganti dengan persegi akan kehilangan persyaratan dimensi ini. Misalkan Anda membalikkan warisan sehingga sebuah Persegi Panjang mewarisi Kotak, Anda akan melemah kondisi pos dengan melonggarkan persyaratan dimensi untuk memungkinkan Persegi Panjang untuk berperilaku secara independen.

Namun, jika Anda harus menghapus kemampuan perubahan dimensi, prinsip substitusi berlaku karena jika baik Rectangle maupun Square tidak dapat mengubah dimensi, maka mereka memiliki kondisi pra dan pasca yang sama terlepas dari warisan. Keduanya memiliki panjang, keduanya memiliki lebar, dan tidak ada yang dapat mengubah nilai-nilai itu.

ref: Wikipedia - http://en.wikipedia.org/wiki/Liskov_substitution_principle

Joel Etherton
sumber
1
Sayangnya, contoh itu tidak ada hubungannya dengan verifikasi formal. Tidak ada kontrak.
Frank Hileman