Åpent / lukket prinsipp i Java

1. Oversikt

I denne veiledningen diskuterer vi Open / Closed Principle (OCP) som et av SOLID-prinsippene for objektorientert programmering.

Samlet sett vil vi gå i detalj om hva dette prinsippet er og hvordan vi implementerer det når vi designer programvaren vår.

2. Åpent / lukket prinsipp

Som navnet antyder, sier dette prinsippet at programvareenheter skal være åpne for utvidelse, men lukkes for modifikasjon. Som et resultat, når forretningskravene endres, kan enheten utvides, men ikke endres.

For illustrasjonen nedenfor, vi vil fokusere på hvordan grensesnitt er en måte å følge OCP på.

2.1. Ikke-kompatibel

La oss vurdere at vi bygger en kalkulatorapp som kan ha flere operasjoner, for eksempel tillegg og subtraksjon.

Først og fremst definerer vi et grensesnitt på toppnivå - Kalkulator Operasjon:

offentlig grensesnitt CalculatorOperation {}

La oss definere en Addisjon klasse, som vil legge til to tall og implementere Calculator Operasjon:

public class Addition implementerer CalculatorOperation {privat dobbelt til venstre; privat dobbelt rett; privat dobbeltresultat = 0,0; offentlig tillegg (dobbelt til venstre, dobbelt til høyre) {this.left = venstre; this.right = right; } // getters og setters}

Per nå har vi bare en klasse Addisjon, så vi må definere en annen klasse som heter Subtraksjon:

offentlig klasse Subtraksjon implementerer CalculatorOperation {privat dobbelt venstre; privat dobbelt rett; privat dobbeltresultat = 0,0; offentlig subtraksjon (dobbel venstre, dobbel høyre) {this.left = venstre; this.right = right; } // getters og setters}

La oss nå definere hovedklassen vår, som skal utføre kalkulatoroperasjonene våre:

public class Calculator {public void calculate (CalculatorOperation operation) {if (operation == null) {throw new InvalidParameterException ("Kan ikke utføre operasjon"); } if (operation instanceof Addition) {Addition addition = (Addition) operation; addition.setResult (tillegg.getLeft () + tillegg.getRett ()); } annet hvis (operasjonsinstans av subtraksjon) {Subtraksjon subtraksjon = (Subtraksjon) operasjon; subtraction.setResult (subtraction.getLeft () - subtraction.getRight ()); }}}

Selv om dette kan virke greit, er det ikke et godt eksempel på OCP. Når et nytt krav om å legge til multiplikasjon eller del funksjonalitet kommer inn, har vi ingen måte i tillegg til å endre regne ut metoden for Kalkulator klasse.

Derfor kan vi si at denne koden ikke er OCP-kompatibel.

2.2. OCP-kompatibel

Som vi har sett, er ikke kalkulatorappen vår OCP-kompatibel ennå. Koden i regne ut metoden vil endres med hver innkommende nye operasjonsstøtteforespørsel. Så vi må trekke ut denne koden og legge den i et abstraksjonslag.

En løsning er å delegere hver operasjon i sin respektive klasse:

offentlig grensesnitt CalculatorOperation {void perform (); }

Som et resultat ble den Addisjon klasse kunne implementere logikken med å legge til to tall:

public class Addition implementerer CalculatorOperation {privat dobbelt til venstre; privat dobbelt rett; privat dobbeltresultat; // constructor, getters and setters @Override public void perform () {result = venstre + høyre; }}

Likeledes en oppdatert Subtraksjon klasse ville ha lignende logikk. Og på samme måte som Addisjon og Subtraksjon, som en ny forespørsel om endring, kunne vi implementere inndeling logikk:

offentlig klasse Divisjon implementerer CalculatorOperation {privat dobbelt venstre; privat dobbelt rett; privat dobbelt resultat; // constructor, getters and setters @Override public void perform () {if (right! = 0) {result = left / right; }}}

Og til slutt, vår Kalkulator klasse trenger ikke implementere ny logikk når vi introduserer nye operatører:

public class Calculator {public void calculate (CalculatorOperation operation) {if (operation == null) {throw new InvalidParameterException ("Kan ikke utføre operasjon"); } drift.perform (); }} 

På den måten er klassen lukket for modifikasjon men åpen for utvidelse.

3. Konklusjon

I denne opplæringen har vi lært hva som er OCP per definisjon, og deretter utdypet den definisjonen. Vi så et eksempel på en enkel kalkulatorapplikasjon som var feil i utformingen. Til slutt gjorde vi designet bra ved å gjøre det til OCP.

Som alltid er koden tilgjengelig på GitHub.


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