Trochu mne překvapuje, kolik lidí začne automaticky mluvit o dědičnosti a kritizovat OOP skrze ní. Přitom (třídní) dědičnost není na OOP to nejdůležitější, dokonce ani v té Javě. Za klíčovou vlastnost považuji spojení stavu (dat) a chování (metod) do jednoho objektu a potom polymorfismus, díky kterému můžu s instancemi téhož rozhraní pracovat jednotným způsobem. Jestli tam existuje nějaká hierarchie tříd nepovažuji za úplně důležité – v některých případech to užitečné je, v jiných je to naopak na škodu – je potřeba nad tím přemýšlet (a typicky je dobré tu hierarchii držet jako implementační detail, abych ji mohl případně změnit, a jako veřejné API vystavovat jen rozhraní a s třídami tam být hodně opatrný).
K tématu jsem v minulosti psal tohle:
Anemický datový model.
A v článku o
RDF jsem měl tuto poznámku:
Nicméně, když se podobnými otázkami začneme zabývat, komplexita řešení narůstá poměrně vysokým tempem… a pak je na zvážení, zda jsou vyšší přínosy nebo naopak náklady spojené s touto komplexitou. Měli bychom postupovat podle podobných zásad jako při návrhu relačních databází. Cílem návrhu a datového modelování totiž není vytvořit v počítači dokonalý obraz reality, ale nalezení vhodné podmnožiny či dokonce pouhé aproximace tohoto obrazu, která bude užitečná pro naši aplikaci, pro daný případ užití.
Což platí nejen pro RDF a databáze, ale i pro OOP a modelování světa v počítači obecně. Je potřeba myslet na účelnost (dnes + s nějakým výhledem do budoucna) a ne tupě kopírovat objekty z vnějšího světa do počítače 1:1. Navíc často (většinou) je i potřeba udělat nejdřív redesign procesů a až potom digitalizovat / automatizovat ty upravené procesy.
Jinak ono na ten nepočítačový svět nejlépe pasuje z těch programátorských paradigmat právě to objektové (neplést nutně s dědičností), protože i objekty v tom nepočítačovém světě mají nějaký stav a nějaké chování. Fyzické objekty nikdy nejsou „immutable“ (i když by si to vyznavači funkcionální víry přáli :-). Ty objekty mají stav, který se v čase mění. Většinou mají i nějaké (pozorovatelné, zajímavé) chování, naopak bezstavových funkcí nebo procedur je v nepočítačovém světě minimum, pokud vůbec. Když např. na úřad pošlu nějakou žádost, tak se stav toho úřadu změnil (mají tam teď tu moji žádost a někdo na ní pracuje), stejně tak se změnil stav té žádosti (v podatelně ji orazítkovali) a změnil se i stav v mojí osobní evidenci (zapsal jsem si, když jsem žádost odeslal, a založil jsem si kopii). A když si posíláme dopisy, telefonujeme nebo jinak komunikujeme, tak vlastně voláme svoje metody. Když půjdu do obchodu, tak existuje určitý zavedený protokol (pozdravím, naskládám zboží do košíku nebo si o něj řeknu, u pokladny zaplatím…) tzn. existuje hodně obchodů, které implementují jedno rozhraní. Tím neříkám, že se to má modelovat 1:1, viz výše, ale OOP na ten vnější svět pasuje nejlíp.
P.S. Když píšu někdy v C, kde jsou zvlášť struktury a zvlášť funkce, tak cítím jistý deficit v programátorském pohodlí i v přehlednosti kódu. Ono i tam jde sice psát objektově a taky už jsem si něco takového napsal, ale je to takové kostrbaté – mít podporu OOP přímo v programovacím jazyce je lepší.