Alan Key vs Alan Ford
Za Alana, OOP čine samo tri stvari.
Slanje poruka, izolacija i ekstremno kasno uvezivanje.
Zamislio je OOP kao umrežene kompjutere i to skalirao nadole. Svaki kompjuter ima svoje interno stanje, ima disk, može da računa. Komunicira sa drugim kompjuterima na mreži. Ovakav kompjuter, umanjen na virtualni entitet, je ono što Alan naziva ‘objekat’.
Većina OOP jezika ne radi ovako.
Jedna lasta ne čini proljeće, a kamoli dvije.
Da bi se bolje razumelo o čemu Alan govori, pomaže pogledati Smalltalk, jezik koji je izumeo. Za razliku od većine današnjih mejnstrim jezika, objekti u Smalltalku imaju samo metode. Nema propertija. Metode mogu da menjaju interno stanje objekta kojem pripadaju. Niko drugi, sa strane, ne može da menja podatke (stanje) objekta.
Prevedeno na naše OOP jezike, ovo znači da objekti komuniciraju isključivo pozivajući metode. Ne mogu da čitaju ili pišu stanje koje se čuva u drugom objektu. Slanje poruka je implementirano kao poziv metoda na primalačkom objektu. Jedino je primalački objekat odgovoran za značenje i efekat poslate poruke (pozvane metode). Pozivanje metoda ima semantiku “slanja poruka”.
U našim OOP jezicima je dozvoljeno direktno modifikovati stanje objekata: alanFord.setHeight(187)
. Takva linija ne znači ništa, naročito ne znači primalačkom objektu. Samo izvor, pozivač, ima ideju o čemu se radi, razbacanu kroz kod njegove aktuelne metode.
Bolje nešto od nečega nego ništa od ničega.
Ako pogledate prethodni članak, upravo je to ideja iza refaktorisanja. Primer #3 je rezultat koji odgovara Alanovoj zamisli. Do njega smo došli na drugi način, analizirajući LoD i nekakva pravila “dobrog” koda; zapravo sve vreme se (prikriveno) približavamo ovoj ideji. OOP-u ne treba LoD.
BOOP
BOOP je ono što je OOP danas == “Bad OOP”. Razmišljamo o objektima kao strukturama podataka na koje su zakačene funkcije.
Alan je stvari video drugačije. Video je objekat kao kolekciju mogućnosti, sposobnosti, koje se pozivaju slanjem poruke. Kako se poruka šalje je nebitno. Bitno je da objekat nije kolekcija podataka. Objekat sadrži samo stanje neophodno da se sposobnosti izvrše.
Tko spava, nije budan.
Znate šta može da bude objekat o kome govori Alan?
Modul.
U BOOP mi grupišemo metode u objekte, pogrešno vođeni time šta sve možemo da radimo sa podacima iz objekta. To su samo sposobnosti koji dele zajedničko stanje.
Ponavljam uporno pojam “sposobnost” dok čekam da se neko javi i kaže “funkcija”. Upravo, sposobnosti jesu funkcije. Da podestim na mudrost Broja Jedan, funkcija o kojoj pričam nije deklarisana funkcija u programskom jeziku. Ne, to je first-class citizen, instanca; ono što nazivam FUNCTION (sve kapitalno) u prethodnim tekstovima.
Kolekcija funkcija (sposobnosti) je modula.
Modul definiše poruke koje procesira. Modul se danas implementira u kodu, sutra može da postane odvojena biblioteka ili udaljeni mikroservis. Modul je izolovan i u vreme kompajliranja. I sam Alan se pitao da li je objekat kakav je u BOOP previše mali.
Cijena? Prava sitnica.
Pred nosom nam je još jedna zabavna stvar: nema klase u definiciji modula ka spolja. Samo potpisi sposobnosti i definicije imutabilnih podataka.
Tako je, OOP ne uključuje klase. Objekti NE moraju da budu izvedeni iz klasa da bi bili OOP. Klase se, zapravo, ne uklapaju lepo u OOP; kao ni nasleđivanje. Nemojte meni da verujete na reč; pitajmo Goslinga (Džejmsa, kreatora Jave; ne Rajana):
Kada bi kreirali Javu ponovo ispočetka, šta bi promenili? Izostavio bih klase.
Koliko sam uspeo da ukačim, klase (i nasleđivanje) je došlo iz programskog jezika Simula - kao hack za performanse koji su morali da implementiraju. Nikada nije trebalo da postane centralno mesto u OOP. Zato jesu u BOOP.
Tko leti, vrijedi
Dve stvari čine da se osećam kao da sam u stripu Alana Forda. Prva je da se posle pedesetak godina i dalje pitamo šta radimo. Druga je da nismo uspostavili dovoljno jasno vrednost kvalitetnog koda. Kao tinejdžerski seks, svi o tome pričamo, a najmanje radimo.
Koga i briga za dobar kod?