Nevím, kdo mě tu přesvědčoval o tom, že když od začátku píšu skříň, že musím už dopředu počítat s tím, že do ní vložím víc než jeden šálek.
Vždyť píšete sám, že říkám, že to má být pořádně od začátku, tak proč m prosimvás furt cpete do toho, že chi někde něco nutně a za každou cenu přepisovat??
Právě proto, že je to ve výsledku daleko jednodušší, než se pak snažit nacpat do skříně na jeden šálek víc, je lepší to udělat pořádně hned. Právě proto, že pracovat se skříní jednou jako s jednošálkouvou a jednou jako s vícešálkovou přináší spoustu problémů.
O čemž jsem se přesvědčil právě ve Vaší poslední odpovědi ke které jsem Vás donutil
Nikoli, akorát jste prokázal, že celou dobu mluvíte o něčem jiném. Myslivec vlastnící psy je pořád stejný myslivec, ať už má jednoho nebo více psů, furt je to myslivec. Zbraň na skřety nebo na skřety i draky je furt nutně zbraň i nutně zbraň na skřety.
Ale editovatelný objekt není nutně objekt na serializaci a vice versa, objekt, který umí se vypsat na string není nutně objekt sloužící k serializaci a vice versa. (Vaše zadaní jsem nepochopil, no a? To, jestli slouží metoda tostring k serializaci, nebo k něčemu jinému, na podstatě věci naprosto nic nemění). Proto tyto případy spolu nesouvisí.
Zajímavé je také, že MouseListener nemá nic společného s Canvasem, přestože vy jste mě celou dobu přesvědčoval, že IMyslivec, konstruované pro lovecký účel by měl implementovat víc psů...
Canvas je něco na co se kreslí. Má to nějakou souvislost s myší. Ne. Tak proč by to implementovalo IMouseLisener?
Myslivec je člověk, který se psy a flintou se stará o les. Takže vlastnictví psů je v něm inherentně obsaženo. Proto je Vaše analogie špatná - respektive to analogie není.
Rozhraní IMyslivec popisuje co? Myslivce, který nemůže mít více než jednoho psa. Co to vůbec je? Copak existuje myslivec, který nemůže mít více než jednoho psa? Jestli ano (například to má zakázáno soudně), tak je to naprostá výjimka. Proto je rozhraní IMyslivec navrženo špatně - nepopisuje vlastně nic smysluplného.
Proto také není reusabilní - většina programů, co člověk píše, pracuje s nějakými reálnými objekty (respektive jejich reprezentací). Rozhraní, které reprezentuje nesmysl se do žádného dalšího projektu nebude hodit. A velmi často se ukazuje, že se nebude hodit ani do svého vlastního projektu.
IMyslivec slouží k zachytávání informací o revíru během lovu nebo výkonu myslivosti.... ...Taky jsem psal, abyste se nenechal zmást názvem
To mě jako chcete říkat, že jste říkal myslivec, ale myslel jste kočkodana? Od začátku byla debata o MYSLIVCI, nikoli o nějakém rozhraní, které se náhodou jmenuje IMyslivec. Pokud jste se bavil od začátku o kočkodanovi (nebo o "něčem, co slouží k zachytávání informací o revíru během lovu nebo výkonu myslivosti"), tak jste to měl říci. Ale celou dobu jste používal slovo myslivec, čemuž normální čech rozumí tak, že myslíte myslivce.
Jinými slovy, nezávisí na tom, jak se rozhraní jmenuje, ale co REPREZENTUJE. A pokud rozhraní reprezentuje myslivce, tak protože myslivec může mít více psů, tak má těch více psů mít.
Ono to možná ale přesně ukazuje na jádro pudla: kdybyste při návrhu myslivce místo nad "něčím, co slouží k zachytávání informací o revíru během lovu nebo výkonu myslivosti" myslel nad myslivcem, tak by se nestalo, že by měl jen jednoho psa.
"Reusability": přemýšlím nad objekty takovým způsobem, abych je mohl příště použít.
Celá diskuze se točí o udržení čistého kódu po celou dlouhou dobu vývoje software
:-) Uf. Celou dobu tu diskusi kolem toho točíte Vy. A zřejmě nemůžete pochopit, že diskuse začala o něčem úplně jiném. Já (a jestli jsem pochopil tak i Tiger a tar) se bavíme, jak navrhovat třídy, aby byly co nevíce znovupoužitelné, nikoli o tom, jak ji upravit, když ji někdo navrhnul tak, že znovupoužitelná není. Tam už jde o volbu nejmenšího zla.
O tom jsem již snad desetkrát psal, že v okamžiku, kdy bych musel refaktorizovat již používanou hierarchii, tak že může být jiné řešení výhodnější. Tak to napíšu po jedenácté a snad už Vám to konečně dojde.
---
btw. když už jsme tedy u toho, co udělat, když mám opravit chybu v rozhraní, tak jestli se nepletu, tak ani DirectX (přiznám se, že zrovna DX moc neznám, v jiných knihovnách to tak funguje) nedělá to, že by mělo pro jednu samou věc více rozhraní. Ano, existuje rozhraní ve verzi 7, které je jiné než ve verzi 8. Ale tam se předpokládá, že se bude používat pouze v8 a v7 je čistě pro zachování zpětné kompatibility. Tzn. nejsou to dvě plnohodnotná rozhraní, ale jedno z nich je deprecated, existuje jen proto, aby staré aplikace fungovaly. Rozhodně však není dobrý nápad ta stará rozhraní implementovat v nových aplikacích.
Druhá možnnost (často používaná ve WinApi) je existence dvou rozhraní, jednoduchého a složitého (funkce Něco a NěcoEx). Tady ale nejde ve skutečnosti o shodné rozhraní, jedno poskytuje jiné služby. Kdyby to bylo v objektové hierarchii, tak by to byly pravděpodobně poděděné objekty (NěcoEx od Něco).