Uvod u dizajn paterne

Za pravljenje ozbiljnog softvera, dobro poznavanje nekog programskog jezika i opštih principa programiranja je neophodno. Ali ne i dovoljno.

Aleksa Vidović - 14. Novembar, 2016.

Grupa od 4 programera napisala je 1990. godine knjigu pod nazivom — Design Patterns: Elements of Reusable Object-Oriented Software. Knjiga je postala kultna, a autori su postali poznati u zajednici kao “Gang of Four”.

Vodili su se jednostavnom filozofijom: ako se neki problem u dizajnu softvera često ponavlja, verovatno postoji optimalno, generalizovano rešenje koje bi svako mogao da prilagodi za svoj specifičan slučaj.

Ako bismo dobili zadatak da izgradimo kuću, ona bi verovatno imala temelj, 4 zida i krov. Iako se sve kuće međusobno razlikuju, izgrađene su prema sličnom šablonu.

Slično, ako bismo pokušali da napravimo android aplikaciju, ona bi verovatno imala Model, View-ove i Controller — to jest, zasnivala bi se na nekom ustaljenom šablonu pravljenja mobilnih aplikacija.

Šta su, dakle, dizajn paterni?

Dizajn patern je ponovo iskoristivo rešenje koje se može primeniti na problem koji se često ponavlja u razvoju softvera.

Dizajn paterni se kod nas nazivaju i “projektni uzorci”, a u praksi ćete čuti oba naziva.

Kako Adi Osmani kaže u svojoj knjizi “Learning JavaScript Design Patterns”, postoje tri glavna benefita korišćenja dizajn paterna:

  1. Oni su dokazana rešenja — koriste isproban pristup rešavanju čestih problema u razvoju softvera, baziran na iskustvu i radu developera koji su doprineli razvoju paterna
  2. Lako ih je ponovo iskoristiti — patern je uglavnom “out of the box” rešenje čestog problema, a činjenica da možemo da ih prilagodimo svojim potrebama čini ovaj koncept moćnim.
  3. Paterni su ekspresivni — za svaki od njih se uglavnom vezuje i određena struktura i specifičan rečnik, što čini saradnju i komunikaciju među developerima lakšom i efikasnijom.

Postoji još mnogo toga u vezi sa definisanjem projektnog uzorka, ali to nije preterano bitno za ovaj kratak uvod.

Ono što je mnogo bitnije da programeri početnici imaju u vidu jeste činjenica da su dizajn paterni obavezan preduslov za pisanje velikih softverskih projekata, a opet su često zapostavljeni na većini obrazovnih ustanova, pa mnogi moraju da ih nauče “na teži način”.

“Teži način” uglavnom uključuje izmišljanje tople vode, mnogo frustracije i nerviranja. Onda se ispostavi da je taj problem već rešen, i da većina iskusnih programera koristi idejno slično rešenje za njega. To rešenje je uglavnom neki dizajn patern.

code_monkey
Al’ to nema na Codecademy

Ne morate da ih znate napamet — naprotiv. Mnogi misle da će vas samo praćenje dobrih programerskih praksi (DRY, YAGNI, KISS, separation of concerns) navesti na projektne uzorke, tj. da će vaši programi sami po sebi početi da liče na ustaljena arhitekturalna rešenja.

Objektno orijentisano programiranje i dalje je industrijski standard, a dizajn paterni se najviše tiču upravo ove paradigme. To rezultira time da, ukoliko želite da radite na ozbiljnim projektima, morate dobro da poznajete paterne.

Gorepomenuti “rečnik” vezan za paterne takođe je važan — on doprinosi standardizaciji i efikasnosti komunikacije među developerima.

Zaista jeste bitno da kada kažemo, na primer, da je neka klasa “Singleton”, svi u timu znaju šta to znači. Ili, da prilikom pravljenja mobilne aplikacije svi znaju šta je MVC, kako bi bolje mogli da shvate svoj deo zadatka, ako im je, recimo, dodeljeno da razvijaju view-ove.

Takođe, postoje i takozvani arhitekturalni paterni, ali mnogi ne prave značajnu razliku između ove dve grupe. Arhitekturalnima se smatraju oni paterni koji se tiču višeg nivoa apstrakcije i vezani su za, očigledno, arhitekturu.

Vrste dizajn paterna

Već pomenuta knjiga grupe autora Gang of Four postala je referentni materijal u ovoj oblasti. Ona objašnjava 23 osnovna paterna, i svrstava ih u tri kategorije.

Kreacioni paterni

Ovi paterni bave se kreacijom objekata, na način prilagođen određenoj primeni. Posebno su važni u situacijama u kojima bi uobičajen pristup kreiranju objekata doveo do povećanja kompleksnosti projekta.

Neki od paterna koji spadaju u ovu grupu su: Constructor, Factory, Abstract, Prototype, Singleton and Builder.

Strukturalni paterni

Strukturalni paterni bave se kompozicijom i obično predstavljaju različite načine za definisanje odnosa među objektima. Oni obezbeđuju da kada je neophodna promena u jednom delu sistema, ostatak sistema ne mora da se menja. Takođe pomažu da svaki deo sistema radi ono čemu je najbolje prilagođen.

Neki od strukturalnih paterna su: Decorator, Facade, Flyweight, Adapter i Proxy.

Bihevioralni paterni

Ova grupa paterna tiče se poboljšanja komunikacije između različitih objekata u sistemu.

Poznati primeri su: Iterator, Mediator, Observer i Visitor.

Pored toga postoje i pomenuti arhitekturalni paterni. Već smo spomenuli čime se oni bave, a neki od poznatih primera su: Client-server, REST, Peer to peer i sl.

Šta je sledeće?

Ovaj tekst je samo uvod u serijal u kojem ćemo pokriti najvažnije teme iz ove oblasti. Biće reči o pojedinačnim paternima, antipaternima, praktičnim primenama u izgradnji aplikacija, a razmotrićemo i šta se u funkcionalnom programiranju dešava po ovom pitanju.

Pored toga, spomenuta knjiga “Design Patterns: Elements of Reusable Object-Oriented Software” je lektira koju bi svi programeri trebalo da pročitaju u toku svoje karijere.

Takođe pomenuta knjiga “Learning JavaScript Design Patterns” dostupna je besplatno online, i daje vrlo dobar uvod u temu, kroz primere iz JavaScript aplikacija.

Do sledećeg teksta, srećno kodiranje!