Uvod u objektno-funkcionalno programiranje i zašto vam preporučujem Swift i Scalu

Nemanja Maksimović, softverski inženjer iz Novog Sada i ko-osnivač Wolkabouta, nam u ovom članku daje predlog programskih jezika koji će, onima koji su navikli na objektno-orjentisani pristup, približiti koncepte funkcionalnog programiranja.

Nemanja Maksimović - 25. Maj, 2015.

Kao programer koji je veći deo svog obrazovanja i profesionalne karijere proveo u okrilju objektno-orjentisane paradigme, želim da vam iznesem svoje mišljenje o tome zašto i kako uvesti sve popularnije elemente funkcionalnog programiranja u svakodnevni rad. Moji projekti su najviše vezani za serverske i mobilne aplikacije, stoga je moje interesovanje prvenstveno vezano za jezike Swift i Scala.

Nova paradigma

Swift i Scala su programski jezici nove generacije, i predstavljaju odraz savremenih trendova kroz kombinaciju principa objektnog i funkcionalnog programiranja. S obzirom da su podržani koncepti objektnog progranja, programeri mogu da nastave da rade “po starom”, kao što je dobar broj programera nastavio da programira strukturno u objektno orijentisanim jezicima. Time će ne samo zanemariti značajan potencijal koji nude ovi jezici već i propustiti priliku da unaprede sebe kao programere usvajajući jednu novu paradigmu, nov način razmišljanja i rešavanja problema.

Kao što mnogi savremeni jezici preuzimaju na sebe rukovanje memorijom, oslobađajući programera da razmišlja i radi na višem nivou apstrakcije, tako nas savremeni funkcionalni alati oslobađaju brige o nekim od svakodnevnih problema na niskom implementacionom nivou. To programeru daje više prostora da se bavi optimalnim rešavanjem zadataka koji stvaraju vrednost klijentu ili krajnjim korisnicima.

Prepuštanje brige o detaljima

OO makes code understandable by encapsulating moving parts.  FP makes code understandable by minimizing moving parts. — Michael Feathers

Kompleksnost je izvor mnogih problema u programerskoj praksi. Vrlo često smo suočeni sa konceptima na različitim nivoima apstrakcije u okviru jedne funkcionalne celine; pravila biznis procesa pomešana sa implementacionim tehnikalijama oko prikaza, slanja, snimanja podataka itd. Ta kompleksnost je ono što Feathers zove moving parts. Problem se ispoljava tako što od detalja ne možemo jasno da vidimo širu sliku.

Objektno orjentisana paradigma programiranja se bazira na enkapsulaciji, tj. u sakrivanju implementacionih detalja unutrar celine (klase), a njene funkcionalnosti su dostupne kroz javno dostupni interfejs koji je na višem nivou apstrakcije. Dakle, programer omogućava drugim delovima sistema da koriste njegov kod kroz interfejs definisan u terminima i na nivou apstrakcije koji odgovara njihovim potrebama, idealno bez zalaženja u detalje implementacije.

Savremeni funkcionalni jezici, sa druge strane, smanjuju količinu implementacionih detalja tako što nam pružaju niz alata koji ih efikasno zamenjuju. Na prvom mestu, to su alati za rad sa kolekcijama podataka uz primenu funkcija višeg reda. U imperativnom pristupu, karakterističnom za strukturno i objektno programiranje,  programer bi eksplicitno, u nekoj vrsti petlje (često i više ugnježdenih),  prolazio kroz kolekciju podataka i izvodio operacije nad njenim elementima. Da procesiranje ne bi trajalo nedopustivo dugo, često se dodaju međustanja koja omogućavaju optimizacije algoritma. Ta ista međustanja, neminovno povećavaju kompleksnost rešenja i predstavljaju noćnu moru ukoliko želimo da uvedemo paralelizam u obradi kroz multithreading.

Savremeni funkcionalni alati podržavaju deklarativni pristup[1]; imaju ugrađene mehanizme optimizacije, i ne zahtevaju od programera da u svoj kod dodaje pomoćne strukture i stanja. To omogućava da se promoviše rad sa konstanatama umesto promenljivih, što umnogome smanjuje kompleksnost i pojavu neželjenih propratnih efekata, pogotovo kada govorimo o multithreaded izvršavanju.

Moja preporuka

Na nedavnim DAFED i Startit meetupima sam Android i Java programerima približio razvoj za iOS mapirajući Javu na Objective-C. Iako na prvi progled različiti, oba jezika pripadaju objektno-orjentisanoj paradigmi te elemente jednog nije previše teško objasniti poznatim elementima drugog. Objective C se veoma dugo koristi za razvoj u Apple-ovom ekosistemu, tako da postoji ogromna baza primera, dokumentacije, StackOverflow pitanja i odgovora, koja se može iskoristiti za učenje.

Ipak, ukoliko želite da razvijate proizvode za iOS platformu, što je naravno vrlo tražena i dobro plaćena veština koja pruža i mogućnosti za razvoj sopstvenog biznisa, svakako bih vam preporučio i upoznavanje sa Swiftom. Apple će pre ili kasnije nametnuti Swift kao podrazumevani jezik, a on vam pruža vam mogućnost primene elemenata funkcionalnog programiranja, uz čije korišćenje možete optimalno rešavati mnoge zadatke i unaprediti svoje programerske veštine.

Kao Java programer koji bi želeo da se uvede u funkcionalno programiranje, imate 2 opcije: Scala i Java 8.

Kroz Javu 8, određeni funkcionalni koncepti su napravili ulaz na mainstream JVM scenu. Na taj način se elementi funkcionalnog programiranja kroz Javu 8 mogu, postepeno i bez velikih rezova, “uvući” u postojeće projekte gde niste spoljnim razlozima vezani za neku staru verziju Jave. Ukoliko radite na takvom projektu, to je sasvim validan način da uđete u svet funkcionalnog programiranja.

Scala, iako možda još uvek nije mainstream, je svakako popularan JVM jezik, veoma sličan po konstrukcijama Swiftu. Poseduje pregršt moćnih koncepata i alata, terminološki prati teoriju funkcionalnog programiranja, i kao takav je sjajan izbor da se upoznate sa funkcionalnom paradigmom programiranja.  U odnosu na Javu je nešto kompleksniji jezik, i podrazumeva period prilagođavanja (“learning curve”),  ali je expresivniji (konciznija sintaksa, case classes, type inference…) i raspolaže nekim konceptima koji još uvek nisu dostupni u Javi (traits, pattern matching…). Scala je kompatibilna sa Java jezikom, tako da se biblioteke pisane u Javi mogu kombinovati sa Scala projektima. Kao bonus, ukoliko se pojavi potreba da nešto uradite za iOS ili OS X u Swiftu, tranzicija će vam biti relativno bezbolna.

Nadam se da sam vas zaintrigirao i želim vam puno zabave uz nove programerske veštine!

Znam da možemo da gradimo lokalno → pridruži nam se 27. septembra od 18h