OOP má jiný zásadní problém. A to ten, že už vlastně vůbec nikdo neví, co to to OOP vůbec je.
Porovnejte si OOP v Smalltalku, Selfu, Javě, C++, Javascriptu a Lue a řekněte mi, co tam je společného. Všechno je to OOP, jenom to pokaždé znamená něco jiného. A v tomhle prostředí se jakákoliv kritika strašně jednoduše shazuje. Prostě tomu kritik nerozumí a vlastně vůbec neprogramuje objektově. :)
Z původní myšlenky už zůstal jen cool název. A asi proto se teď pro objekty v původním Kayově významu používá spíš termín "mikroslužby". A pod starým názvem se skrývají minimálně tři vzájemně nekompatibilní přístupy.
A tohle jsou podmínky nutné, nebo postačující? IMO ani jedno.
- Třeba Lua nebo Javascript vlastně žádné zapouzdření nemají.
- Takové Go dědičnost nemá vůbec a ve spoustě klasických dynamických jazyků (jako třeba smalltalk) je dědičnost jen syntaktický cukříček nad přeposíláním zpráv "někam" dál.
- Polymorfismu je spousta druhů. S konceptem objektů se AFAIK pojí ten podtypový. A třeba v C++ se běžně pracuje s objekty, které polymorfní nejsou.
- A abstrakci jsem si nechal nakonec. Tu jsem zatím v žádné definici OOP nepotkal. Asi proto, že v našem oboru je abstrakce úplně všechno.
A nic, jen že Pavel ukázal, že mnoho lidí dneska si pod pojmem OOP představuje něco jiného, než je Kayovo OOP, což i v této diskuzi vede k problémům, protože si každej představuje něco odlišného (prostě je to tvárný termín, který kdysi zneužilo pár firem a konsorcií).
O tom, že dnešní class-based OOP se subtypovým polymorfismem přesahují původní Kayovu myšlenku, se tady bavit moc nebudu - protože to IMHO není pravda, spíš se naopak oklikou vracíme k původnímu konceptu objektů a asynchronních zpráv (ale ne v mainstreamových jazycích).
Mluvíš úplně o něčem jiném. Celou dobu tu řešíme, co si běžný programátor představí pod pojmem OOP. Zkus si udělat anketu a uvidíš, že 95% lidí si představí právě "Encapsulation, Abstraction, Inheritance, Polymorphism.
To, že se dá objektově programovat i když to jazyk nepodporuje je pravda, ale proč bych si to proboha dělal? To, že jsou jazyky, kde si pod OOP představují něco jiného je taky pravda. Ale běžné použití toho pojmu znamená tohle.
Co se snažím říct je, že tyhle věci bývají spojené s pojmem OOP ale vlastně opačným směrem. Tři z těch čtyř věcí nejsou něco co OOP definume, ale něco co se dá udělat i pomocí OOP. Z významu těch pojmů se to, co to oop vlastně je, odhadnout moc nedá. Běžný programátor si pod pojmem OOP představí classy z Javy případně podobnou věc z jeho jazyka. Prostě nějaké balíčky dat a kódu pohromadě. Zapouzdření a podobně jsou abstraktní pojmy, které chápe právě skrz to jak je to zapsané v jeho (objektovém) jazyce.
Jinými slovy. Pokud uděláš anketu tak možná 95% lidí odpoví to samé. Ale budou tím myslet různé věci určené tím, jaký jazyk budou mít na mysli. Něco jiného si představí Javista a něco jiného webař i když z nich třeba vypadne stejný abstraktní pojem.
jojo takto to odhrká, protože se to bralo v nějakém předmětu na VŠ. Ale co si pod těmi pojmy _představí_? Skutečně těch 95% lidí dokáže říct, co to znamená polymorfismus a kde se může uplatnit? To dost pochybuji, IMHO dají dohromady subtypový polymorfismus.
A "abstrakce"? To znamená "skrývání komplexnosti", což dělá už assembler (vysokoúrovňový strojový ḱód), céčko, vlastne cokoli nad strojákem.
No já se na školeních setkal, že v tom je dost hokej. Něco jiného tvrdí Javisti, protože jsou ovlivněni class-based OOP Javy s rozhraními. Něco trošku jiného lidi od C++ a otázka je, co si myslet o JavaScriptu a Pythonu. Podle mě to jsou OOP jazyky, i když například "encapsulation" se tam dělá dost přes ruku. Na druhou stranu Object Pascal má u tříd dokonce pět typů přístupu: public, private, strictly private, protected, published - znamená to, že má vlastnost "encapsulation" implementovanou na vyšší úrovni, nebo je "encapsulation" pouze obecnější (tvárnější) koncept?
A možná bráno do důsledků - je jakýkoli jazyk umožňující přístup k atributům objektů vůbec objektový ve smyslu, že podporuje "encapsulation" (původní OOP s něčím takovým explicitně vůbec nepočítá, protože se veškerá komunikace s objektem odehrává pomocí zpráv).
Taky jsou zmatky ohledně polymorfismu, kde lidi okolo Javy a C++ často dávají rovnítko polymorfismus==subtypový polymorfismus (a přiznám se, že na pohovorech se ptáme právě na toto a jen málokdo to dále rozvine). Jenže ten pojem je obecnější.
Takže termín OOP je bohužel tvárný
Tady žádný velký prostor pro relativizaci NENÍ. Kdo OOP vymyslel, se ví, jak to myslel, se taky ví. Tak co tady pořád řešíte? Za to, že soudruzi z Javy nepojmenovali svůj experiment „rádobyOOP ve stylu Javy“, původní OOP nemůže, to je jejich blbost. Že se začnu nazývat prezidentem Rakouska, ještě neznamená, že jím opravdu jsem.
Bohužel tady ten prostor je. S pojmem OOP nepřišel jako první Smalltalk ale Simula. A už tady se to začíná větvit. C++ a následně pak Java, nebo C# vycházejí přímo ze Simuly. Simula ještě nedotáhla oop do čisté podoby, to až právě ten Smalltalk. Ale to Javoidní OOP se stihlo odvětvit ještě před tím. Ten prostor tu máme už od počátku. A samozřejmě že se to větví dál.
V té hybridní/statické větvi (vycházející přímo ze Simuly) se od sebe třeba C++ a Java dost vzdalují. Už bych se bál tvrdit, že Java je zjednodušené C++.
A v té čisté/dynamické větvi ze Smalltalku se to zase větví na třídy vs. prototypy a podobně.
Takže sorry, ale o žádném původním versus rádoby OOP nemůže být řeč. Mohli bychom se leda tak dohadovat jestli se tomu původnímu Simulovskému OOP podobá spíš ta Java nebo Smalltalk. Ale do toho vážně nejdu.
Simula měla sice první třídy, ale předpokládám, že fungovaly pouze jako structy (tj. ono javoidní pseudoOO), nikde se mi nepodařilo dohledat, že by to používalo jakékoliv zasílání zpráv či dispatching na straně objektu. Pokud vím, tak se tomu ani OO neříkalo, ten termín neexistoval, byl použit teprve později Kayem pro objekty se zasíláním zpráv.
Kayovo OO mechanismus vzniku objektu neřeší.
Zatím mi připadá, že "vo tom to je". Každý trochu rozsáhlý software se musí s těmito čtyřmi živly sblížit - a je vcelku jedno, jestli ho píšete v Javě, C++, holém C nebo assembleru. Prostě k tomu vede potřeba zvládat složitost. Tohle láteření na OOP (vs. procedurální přístup)... vždyť je to celé blbost. Nebo je možná blbost, označit linuxový kernel jako procedurálně napsaný software...
Osobně láteřím především tím směrem, že software je čím dál složitější, a to z několika důvodů:
1) umí toho čím dál víc
2) modeluje čím dál složitější realitu
3) možná se občas nevyhneme over-engineeringu
4) rozvratné spodní proudy jako příliš detailní modelování "business procesů", které by stálo za to především zbavit zbytečných kliček a kudrdlinek, které jsou dány spíše tradicí a setrvačností společnosti než reálným opodstatněním
5) zadání pro tvorbu a rozvoj softwaru vznikají na základě obchodně-politických tlaků a "pravdu má zákazník", možná někdy ke své škodě?
6) neustálý technický pokrok je hrozná svině
Za nic z toho OOP nemůže. Je jedno v čem ten software napíšete, vždycky vyjde složitý.
„...že už vlastně vůbec nikdo neví, co to to OOP vůbec je.“
Ale h. Termín „object oriented“ vymyslel Kay, sám to řekl, a nikdo mu to nerozporoval, naopak je to považováno za skutečnost, takže z tohoto můžeme klidně vyjít, aniž bychom se museli dohadovat.
Ve svých rozhovorech zmiňuje 2 klíčové vlastnosti, které musí OOP splňovat:
1. zasílání zpráv (toto je zcela klíčové!)
2. zapouzdření
To je celé. Identita objektu pak vyplývá z logiky věci, polymorfismus je důsledkem zpráv, ne dodanou funkcionalitou, ještě se někdy uvádí skládání objektů. Dědičnost se zde NEVYSKYTUJE, přestože 90 % dotazovaných ji uvádí jako klíčový prvek OOP, takže je vidět, jaká představa o OOP panuje a odkud se asi tak vzala.
To je odpověď. Jako test si můžete ověřit, který z vámi vyjmenovaných jazyků je „object oriented“.
No ano. Pokud to budu brát podle Kaye, tak drtivá většina dnešních objektových jazyků vůbec objektová není. A naopak jeho typu objektů se dnes často říká spíš mikroslužby.
Dnes si IMO pod OOP většina programátorů představí spíš jakési balení dat a kódu do jedné entity. A podle druhu jazyka to má pak dost odlišné vlastnosti.
OOP rozhodně není jediný pojem, který skončil takhle znásilněný.