Princíp otvorenej / uzavretej v Jave

1. Prehľad

V tomto výučbe sa budeme zaoberať princípom Open / Closed Principle (OCP) ako jedným z princípov SOLID objektovo orientovaného programovania.

Celkovo pôjdeme do podrobností o tom, čo je tento princíp a ako ho implementovať pri navrhovaní nášho softvéru.

2. Princíp otvorenia / zatvorenia

Ako naznačuje názov, tento princíp hovorí, že softvérové ​​entity by mali byť otvorené pre rozšírenie, ale uzavreté pre modifikáciu. Výsledkom je, že keď sa zmenia obchodné požiadavky, jednotka sa môže rozšíriť, ale nemôže sa zmeniť.

Pre ilustráciu nižšie zameriame sa na to, ako sú rozhrania jedným zo spôsobov, ako sledovať OCP.

2.1. Nevyhovuje

Uvažujme, že vytvárame aplikáciu kalkulačky, ktorá môže mať niekoľko operácií, napríklad sčítanie a odčítanie.

Najskôr definujeme rozhranie najvyššej úrovne - CalculatorOperation:

verejné rozhranie CalculatorOperation {}

Definujme si Dodatok triedy, ktorá by pridala dve čísla a implementovala by CalculatorOperation:

verejná trieda Dodatok implementuje CalculatorOperation {private double left; súkromné ​​dvojité právo; súkromný dvojnásobný výsledok = 0,0; verejné pridanie (dvojitá ľavá, dvojitá pravá) {this.left = ľavá; this.right = right; } // zakladatelia a zakladatelia}

Odteraz máme iba jednu triedu Dodatok, takže musíme definovať inú pomenovanú triedu Odčítanie:

verejná trieda Odčítanie implementuje CalculatorOperation {private double left; súkromné ​​dvojité právo; súkromný dvojnásobný výsledok = 0,0; verejné Odčítanie (dvojitá ľavá, dvojitá pravá) {this.left = left; this.right = right; } // zakladatelia a zakladatelia}

Poďme si teraz definovať našu hlavnú triedu, ktorá bude vykonávať naše operácie kalkulačky:

public class Calculator {public void Calculate (CalculatorOperation operation) {if (operation == null) {throw new InvalidParameterException ("Can not perform operation"); } if (operation instanceof Addition) {Addition addition = (Addition) operation; addition.setResult (addition.getLeft () + addition.getRight ()); } else if (operácia instanceof Odčítanie) {Odčítanie odčítanie = (Odčítanie) operácia; subtraction.setResult (subtraction.getLeft () - subtraction.getRight ()); }}}

Aj keď sa to môže zdať v poriadku, nie je to dobrý príklad OCP. Keď sa objaví nová požiadavka na pridanie funkcie násobenia alebo rozdelenia, nemáme inú možnosť ako zmeniť vypočítať metóda Kalkulačka trieda.

Môžeme teda povedať, že tento kód nie je v súlade s OCP.

2.2. V súlade s OCP

Ako sme videli, naša aplikácia kalkulačky zatiaľ nie je v súlade s OCP. Kód v vypočítať metóda sa zmení s každou prichádzajúcou novou požiadavkou na podporu prevádzky. Musíme teda tento kód extrahovať a vložiť do abstrakčnej vrstvy.

Jedným z riešení je delegovanie každej operácie do príslušnej triedy:

verejné rozhranie CalculatorOperation {void perform (); }

Výsledkom je, že Dodatok trieda mohla implementovať logiku pridania dvoch čísel:

verejná trieda Dodatok implementuje CalculatorOperation {private double left; súkromné ​​dvojité právo; súkromný dvojitý výsledok; // konštruktor, getri a nastavovatelia @Override public void perform () {result = left + right; }}

Rovnako tak aktualizovaný Odčítanie trieda by mala podobnú logiku. A podobne ako Dodatok a Odčítanie, ako novú žiadosť o zmenu by sme mohli implementovať rozdelenie logika:

divízia verejnej triedy implementuje CalculatorOperation {private double left; súkromné ​​dvojité právo; súkromný dvojitý výsledok; // konštruktor, getri a nastavovatelia @Override public void perform () {if (right! = 0) {result = left / right; }}}

A nakoniec náš Kalkulačka trieda nemusí implementovať novú logiku, pretože predstavujeme nových operátorov:

public class Calculator {public void Calculate (CalculatorOperation operation) {if (operation == null) {throw new InvalidParameterException ("Cannot perform operation"); } operation.perform (); }} 

Taká je trieda zatvorené na úpravu ale otvorené pre rozšírenie.

3. Záver

V tomto tutoriáli sme sa naučili, čo je OCP podľa definície, a potom sme túto definíciu rozvinuli. Potom sme videli príklad jednoduchej aplikácie kalkulačky, ktorá bola chybná vo svojom dizajne. Nakoniec sme dizajn vylepšili tým, že sme dodržali OCP.

Ako vždy, kód je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found