OOP: Nasljeđivanje [Objašnjeno]

Friday, April 01, 2016


Kada pričamo o Objektno-Orijentisanom Programiranju (namjerno sve velikim slovima) i njegovim ključnim konceptima neophodno je spomenuti i Nasljeđivanje, kada bih morao da odgovorim sa samo jednom rečenicom šta je naljeđivanje u OOP , to bi bio proces smanjivanja i optimiziranja programskog koda, te povezivanje logičkih cjelina/klasa u hijerarhijsku vezu, u kojoj kreiramo nove objekte na osnovu klasa koje dijele iste ili slične atribute. OOP o kojem sam pričao u prošlom blog postu link je ovdje.

Nasljeđivanje u OOP je način kreiranja novih klasa i objekata koristeći već definisane klase. Klasa koje nasljeđuju drugu klasu se naziva izvedena a klasa koja je naljeđena se naziva bazna klasa. Važne prednosti ovog koncepta Objektno-orijentisanog programiranja je iskorištavanje dosada napisanog koda i smanjivanje kompleksnosti aplikacije. Izvedene klase preklapaju i nadopunjuju mogućnosti koje pruža bazna klasa u nekim programskim jezicima poznatija kao super-klasa...

Kroz primjer koji ću navesti ovo će biti mnogo jasnije, recimo da u našoj aplikaciji imamo klasu Osoba, koja ima atribute kao što su: ime, prezime, visina, godina rođenja, grad iz kojeg dolazi ..itd. Nakon toga imamo potrebu da kreiramo klasu Fudbaler, ako razmislimo atributi koje bi fudbaler imao su: ime, prezime, visina, godina rođenja, grad iz kojeg dolazi, broj na dresu, ukupan broj golova, broj kopački ... itd.

Namjerno sam boldirao zadnje atribute kako bih istakao ono što je specifično za fudbalera, ako bolje pogledamo shvatit ćemo da se dosta, tačnije četri atributa ponavlja kao i u klasi Osoba pa samim time i neke funkcije koje posjeduje i Osoba. I na samo dvije klase imamo značajan broj ponavljanja i bespotrebnog dupliciranja programskog koda.

Na ovom nivou to je mnogo, a da ne spominjemo koliko je to "problematično" na većim aplikacijama gdje klase imaju mnogo više funkcija i atributa.

Ako to dupliciranje kroz programski kod izgleda ovako:

Kao što možemo primjetiti sve one atribute i funkcije koje ima Osoba ima i Fudbaler, plus one koje su specifične samo za fudbalera. Sličnost između ove dvije klase se ogleda upravo u ovim zajedničkim atributima i funkcijama koje možemo da spojimo i iskoristimo na bolji način pomoću koncepta zvanog Nasljeđivanje.

Ako primjenimo koncept nasljeđivanja na ovom našem primjeru kod će izgledati ovako:

Za ovaj primjer koristim programski jezik C++ i u prvoj liniji koda upravo radim nasljeđivanje, prva linija koda nam govori da klasa fudbaler nasljeđuje klasu Osoba sve njene atribute i funkcije... ovim smo uveliko smanjili ponavljanje koda i učinili našu App modularnijom i optimizovanijom za održavanje.

I ako pročitamo prvu liniju koda ona može u prevodu da znači svaki fudbaler je ujedno i osoba, što je naravno u potpunosti tačno pa je i sam logičan slijed da te dvije klase moraju da dijele atribute i ponašanja.

Pitanje se postavlja kada da koristimo nasljeđivanje, po nekom pravilu ono je potrebno kada u analizi uočimo pojavu da slične klase počinju da poprimaju dosta zajedničkih osobina... i naravno u slučajevima kada je to nasljeđivanje logično isto kao i u stvarnom životu.

Jedan od primjera ... ako imamo app koja ima različite korisničke uloge npr. app za vođenje restorana pa entiteti i klase koje mi na pamet padaju su: konobar, šef sale, upravnik, gosti (registrovani), VIP gosti (registrovani) ... itd.

Upravnik će po logičnom slijedu biti izvedena klasa zaposlenika, a zaposlenik izvedena klase klase osoba. konobar također, ali u isto vrijeme će konobar biti i bazna klasa za šefa sale i u toj hijerarhiji i konobar i šef sale će naslijeđivati zaposlenika i samim tim osobu, stim da konobar ima neke specifične atribute koje osoba ne posjeduje, pa tako i šef sale ima sve ono što i konobar plus neke atribute koji više opisiju njega i njegovo ponašanje.

Gosti će naravno biti izvedena klasa osobe, a VIP gosti će biti izvedena klasa klase gosti jer oni kao registrovani VIP gosti imaju sve one atribute koji karakterišu goste plus dodatne mogućnosti koje bi imali u našem informacionom sistemu za upravljanje restoranom.

Nadam se da vam je kroz par primjera jasnije o čemu se radi u konceptu nasljeđivanja. Bazna klasa je nageneraliniji oblik entiteta, i što više idemo prema dole, prema izvedenim klasa idemo u specijalizovanije oblike tog entiteta. Mislim da će na ovoj slici biti dosta jasnija slika oko nasljeđivanja:


Mislim da par prijašnjih paragrafa se na ovoj slici odlično razumiju, ako gledamo sliku prema dole vidimo pojavu specijalizacije, a sa dna prema gore se javlja pojava generalizacije i neko ko nije iz svjeta programiranja može da skonta da je šef sale ujedno i konobar (ali sa mnogo više uticaja i funkcija), da je ujedno i zaposlenik i na kraju krajeva osoba. Ista priča je primjenjiva i na VIP gosta i običnog gosta.

Na desnoj strani ovog dijagrama vidimo da upravnik i konobar nasljeđuju klasu zaposlenik, ali konobar i upravnik pored toga ništa drugo nemaju zajednički i ne bi bio stran slučaj da smo imali još par klasa koje nasljeđuju klasu zaposlenik.

U ovom blogu postu sam se najmanje osvrtao na neki programski jezik posebno, više mi je želja bila da pišem generalno konceptu nasljeđivanja u OOP-u. Pa da zaključim ovaj blog post: Nasljeđivanje je koncept Objektno orijentisanog programiranja koji nam dopušta da uvodimo hijerarhiju u našim aplikacijama, da iskoristimo naš programski kod maksimalno bez nepotrebnog dupliciranja i uveliko se povećava modularnost i održavanje koda.

Nadam se da vam je ovaj blog post približio ideju nasljeđivanja, koliko je korisno i bitno u modernom OOP i da ćete poslije ovog blog posta mnogo više razmiljati o optimizaciji vašeg programskog koda. Ako niste preporučujem vam da pročitate blog post vezan za Objektno orijentisani programiranje koji možete pronaći ovdje kao i blog post vezan za koncept Enkapsulacije link ovdje.

Pozdrav! Almir Vuk | AV Development | http://almirvuk.blogspot.ba/

You Might Also Like

0 comments