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.