Otvoreni / zatvoreni princip u Javi

1. Pregled

U ovom uputstvu razgovarat ćemo o Otvorenom / Zatvorenom načelu (OCP) kao jednom od SOLID principa objektno orijentiranog programiranja.

Sveukupno ćemo detaljno objasniti što je ovo načelo i kako ga primijeniti prilikom dizajniranja našeg softvera.

2. Otvoreno / zatvoreno načelo

Kao što i samo ime govori, ovo načelo kaže da bi softverski entiteti trebali biti otvoreni za proširenje, ali zatvoreni za izmjene. Kao rezultat toga, kada se poslovni zahtjevi promijene, entitet se može proširiti, ali ne i mijenjati.

Za ilustraciju u nastavku, usredotočit ćemo se na to kako su sučelja jedan od načina za praćenje OCP-a.

2.1. Nesukladno

Razmotrimo da gradimo aplikaciju kalkulator koja bi mogla imati nekoliko operacija, poput zbrajanja i oduzimanja.

Prije svega, definirat ćemo sučelje najviše razine - Operacija kalkulatora:

javno sučelje CalculatorOperation {}

Definirajmo Dodatak klase, koja bi dodala dva broja i implementirala CalculatorOperation:

javna klasa Dodatak implementira CalculatorOperation {private double left; privatno dvostruko pravo; privatni dvostruki rezultat = 0,0; javni dodatak (dvostruko lijevo, dvostruko desno) {this.left = lijevo; this.right = desno; } // geteri i postavljači}

Od sada imamo samo jedan razred Dodatak, pa moramo definirati još jedan razred s imenom Oduzimanje:

javna klasa Oduzimanje implementira CalculatorOperation {private double left; privatno dvostruko pravo; privatni dvostruki rezultat = 0,0; javno Oduzimanje (dvostruko lijevo, dvostruko desno) {this.left = lijevo; this.right = desno; } // geteri i postavljači}

Definirajmo sada našu glavnu klasu koja će izvoditi naše operacije kalkulatora:

Kalkulator javne klase {izračun javne praznine (operacija CalculatorOperation) {if (operacija == null) {bacanje novog InvalidParameterException ("Nije moguće izvršiti operaciju"); } if (operacija instance of Addition) {operacija Addition = (Addition); addition.setResult (adition.getLeft () + add.getRight ()); } else if (operacija instance Oduzimanje) {Oduzimanje oduzimanje = (Oduzimanje) operacija; subtraction.setResult (subtraction.getLeft () - subtraction.getRight ()); }}}

Iako se ovo može činiti u redu, to nije dobar primjer OCP-a. Kad se pojavi novi zahtjev za dodavanjem funkcije množenja ili dijeljenja, ne možemo osim promjene izračunati metoda Kalkulator razred.

Stoga možemo reći da ovaj kod nije u skladu s OCP-om.

2.2. U skladu s OCP-om

Kao što smo vidjeli, naša aplikacija kalkulator još nije u skladu s OCP-om. Kod u izračunati metoda će se mijenjati sa svakim dolaznim zahtjevom za podršku za novu operaciju. Dakle, moramo izvući ovaj kôd i staviti ga u sloj apstrakcije.

Jedno rješenje je delegiranje svake operacije u njihovu odgovarajuću klasu:

javno sučelje CalculatorOperation {void perform (); }

Kao rezultat, Dodatak klasa može implementirati logiku zbrajanja dva broja:

javna klasa Dodatak implementira CalculatorOperation {private double left; privatno dvostruko pravo; privatni dvostruki rezultat; // konstruktor, getteri i postavljači @Prekrivi javnu void izvedbu () {rezultat = lijevo + desno; }}

Isto tako, ažurirano Oduzimanje razred bi imao sličnu logiku. I slično kao Dodatak i Oduzimanje, kao novi zahtjev za promjenom, mogli bismo implementirati podjela logika:

public class Division implementira CalculatorOperation {private double left; privatno dvostruko pravo; privatni dvostruki rezultat; // konstruktor, getteri i postavljači @Override public void perform () {if (desno! = 0) {rezultat = lijevo / desno; }}}

I na kraju, naša Kalkulator klasa ne treba implementirati novu logiku jer uvodimo nove operatore:

Kalkulator javne klase {izračun javne praznine (operacija CalculatorOperation) {if (operacija == null) {bacanje novog InvalidParameterException ("Nije moguće izvršiti operaciju"); } operation.perform (); }} 

Takav je razred zatvoreno radi preinake ali otvorena za produženje.

3. Zaključak

U ovom uputstvu naučili smo što je OCP po definiciji, a zatim smo razradili tu definiciju. Tada smo vidjeli primjer jednostavne aplikacije za računanje koja je imala nedostatak u dizajnu. I na kraju, dizajn smo učinili dobrim tako da se pridržava OCP-a.

Kao i uvijek, kôd je dostupan na GitHub-u.