Apakah ada nama khusus untuk paradoks “Square inherit from Rectangle”?

18

Kegagalan OOP tertentu ditunjukkan dengan kelas Square yang mewarisi dari Rectangle, di mana secara logis Square adalah spesialisasi dari Rectangle dan karenanya harus diwarisi darinya, tetapi semuanya berantakan ketika Anda mencoba mengubah panjang atau lebar Square.

Apakah ada istilah khusus untuk menggambarkan apa yang salah dengan kasus itu?

Pemenang
sumber
2
dapatkah Anda menjelaskan apa yang sebenarnya "salah"? Saya tidak mengerti apa yang Anda maksud
nyamuk
1
Dengan asumsi persegi panjang memiliki metode virtual yang memungkinkan seseorang untuk mengatur ukuran dengan melewati panjang dan lebar, pengaturan panjang dan lebar yang berbeda pada kotak dapat mengembalikan kotak dan pengaturan panjang dan lebar yang sama pada kotak dapat mengembalikan kotak. Kode apa pun yang perlu diketahui kuadrat secara eksplisit dapat mencoba untuk memasukkan kuadrat. Saya tidak melihat bagaimana ada kegagalan ...
8
Ini bukan paradoks. Ini adalah kasus pemodelan domain masalah yang tidak tepat. Hirarki warisan TIDAK harus sejalan dengan hierarki hal dalam domain masalah. Memang menyenangkan ketika itu terjadi, tetapi trik dalam model yang baik adalah untuk memahami di mana Anda perlu melakukan hal-hal yang berbeda dari dunia nyata.
Michael Kohne
1
FWIW: Lebih khusus, masalahnya adalah bahwa antarmuka membaca dan menulis tidak cocok. Yaitu Anda dapat membaca lingkaran sebagai spesialisasi elips, tetapi hanya menulis elips sebagai spesialisasi lingkaran.
Macke
1
@GrandmasterB Saya menggunakan "orang, benda, atau situasi apa pun yang menunjukkan sifat yang tampaknya kontradiktif." Kontradiksinya adalah bahwa jika kuadrat memiliki sifat yang berbeda, kita harus mengatakan "Kuadrat bukan semacam Persegi Panjang", padahal faktanya kita mengharapkan Square sebagai subtipe dari Persegi Panjang. Mungkin tidak ada aplikasi nyata yang memiliki tipe Rectangle dan Square, itu hanya abstraksi untuk menggambarkan jenis masalah tertentu yang dapat muncul dalam paradigma berbasis kelas.
Victor

Jawaban:

27

Wikipedia hanya menyebutnya sebagai masalah Circle-ellipse

Masalah lingkaran-elips dalam pengembangan perangkat lunak (kadang-kadang dikenal sebagai masalah persegi-persegi panjang ) mengilustrasikan sejumlah jebakan yang dapat muncul ketika menggunakan polimorfisme subtipe dalam pemodelan objek. Masalah yang paling sering ditemui ketika menggunakan pemrograman berorientasi objek.

Ini adalah L dalam akronim SOLID yang dikenal sebagai prinsip substitusi Liskov . Masalah ini muncul sebagai pelanggaran terhadap prinsip itu.

Masalahnya menyangkut hubungan subtipe atau pewarisan yang harus ada antara kelas yang mewakili lingkaran dan elips (atau, sama halnya, kotak dan persegi panjang). Lebih umum, masalah tersebut menggambarkan kesulitan yang dapat terjadi ketika kelas dasar berisi metode yang memutasi objek dengan cara yang mungkin membatalkan invarian (lebih kuat) yang ditemukan di kelas turunan, menyebabkan prinsip substitusi Liskov dilanggar ...

Mark Canlas
sumber
1
Dan, ketika membacanya, Wikipedia menyebut penjelasan yang lebih akademis sebagai "[pelanggaran terhadap] prinsip substitusi Liskov". Terima kasih :)
Victor
1
Yah, itu hanya pelanggaran tergantung pada bagaimana Anda melihatnya. Secara pribadi, semua lingkaran adalah elips; tidak ada pelanggaran. Mulai ada pelanggaran jika metode elips menjadi restriktif. Kemudian, dalam skenario khusus itu, lingkaran tidak bisa menjadi subtipe dari kontrak elips tertentu itu.
Mark Canlas
6
@MarkCanlas Masalahnya adalah pelanggaran prinsip substitusi Liskov yang tidak dapat dibantah. Ini mungkin bukan pelanggaran prinsip lain, tetapi tidak ada yang mengklaim hal itu. Ketika masalah tidak terjadi karena kontrak tidak termasuk invarian yang akan rusak (meskipun saya gagal membayangkan model yang berguna di mana ini benar), mungkin tidak ada pelanggaran terhadap LSP, tetapi itu tidak berarti bahwa masalah , ketika itu terjadi, bukan karena pelanggaran LSP.
7
@ Markus Canlas: tidak, lingkaran konstan adalah elips konstan , lingkaran bisa berubah bukan elips bisa berubah. Dalam geometri konstanta diasumsikan, Anda tidak dapat mengubah elips, Anda dapat mengambil elips lain
maxim1000
1
Kendala / Aturan Sejarah Prinsip Pergantian Liskov mengatakan bahwa ketika subtipe menambahkan metode baru, metode itu tidak boleh memanipulasi keadaan objek sedemikian rupa sehingga menciptakan sejarah (yaitu serangkaian negara) yang tidak diizinkan dalam supertype. Misalnya Anda tidak dapat membuat subtipe dari mutable yang tidak dapat berubah, karena ketika hanya dimanipulasi melalui metode supertype, state selalu sama, sedangkan ketika dimanipulasi melalui metode mutator subtype, state berubah. Itu adalah sejarah yang tidak diizinkan oleh supertype.
Jörg W Mittag
8

Saya akan menganggapnya sebagai pelanggaran terhadap Prinsip Pergantian Liskov - Squaresubclass tersebut secara spesifik melanggar invarian bahwa panjang dan lebar adalah independen.

Paul Phillips
sumber
8

Pada tingkat yang lebih mendasar daripada Prinsip Substitusi Liskov, ini adalah kesalahan kategori atau kesalahan kategori

Dalam konteks perilaku pemodelan, bujur sangkar bukanlah tipe persegi panjang.

Ketika Anda menyadari ini, masalahnya menguap sejak asumsi awal (persegi adalah jenis persegi panjang) dihapus dari permainan.

Masalah dengan jawaban ini adalah bahwa sejak sekolah itu dibor ke siapa pun yang melakukan geometri bahwa persegi adalah jenis persegi panjang. Tetapi sangat penting untuk memahami bahwa ini hanya benar dalam konteks yang sangat spesifik (klasifikasi bentuk-bentuk geometris berdasarkan sifat-sifat sudut internal mereka). Dalam hal perilaku persegi bukan persegi panjang. Untuk melihat satu set klasifikasi dalam konteks yang salah adalah kesalahan kategori.

Cormac Mulhall
sumber