Konsep prinsip iki dikenalaké déning Barbara Liskov ing intine konferensi taun 1987 lan banjur diterbitake ing makalah bebarengan karo Jannette Wing ing taun 1994. defiasline kaya ing ngisor iki:
Ayo q (x) dadi properti sing bisa ditampilake ing obyek x saka jinis T. Banjur q (y) kudu bisa diduduhake kanggo obyek y saka tipe S ing endi S minangka subtipe T.
Banjur, kanthi publikasi prinsip SOLID Robert C. Martin ing buku Agile Software Development, Principles, Patterns, and Practices banjur diterbitake maneh ing versi C# saka buku Agile Principles, Patterns, and Practices in C#, defiIki dikenal minangka prinsip substitusi Liskov.
Iki ndadekke kita menyang defiinformasi sing diwenehake dening Robert C. Martin: Subtipe kudu diganti karo jinis dhasar.
kendaraan kelas {
fungsi startEngine () {
// Fungsionalitas mesin wiwitan standar
}
fungsi nyepetake () {
// Fungsi akselerasi standar
}
}
Yen diwenehi kelas Kendharaan - bisa uga abstrak - lan loro implementasine:
kelas Mobil ndawakake Kendaraan {
fungsi startEngine () {
$ this-> terlibatIgnition ();
wong tuwa :: startEngine ();
}
fungsi pribadi terlibatIgnition () {
// Prosedur pengapian
}
}
kelas ElectricBus ngluwihi Kendharaan {
fungsi nyepetake () {
$ this-> increaseVoltage ();
$ this-> connectIndividualEngines ();
}
fungsi pribadi increaseVoltage () {
// Logika listrik
}
ConnectIndividualEngines fungsi pribadi () {
// Logika sambungan
}
}
driver kelas {
fungsi go (Kendaraan $ v) {
$ v-> startEngine ();
$ v-> nyepetake ();
}
}
Sing nggawa implementasi sederhana saka Pola Desain Metode Cithakan kaya sing digunakake ing OCP.
Sampeyan bisa uga kasengsem ing prinsip SOLID kapindho: https: //bloginnovazione.en / open-closed-second-solid-prinsip / 3906 /
Adhedhasar pengalaman sadurunge karo prinsip Open / Closed, kita bisa nyimpulake yen prinsip substitusi Liskov gegandhengan banget karo OCP. Kasunyatane, "pelanggaran LSP minangka pelanggaran laten OCP" (Robert C. Martin), lan Pola Desain Metode Cithakan minangka conto klasik babagan rasa hormat lan implementasine LSP, sing uga minangka salah sawijining solusi sing uga kudu ditrapake karo OCP.
kelas Rectangle {
$ topLeft pribadi;
jembar $ pribadi;
dhuwur $ pribadi;
set fungsi masarakat (Height $) {
$ iki-> dhuwur = $ dhuwur;
}
fungsi umum getHeight () {
bali $ iki-> dhuwur;
}
setWidth fungsi umum (jembar $) {
$ iki-> jembar = $ jembaré;
}
getWidth fungsi umum () {
bali $ iki-> jembaré;
}
}
Ayo diwiwiti kanthi bentuk geometris dhasar, persegi panjang. Iku mung obyek data sing sederhana kanthi setter lan getter kanthi jembar lan dhuwur. Bayangake manawa aplikasi kita bisa digunakake lan wis dikirim menyang pirang-pirang klien. Saiki dheweke butuh fitur anyar. Dheweke kudu bisa ngapusi kothak.
Ing kasunyatan, ing géomètri, kothak minangka wujud segiempat tartamtu. Dadi, kita bisa nyoba ngetrapake kelas Square sing ngluwihi kelas Rectangle. Asring diarani manawa kelas bocah minangka kelas induk, lan ekspresi iki uga sesuai karo LSP, paling ora yen sepisanan.
kelas Square ngluwihi Persegi Panjang {
setHeight fungsi umum ($ regane) {
$ iki-> jembar = $ regane;
$ iki-> dhuwur = $ regane;
}
setWidth fungsi umum ($ regane) {
$ iki-> jembar = $ regane;
$ iki-> dhuwur = $ regane;
}
}
Kothak minangka persegi panjang kanthi jembar lan dhuwur sing padha lan kita bisa nindakake implementasine sing aneh kaya conto sadurunge. Kita bisa ngalahake loro setter kanggo nyetel dhuwur lan jembaré. Nanging kepiye pengaruh iki marang kode klien?
Klien kelas {
fungsi areaVerifier (Rectangle $ r) {
$ ----------------> setWidth (5);
$ ----------------> setHeight (4);
yen ($ ----------------> area ()! = 20) {
uncalan Exception anyar ('Area ala!');
}
bali bener;
}
}
area fungsi () {
bali $ iki-> jembaré * $ iki-> dhuwure;
}
Kita jelas nambah cara ing ndhuwur menyang kelas Rectangle kanggo nyedhiyakake area kasebut.
kelas LspTest ngluwihi PHPUnit_Framework_TestCase {
fungsi testRectangleArea () {
$ r = Rectangle anyar ();
$ c = Klien anyar ();
$ this-> assertTrue ($ c-> areaVerifier ($ r));
}
}
Lan kita nggawe test prasaja kanthi ngirim obyek persegi dowo kosong kanggo checker area lan test liwat. Yen kelas kita Square punika defirampung bener, ngirim menyang Klien areaVerifier () ngirim ora break fungsi. Sawise kabeh, kothak minangka persegi dowo ing saben pangertèn matematika. Nanging apa kelas kita?
fungsi testSquareArea () {
$ r = Alun-alun anyar ();
$ c = Klien anyar ();
$ this-> assertTrue ($ c-> areaVerifier ($ r));
}
Dadi, kelas Square kita dudu Rectangle. Iku nglanggar hukum geometri. Gagal lan nglanggar prinsip substitusi Liskov.
Ercole Palmeri
Operasi ophthalmoplasty nggunakake penampil komersial Apple Vision Pro ditindakake ing Poliklinik Catania…
Ngembangake katrampilan motorik sing apik liwat pewarnaan nyiapake bocah kanggo katrampilan sing luwih rumit kaya nulis. Kanggo mewarnai…
Sektor angkatan laut minangka kekuwatan ekonomi global sing sejatine, sing wis ngarahake pasar 150 milyar ...
Senin kepungkur, Financial Times ngumumake kesepakatan karo OpenAI. FT menehi lisensi jurnalisme kelas donya…