406
Vývoj / Re: Jste zastánci OOP programování?
« kdy: 11. 12. 2010, 00:14:12 »... nejsem velký zastánce nadužívání šablon, pokud to nemá smysl. A nemá to smysl tam, kde nepotřebuju honit výkon na úkor čitelnosti a flexibilnosti. Prostě běžná rozhraní mám klasicky abstraktní s virtuálními metodami a používám šablony opravdu tam kde to je třeba. Třeba tam, kde si se standardním rozhraním nevystačím, například proto, že rozhraní nejde ani popsat pomocí vyjadřovacích prostředků C++ (například, "objekt musí mít defaultní konstruktor", atd)
....
Psát program celý v šablonách s tím, že místo konkrétního rozhraní tam mám všude T... to se samozřejmě dá, ale člověk se musí připravit na jiné obtíže, například že díky neexistuence konceptů bude často chyby hledat v nějaké desáté úrovni vnoření a louskat hlášky GCC, proč zrovna tenhle objekt nejde do funkce použít a co mu ještě chybí, aby to šlo (třeba nemá defaultní konstruktor)
...
Jinak rozhraní program nic nestojí. Implementace rozhraní stojí jednu tabulku VT navíc a dynamic_cast je asi nejnáročnější operace, která tam je (a taky není potřeba vždy).
...
No a teď si vem, že máš v požadavcích BINÁRNÍ kompatibilitu. Nicméně nevidím nutnost simulovat stará rozhraní nějak zásadně. Vždycky to funguje tak, že se simulace šoupne do jiného zdrojáku aby se nepletla s originální obsluhou... a dál se na ní nesahá, jen se pak nakonec přilinkuje. Koho zajímá, že simulace volá simulaci vola simulaci a nakonec volá původní obsluhu? Smyslem je "aby to fungovalo" a ne aby to fungovalo efektivně.
Já nejsem příznivcem nadužívání, nebo protěžování čehokoliv. Všechno co bylo vymyšleno, jsou jen nástroje, které mají za úkol mi nějak ulehčit, zefektivnit, nebo umožnit práci jejich použitím - proto tvrdím, že je pitomostí vždy a všude tvrdošíjně prosazovat objektový, nebo naopak procedurální přístup. To jsou extrémismy a ty jsou od přírody špatné. Nicméně ty nástroje existují a je zas na druhou stranou škoda jich nevyužít, v případech kdy je to vhodné - a ty případy zas určuje konkrétní člověk (lidé), který daný kód tvoří.
Souhlasím s Logikem, že ten akademický příklad je už od začátku špatný, a takový kód je nejlepší omlátit autorovy o hlavu, a pak jej celý přepsat do použitelnější podoby. Jednou z vhodných možností je použít zásad. Žel bohu v praxi (a tady souhlasím s Vámi) je však pro toho kdo s ním pracuje nejlepší na něj nabalit další vrstvy a pak děj se vůle boží. To že tu vrstvu oddělíte do externích modulů, či jakkoliv jinak, však neřeší základní nepříjemnost celého tohoto postupu, a to tu že celou věc znepřehledňuje, zanáší do ní spoustu nových stavů a potencionálních chyb. Vy se v tom možná vyznáte, ale jakmile někdo projekt převezme po Vás, může si jít hodit smyčku (bez urážky, nemyslím tím nic špatného směrem k Vám, vidím to prostě tak i z vlastní zkušennosti).
Celé to připomíná přístup javovských programátorů, kde si vezmete jednu konkrétní funkci z jedné konkrétní knihovny a než se dostanete k tomu co a jak to dělá, prolezete mraky dalších knihoven, vrstev a nadstaveb... A to je špatně (bez ohledu na to zda to někdo řeší či ne, a že to někoho určitě bude zajímat, na to vemte jed ).
Jinými slovy, Vaše řešení podle mě problém se neřeší, jen obchází. Neřeší se nemoc, pouze se odstraňují symptomy.
Navíc je omyl, si myslet, že používání šablon může vést k vyššímu výkonu. Mám zkušenosti i s opakem. Hlavně papačka je to ladit - skoušel jste si někdy seznamy typů z Loki? Krása, ne? (Pravdou je, že tu chybu jsem si tam zanesl sám v jedné ze tříd, ale než jsem ji našel, měl jsem okousaný všechny nehty, tužku, nervy v kýblu a o třicet procent víc šedin)

Citace
Prosím, při přetypování v hierarchii nedymaickou cestou doporučuj static_cast. reinterpret_cast nikdy!Operátor reinterpret_cast<>( ) jsem uvedl z důvodu, že umožňuje převod i na jiné nesouvisející struktůry - může v tom být do jisté míry podobnost se zásadou, avšak u zásady to není účel. já jej osobně nevyužívám (nevěřím buď jemu, nebo sobě - vysledek je stejný
). Ovšem pokud je někdo tak dobrý, proč ne... 
Citace
Přislo mi, že v knize pod slovem "Zásada" se rozumí Traits. Jinak Trait se překládá jako "rys" (traits jsou rysy). Nevím. každý máme jinou terminologii a úplně nejhorší jsou překlady od různých autorů.
Pokud to dobře chápu, pak rys je něco mezi strategií a zásadou. Poskytuje sice šabloně nové rozhraní, ale jeho zaměřením je interní implementace nějaké funkčnosti - tedy tak nějak jsem to pochopil...
Citace
Používání vícero rozhraní přibližuje C++ spíš k jazykům s dynamickým typování, což se občas může hodit. Sice se s tím asi nedocílí takové výkonnosti jako u šablon, ale je to jako se vším. Otázka ceny.
No, otázka je zda se s tou cenou počítá i do budoucna. Pokud někdo navrhne skříň do níž dám pouze jede hrnek, nebo myslivce, který může mít jen jednoho psa a finito, pak si nejsem tou cenou až tak jist.... Pokud je kód ještě navíc uzavřený, myslím že to může to být v budoucnu velmi drahá záležitost. A určitě sám ze zkušenností víte, že peníze mohou být v takovém případě ještě pořád to nejmenší. Ale - je to asi jen věc pohledu...
fce IMG_Load( ) slouží k načtení jednoho konkrétního obrázku (např. ve formátu PNG) do paměti, těžko ji můžeš použít na popisový soubor zdrojů (rc) nebo defacto na balíček (dat).
Používá to knihovna Loki (Alexandrescu - doufám, že to jméno píšu správně), a klientské rozhraní zásad IMyslivec<> lze považovat též za určitou abstrakci. Záleží jen na přístupu. nicméně sám jsem zásady už párkrát ke své spokojenosti použil.