SOLID princípy objektovo-orientovaného programovania

Vývoj softvéru je komplexný proces, ktorý si vyžaduje dôkladné plánovanie, architektúru a dizajn. Jedným z kľúčových cieľov pri vývoji softvéru je zabezpečiť jeho flexibilitu, rozšíriteľnosť a udržateľnosť. V tomto kontexte prichádzajú na scénu SOLID princípy, ktoré predstavujú súbor piatich základných princípov objektovo-orientovaného programovania (OOP), ktoré pomáhajú vytvárať kvalitný a dobre škálovateľný softvér. Tieto princípy boli navrhnuté Robertom C. Martinom a sú známe pod skratkou SOLID. V tomto článku si podrobne priblížime každý z týchto princípov.

Vedel si, že...

že len 20% až 40% času vývojári trávia skutočným písaním kódu? Zvyšok času čítajú kód a udržiavajú systém. Preto je dôležité vytvoriť dobrý návrh systému.

Dobre vytvorený softvér potrebuje kvalitný základ kódu, ktorý je ľahko čitateľný, pochopiteľný, udržiavateľný (pridávanie/zmena funkcií, oprava chýb) a rozšíriteľný do budúcnosti. Tým sa šetrí čas a zdroje na vývoj.

SOLID princípy OOP:

S – Single Responsibility Principle (Princíp jedinej zodpovednosti)

O – Open/Closed Principle (Princíp otvorenosti a uzavretosti)

L – Liskov Substitution Principle (Liskovov princíp substitúcie)

I – Interface Segregation Principle (Princíp segregácie rozhraní)

D – Dependency Inversion Principle (Princíp obrátenej závislosti)

Single Responsibility Principle (SRP) – Princíp jedinej zodpovednosti

Princíp jedinej zodpovednosti hovorí, že každý modul, trieda alebo funkcia v počítačovom programe by mala mať zodpovednosť za jednu časť funkcionality tohto programu. Taktiež by mali túto časť zapuzdriť a ich služby by mali úzko súvisieť s touto zodpovednosťou. Toto zaisťuje, že triedy sú menšie, prehľadnejšie, ľahko pochopiteľné a údržba kódu je jednoduchšia. Ak trieda vykonáva viacero úloh, stáva sa zložitou a náchylnou na chyby.

Príklady zodpovedností, ktoré môžu byť potrebné vo všeobecnosti v softvéri oddeliť:
formátovanie, parsovanie, mapovanie, validácia, logovanie, perzistencia, notifikácia, riešenie chýb, výber/inštancia triedy, atď.

Open/Closed Principle (OCP) – Princíp otvorenosti a uzavretosti

Princíp otvorenosti a uzavretosti nám hovorí, že moduly, triedy, funkcie by mali byť otvorené pre rozšírenie a zároveň uzavreté pre modifikáciu. To znamená, že by sme mali byť schopní meniť správanie modulu/triedy bez potreby zásahu do jej zdrojového kódu. Dosiahneme to pomocou rozhraní, abstraktných tried alebo dedičnosti. Týmto spôsobom minimalizujeme riziko zavedenia chýb do existujúceho kódu pri pridávaní nových funkcií.

Ako aplikovať OCP:

Pridávaj novú funkcionalitu vytvorením nových odvodených tried, ktoré budú dediť od pôvodnej základnej triedy a umožni klientovi prístup k pôvodnej triede cez abstraktné rozhranie prostredníctvom kompozičných návrhových vzorov, ako je napríklad vzor Strategy. Namiesto zmeny existujúcej funkcionality vytvor nové odvodené triedy a nechaj pôvodnú implementáciu triedy tak, ako je. K porušeniu tohto princípu dôjde, ak niekedy budeš musieť modifikovať základnú triedu.

Liskov Substitution Principle (LSP) – Liskovov princíp substitúcie

Liskov princíp substitúcie hovorí, že objekt danej triedy by mal byť schopný byť nahradený inštanciou jej odvodených tried bez zmeny správania programu. To znamená, že ak máme triedu A a od nej odvodenú triedu B, tak by sme mali byť schopní používať B všade tam, kde očakávame objekt typu A. Tento princíp nám zabezpečuje, že dedičnosť a polymorfizmus fungujú správne a konzistentne.

Ak môžeme úspešne nahradiť objekt/inštanciu triedy rodiča objektom/inštanciou triedy potomka bez ovplyvnenia správania inštancie základnej triedy, dodržiavame LSP. Keď sa tento princíp poruší, zvyčajne to vedie k mnohým ďalším podmieneným logikám rozhádzaným v celom aplikačnom kóde, ktoré kontrolujú, či je objekt určitého typu.

S rastúcou veľkosťou aplikácie sa duplicitný a roztrúsený kód stáva prostredím pre chyby. Veľmi častým porušením tohto princípu je čiastočná implementácia rozhraní alebo funkcionality základnej triedy, keď sa neimplementujú všetky metódy alebo vlastnosti a namiesto toho vyhodíme výnimku (napríklad NotImplementedException).

Do kódu, ktorý sa dodáva tretím stranám, takéto implementácie nepatria.
Do kódu, ktorý sa dodáva tretím stranám, takéto implementácie nepatria.

V kóde, o ktorom vieš, že ho použije iba jeden klient, ktorého môžeš monitorovať, je to v poriadku. Ale v zdieľanom kóde alebo ešte horšie, v rámci frameworku, ktorý sa dodáva tretím stranám, by sa takéto implementácie nemali vyskytnúť.

Ak má dané rozhranie viac funkcií, než potrebuješ, použi princíp segregácie rozhraní (ISP) na vytvorenie nového rozhrania, ktoré bude obsahovať iba funkcie, ktoré potrebuje tvoj klientský kód a ktoré môžeš plne implementovať.

Interface Segregation Principle (ISP) – Princíp segregácie rozhraní

Princíp segregácie rozhraní nám hovorí, že by sme radšej mali vytvárať viacero špecifických rozhraní než jedno veľké, všeobecné rozhranie. To nám pomáha minimalizovať závislosti a zabezpečiť, že triedy implementujú len tie metódy, ktoré potrebujú, a nie sú nútené implementovať nepotrebné metódy. Jednoducho povedané klienti by nemali byť nútení implementovať žiadne metódy, ktoré nepoužívajú.

Dependency Inversion Principle (DIP) – Princíp obrátenej závislosti

Princíp obrátenej závislosti hovorí, že moduly/triedy na vyššej úrovni by nemali závisieť od modulov/tried na nižšej úrovni. Namiesto toho by mali byť oba závislé na abstrakciách. Ďalej, abstrakcie by nemali závisieť na implementačných detailoch, tieto detaily by mali závisieť od abstrakcií.

Keď trieda pozná návrh a implementáciu inej triedy, zvyšuje sa riziko, že zmeny v jednej triede narušia druhú triedu. Vždy sa snaž udržiavať moduly/triedy na rôznych úrovniach čo najmenej spojené. Aby sme to dosiahli, musíme urobiť obe závislé na abstrakciách namiesto toho, aby sme sa poznali navzájom. Týmto spôsobom dosiahneme, že je kód flexibilný a môžeme ho ľahko meniť bez potreby meniť všetky miesta, kde je daná trieda použitá.

Záver

Princípy návrhu softvéru sú odporúčania, ktoré programátori dodržiavajú pri vytváraní softvéru s cieľom generovať čistý a udržateľný kód. Ide o zbierku techník a najlepších postupov odporúčaných mnohými známymi odborníkmi a autormi v priemysle.

SOLID princípy OOP predstavujú dôležitú súčasť objektovo-orientovaného návrhu softvéru. Ich dodržiavanie nám pomáha vytvárať kvalitný, udržateľný a ľahko rozšíriteľný kód.

Single Responsibility Principle zaisťuje, že triedy majú jedinú zodpovednosť.
Open/Closed Principle nám umožňuje meniť správanie tried bez modifikácie kódu.
Liskov Substitution Principle zabezpečuje, že odvodené triedy môžeme použiť namiesto rodičovej triedy. Interface Segregation Principle nám pomáha minimalizovať závislosti medzi triedami.
Dependency Inversion Principle zabezpečuje, že závisíme na abstrakciách, nie na konkrétnych implementáciách.

Ovládaš Solid princípy a programovací jazyk Java? Ak hľadáš prácu napr. ako Java programátor, pozri si naše firemné benefity a reaguj na najnovšie pracovné ponuky.

O autorovi

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Daj nám o sebe vedieť