tutorial

Prinsip Subtitusi Liskov, prinsip SOLID kaping telu

Kelas bocah ora tau mengaruhi utawa ngowahi les defistatements saka jinis kelas induk.

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.

Kanthi luwih gampang, subkelas kudu ngatasi metode kelas induk kanthi cara sing ora bisa ngganggu fungsi saka sudut pandang pelanggan. Mangkene conto sederhana kanggo nduduhake konsep kasebut.

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 ();

    }

}

Kelas klien kudu bisa nggunakake kalorone yen bisa nggunakake Kendaraan.

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.

Tuladha pelanggaran LSP

kelas Rectangle {

    $ topLeft pribadi;

    jembar $ pribadi;

    dhuwur $ pribadi;

 

    set fungsi masarakat (Height $) {

        $ iki-> dhuwur = $ dhuwur;

    }

 

newsletter inovasi
Aja kantun warta paling penting babagan inovasi. Mlebu kanggo nampa wong-wong mau liwat email.

    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;

    }

}

Bisa dimangerteni yen duwe kelas klien sing mriksa area persegi dowo lan mbuwang pengecualian yen salah.

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

newsletter inovasi
Aja kantun warta paling penting babagan inovasi. Mlebu kanggo nampa wong-wong mau liwat email.

Artikel anyar

Intervensi inovatif ing Augmented Reality, karo panampil Apple ing Poliklinik Catania

Operasi ophthalmoplasty nggunakake penampil komersial Apple Vision Pro ditindakake ing Poliklinik Catania…

3 May 2024

Keuntungan saka Mewarnai Kaca kanggo Bocah-bocah - jagad sihir kanggo kabeh umur

Ngembangake katrampilan motorik sing apik liwat pewarnaan nyiapake bocah kanggo katrampilan sing luwih rumit kaya nulis. Kanggo mewarnai…

2 May 2024

Masa Depan Iki: Kepiye Industri Pengiriman Revolusi Ekonomi Global

Sektor angkatan laut minangka kekuwatan ekonomi global sing sejatine, sing wis ngarahake pasar 150 milyar ...

1 May 2024

Penerbit lan OpenAI menehi tandha persetujuan kanggo ngatur aliran informasi sing diproses dening Artificial Intelligence

Senin kepungkur, Financial Times ngumumake kesepakatan karo OpenAI. FT menehi lisensi jurnalisme kelas donya…

30 April 2024