Nyitott / zárt elv a Java-ban
1. Áttekintés
Ebben az oktatóanyagban a nyílt / zárt elvet (OCP), mint az objektum-orientált programozás egyik SOLID-elvét tárgyaljuk.
Összességében részletesen kitérünk arra, hogy mi ez az elv és hogyan kell azt megvalósítani a szoftverünk megtervezésekor.
2. Nyitott / zárt elv
Ahogy a neve is sugallja, ez az elv azt állítja, hogy a szoftveres entitásoknak nyitva kell állniuk a kiterjesztéshez, de a módosításokhoz bezárva. Ennek eredményeként, amikor az üzleti követelmények megváltoznak, az entitás kibővíthető, de nem módosítható.
Az alábbi ábra arra fogunk koncentrálni, hogy az interfészek miként követhetik az OCP-t.
2.1. Nem megfelelő
Vegyük fontolóra egy olyan számológép-alkalmazás felépítését, amelynek több művelete lehet, például összeadás és kivonás.
Először meghatározunk egy felső szintű interfészt - CalculatorOperation:
nyilvános felület CalculatorOperation {}
Határozzunk meg egy Kiegészítés osztály, amely két számot adna hozzá, és megvalósítja a C-talculatorOperation:
public class Addition megvalósítja a CalculatorOperation {private double left; magán kettős jog; privát kettős eredmény = 0,0; public Addition (dupla bal, dupla jobb) {this.balra = balra; ez.jobb = jobb; } // szerelők és beállítók}
Jelenleg csak egy osztályunk van Kiegészítés, tehát meg kell határoznunk egy másik nevű osztályt Kivonás:
public class Kivonás megvalósítja a CalculatorOperation {privát dupla bal; magán kettős jog; privát kettős eredmény = 0,0; nyilvános kivonás (dupla bal, dupla jobb) {this.balra = balra; ez.jobb = jobb; } // szerelők és beállítók}
Most adjuk meg a fő osztályunkat, amely elvégzi a számológép műveleteinket:
public class Calculator {public void számít (CalculatorOperation művelet) {if (művelet == null) {új InvalidParameterException dobása ("Nem lehet végrehajtani a műveletet"); } if (művelet példánya Hozzáadás) {Összeadás = (Összeadás) művelet; add.setResult (hozzáadás.getLeft () + hozzáadás.getRight ()); } else if (kivonás művelet példánya) {Kivonás kivonás = (kivonás) művelet; subtraction.setResult (subtraction.getLeft () - subtraction.getRight ()); }}}
Bár ez jónak tűnhet, ez nem jó példa az OCP-re. Amikor a szorzás vagy osztás funkciók hozzáadásának új követelménye bejön, a változtatáson kívül nincs más lehetőség kiszámítja módszere Számológép osztály.
Ezért azt mondhatjuk, hogy ez a kód nem kompatibilis az OCP-vel.
2.2. OCP-kompatibilis
Mint láttuk, számológép-alkalmazásunk még nem kompatibilis az OCP-vel. A kód a kiszámítja A módszer minden bejövő új művelet-támogatási kérelemmel megváltozik. Tehát ki kell bontanunk ezt a kódot, és absztrakciós rétegbe kell helyezni.
Az egyik megoldás az, hogy minden műveletet a saját osztályába delegálunk:
nyilvános felület CalculatorOperation {void perform (); }
Ennek eredményeként a Kiegészítés osztály megvalósíthatja két szám hozzáadásának logikáját:
public class Addition megvalósítja a CalculatorOperation {private double left; magán kettős jog; privát kettős eredmény; // konstruktor, getterek és beállítók @Orride public void perform () {eredmény = bal + jobb; }}
Hasonlóképpen, egy frissített Kivonás osztálynak hasonló logikája lenne. És hasonlóan Kiegészítés és Kivonás, új változtatási kérésként megvalósíthatjuk a osztály logika:
nyilvános osztály osztály megvalósítja a CalculatorOperation {privát dupla bal; magán kettős jog; privát kettős eredmény; // konstruktor, getterek és beállítók @Orride public void perform () {if (right! = 0) {result = left / right; }}}
És végül a mi Számológép osztálynak nem kell új logikát bevezetnie, mivel új operátorokat vezetünk be:
public class Calculator {public void kiszámítása (CalculatorOperation művelet) {if (művelet == null) {új InvalidParameterException dobása ("A műveletet nem lehet végrehajtani"); } művelet.teljesít (); }}
Így van az osztály zárva módosításra de nyisd ki hosszabbításra.
3. Következtetés
Ebben az oktatóanyagban megtudtuk, mi az OCP definíció szerint, majd tovább dolgoztuk ezt a definíciót. Ezután láttunk egy példát egy egyszerű számológép-alkalmazásra, amely hibás volt a tervezésében. Végül jóvá tettük a formatervezést azzal, hogy ragaszkodtunk az OCP-hez.
Mint mindig, a kód elérhető a GitHubon.