Jste zastánci OOP programování?

Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re: Jste zastánci OOP programování?
« Odpověď #120 kdy: 14. 12. 2010, 17:23:50 »
Citace
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ů.

Citace
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í.

Citace
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.

Citace
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.


Citace
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).


ondra.novacisko.cz

Re: Jste zastánci OOP programování?
« Odpověď #121 kdy: 14. 12. 2010, 21:25:15 »
debata o MYSLIVCI, nikoli o nějakém rozhraní, které se náhodou jmenuje IMyslivec.
Od začátku mluvíme o rozhraní.

Ne tohle je fakt marný    :-\

Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re: Jste zastánci OOP programování?
« Odpověď #122 kdy: 15. 12. 2010, 02:24:00 »
Řekněte, zdali je správné toto rozhraní:
Kód: [Vybrat]
interface AASDASDASD
   {
   color getColor();
   };

Pro popis barvy je to dobré rozhraní. Pro popis oběda nikoli. To jasně ukazuje, že kvalitu rozhraní NELZE hodnotit samo o sobě, ale pouze ve vztahu k tomu, co má popsat.
Takže pokud se bavíme od začátku o rozhraní myslivec, tak se bavíme o tom, zdali toto rozhraní dobře popisuje Myslivce. Jinými slovy, nebavíme se o "nějakém anonymním rozhraní IMyslivec", ale o tom, zdali je IMyslivec dobrou implementací Myslivce.

ondra.novacisko.cz

Re: Jste zastánci OOP programování?
« Odpověď #123 kdy: 15. 12. 2010, 08:57:39 »
Jinými slovy, nebavíme se o "nějakém anonymním rozhraní IMyslivec", ale o tom, zdali je IMyslivec dobrou implementací Myslivce.

Rorzhaní je implementací....???  :o  :o  :o

OMFG!!!!

alefo

Re: Jste zastánci OOP programování?
« Odpověď #124 kdy: 15. 12. 2010, 09:42:26 »
Citace
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.

Nadobudol som dojem, že rozhranie reprezentuje rolu, resp. sadu schopností, ktoré implementujúca trieda môže nadobudnúť.

V príklade s myslivcom by som teda identifikoval schopnosti, ktoré sú vzhľadom na systém relevantné pre niekoho, kto vie zaujať rolu Myslivca.

Čo dokáže Myslivec? Napríklad: a) Strážiť les (Rumcajs, Řáholec Walker). b) Kŕmiť zver

Kód: [Vybrat]
interface IMyslivec
  void straz()
  void krmZver()

Potom si môžem navrhnúť tritisíc druhou myslivcov, class MyslivecSJednýmPsom, class MyslivecSKerberosom i OžratýMyslivecSoSedemnástimiPsamiABazukouNaPleci i JavaPoweredRobotPosingAsARanger.

Ja ako klient triedy IMyslivec chcem vedieť len to, že niekto mi postráži les a nakŕmi zver. AKO konkrétne to spraví, je otázka implementujúcej triedy.



Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re: Jste zastánci OOP programování?
« Odpověď #125 kdy: 15. 12. 2010, 13:35:57 »
Ondra: Implementace je významy přetížené slovo - možná jsem ho nezvolil šťastně, v každém případě tím, že rozhraní implementuje, myslím že postihuje, vystihuje, reprezentuje danou věc. Myslím, že kdo se snaží pochopit to pochopí, komu jde jen o to ukázat, že je druhý vůl, se na tom samozřejmě může povozit. Většinou to lidi dělají, když jim dojdou rozumné argumenty.

Alefo: IMHO jsou dva typy rozhraní. Jeden z nich je to co píšeš, až na jeden IMHO ale důležitý detail: vždy tady budou lidi, co umí strážit les, ale neumí krmit a  vice versa. Např. lesní stráž či pouze honí pytláky. Proto by mělo být pro každou schopnost vlastní rozhraní, abych nenutil lesní stráž s sebou táhnout pytel žaludů.
Ovšem pak nemám žádné rozhraní pro myslivce. Jak píšeš, myslivec je ten, který umí strážit zvěř a hlídat les. Proto budu mít rozhraní IMyslivec, poděděné z rozhraní IStraziLes a IKrmiZver. Toto rozhraní pak už neříká až tak co daný objekt umí ( když to z něj plyne), jako spíš definuje, co daný objekt je. Protože pokud myslivec je objekt, který umí strážit les a krmit zvěř, tak každý objekt, který implemenentuje toto rozhraní je (z pohledu klienta) nerozlišitelný od myslivce. Ta definice v podstatě říká: "Myslivec je někdo(něco), která umí to, to a to".

Pokud tuto distinkci mezi rozhraním definujícím schopnost a rozhraním definujícím identitu neuděláš, tak se dopustíš té chyby, že uděláš monolitické ropzhraní pro myslivce - a v okamžiku kdy budeš chtít udělat lesní stráž (dejme tomu, že myslivec má pravomoci lesní stráže a navíc krmí zvěř), tak budeš muset zasahovat do třídy myslivec. Pokud to správně rozdělíš předem, tak stačí implementovat rozhraní IHlidaLes a máš lesní stráž.

S tím, že konkrétní implementace je z hlediska rozhraní irelevantní, pak stopro souhlasím.

To, že můžeš navrhnout x druhů myslivců souhlasím - a i klidně třídu s jedním psem. Problém ale začne v okamžiku, kdy ve svém ROZHRANÍ pro myslivce řekneš, že myslivec je i ten, co má psa. Protože to prostě není pravda, nepopysuje to nic smysluplného.
Buďto nepotřebuješ rozhraním postihnout vztah myslivce a jeho psů (pak stačí rozhraní výše), nebo chceš. Myslivec je ale někdo, kdo má PSY!
Takže pokud uděláš rozhraní myslivecsjednimpsem, tak v podstatě uděláš rozhraní pro v realitě neexistující objekt. A takové rozhraní bude v podstatě nepoužitelné v dalších projektech, popř. Ti to bude dělat problém při rozšiřování funkčnosti Tvého projektu...

Když to shrnu: IMHO není vždy chybou, když třída nepostihuje přesně danou entitu. Člověk nemusí psát všechno. Není chybou, když rozhraní nepostihuje celou entitu/schopnost (když je potřeba další vlastnost, jde rozhraní podědit a vlastnost doplnit). Je ale chybou, pokud rozhraní danou entitu/schopnost postihuje špatně. Tzn. je špatně, když rozhraní popisuje vlastně něco jiného, než se s ním člověk snaží popsat. A jedním z exemplárních chyb v návrhu rozhraní je špatná kardinalita vztahů mezi objekty.

PS: Možná by šlo ještě doplnit, že v některých případech se rozdíl mezi rozhraním typu "umím" a rozhraním typu "jsem" stírá, většinou to je v tom případě, kdy danou věc definuje jedna schopnost. Ono také jde říci, že např. umět se seřadit (ISortable) znamená také  "být seřaditelným objektem".
A naopak pokud členy mysliveckého sdružení z deinice jsou právě a jen myslivci, tak schopnost říci číslo svého mysliveckého průkazu je inherentní schopnost myslivce a nemá smysl ji vydělovat do samostatného rozhraní. V obou případech je ale třeba dávat pozor, zdali je to oprvadu invariant, nebo zdali např. myslivci neuvažují nad píjmáním svých manželek do organizace.
« Poslední změna: 15. 12. 2010, 13:44:25 od Logik »

alefo

Re: Jste zastánci OOP programování?
« Odpověď #126 kdy: 16. 12. 2010, 09:14:10 »
Samozrejme, treba zvazit od pripadu k pripadu, ci schopnosti v interfejsi suvisia spolu uzko a dostatocne charakterizuju dany objekt (ja by som nevahal prirovnat interfejs k sade operacii na sluzbe) alebo ci ide o zjednotenie viacerych schopnosti do jedneho objektu.

S myslivcom, co strazi les a zaroven krmi psy moze byt naozaj problem, ked chceme len strazcu, ktory nevie krmit -- potom sa lahko moze stat, ze trieda implementujuca IMyslivca bude mat v krmeni prazdny kod... alebo bude dokonca hadzat UnsupportedOperationException. Toto sa standardne deje v Java Collections frameworku, kde rozdiel medzi nemennym a premenlivym zoznamom je len v tom, ze nemenny zoznam hadze vynimky v metodach, ktore neimplementuje (co je pomerne nemile).

Ak naozaj predpokladame, ze budu triedy ,,cistych strazcov" a triedy ,,cistych krmicov", tak to treba rozdelit. (Ale toto sa da urobit aj v refactore, vid riesenie s prazdnou metodou).

Len netreba upadnut do extremu, ze preventivne rozdistribuujem schopnosti do jednometodovych interfejsov :-)

Z prispevku vam vypadlo, aky je druhy druh rozhrania. Prvy uplne chapem.

Popravde, nerozumiem celkom, ako suvisi kardinalita s interfejsom. IMyslivec je jedna skatula. Pes je druha skatula. Vztah medzi nimi a jeho kardinalita sa ustanovi v triedach, ktore implementuju IMyslivca, resp. v kontrakte metod. Neviem si predstavit priklad, ako by interfejs mohol zmysluplne vynucovat kardinalitu.

Citace
Možná by šlo ještě doplnit, že v některých případech se rozdíl mezi rozhraním typu "umím" a rozhraním typu "jsem" stírá
To je pravda, je to reflektovane v mennej konvencii. ,,Som" sú často reprezentované interfejsmi, ktoré zodpovedajú rolu a sú identifikované prídavným menom. SerialiABLE = serializovateľný. ISortABLE, ComparABLE, teda ,,som trieda, ktorá je serializovateľná / porovnateľná s inou" atď. Často sa stáva, že trieda spĺňa viacero rolových interfejsov.

Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re: Jste zastánci OOP programování?
« Odpověď #127 kdy: 16. 12. 2010, 11:13:59 »
Citace
ja by som nevahal prirovnat interfejs k sade operacii na sluzbe)
Poklud je to sada operací k jedné službě, tak to do jednoho rozhraní patří. Např. otevřít "soubor", zapsat, přečíst, zavřít soubor. Tam je to úplně v pořádku - zavření a otevření nemá od operace čtení nebo psaní smysl. I když tady by to asi chtělo rozdělit na IReadable, IWritable a IReadableWritable.

Samozřejmě v reálu člověk z těchto akademických kritérií někdy sleví i v jiném případě (pokud píšu malý jednoúčelový kód, tak nestrávím dva roky návrhem rozhraní). Měl by ale vědět, že: "tady jsem něco zjednodušil". Aby když to v tom zjednodušení začne skřípat (začnu potřebovat lesní stráž), tak hned věděl kde a proč a mohl to opravit - v rané fázi vývoje je většinou takovýto jednoduchý refaktoring (vydělení části služeb z rozhraní A do rozhraní B a podědění A od B) jedodušším řešením, než implementace x metod s výjimkou
UnsupportedOperationException.

Citace
Z prispevku vam vypadlo, aky je druhy druh rozhrania. Prvy uplne chapem.
No právě to rozhraní "jsem", oproti rozhraní "umím". Zpravidla rozhraní umím definuje jedmnoduché služby, zatímco rozhraní "jsem" je agreguje do funkčního celku (např. ISortable, IRandomAcces je co umí, ISortableVector pak definuje identitu objektu: být řaditelným seznamem - a je poděděn z ISortable a IRandomAccess).

edit: jasnější příklad.
Jsou to sice subtilní rozdíly, ale pro návrh aplikace je myslím nutné si uvědomit, co které rozhraní reprezentuje. Např. pokud má myslivec psy, tak by někdo mohl propadnout pokušení mu implementovat rozhraní IVector<Pes>. Ale co když pak budu chtít pracovat jen s jeho jezevčíky, nebo jen s jeho oblíbenými psy, nebo..... Těžko budu implementovat rozhraní IVector<Pes>, budu to muset řešit jinak a aplikace bude nekonzistentní.

Pokud si předem řeknu je myslivec seznam psů? "Aha, není"... a místo toho mu udělám metodu getPsy(), tak snadno mu pak dodělám metodu getJezevciky() a getOblibenePsy().





Citace
Neviem si predstavit priklad, ako by interfejs mohol zmysluplne vynucovat kardinalitu.
Pokud bude mít myslivec metodu getPes(), vynucuje kardinalitu 1:1 (popř. 1:0). Pokud bude mít metodu getPsy(), tak je kardinalita 1:n.
U myslivce:psa je správná kardinalita 1:n, např. u syna a (biologické) matky je 1:1 - tam by metoda getMatky() byla podivná.... i když to dneska už možná ani neplatí :-) :-).

Pozor, tím neříkám, že implementace myslivce pak nemůže mít pouze jednoho psa. To samozřejmě ano - to je jeho interní záležitost. Rozhraní ale umožňuje mít více psů a tedy pokud kdykoli (v tomto nebo jiném) projektu budu potřebovat více psů, jde o elemenární úpravu.
« Poslední změna: 16. 12. 2010, 11:22:09 od Logik »

alefo

Re: Jste zastánci OOP programování?
« Odpověď #128 kdy: 16. 12. 2010, 13:05:09 »
Hlavne mi nie je jasné, ako psy súvisia s interfejsom Myslivca. Podľa mňa veľmi treba zvážiť, či ten coupling tried je naozaj potrebný. Naozaj má každý myslivec psy? Čo ak mám robotického myslivca, ktorý o psoch netuší?

Má každý myslivec (vzhľadom na aktuálne poznatky o systéme) práve jedného psa a je to bezpodmienečne nutné? Ak áno, potom naozaj dodáme metódu IMyslivec#getPes().

Očakávame, že bude mať viac psov? Tak potom IMyslivec#getPsi().

Hoci je otázka, či naozaj medzi sadami služieb, ktoré Myslivec poskytuje, musí byť poskytnutie zoznamu jeho psov.


-----------------------

Ak máme triedu MyslivecSoPsami implements IVector<Pes>, tak niečo je podľa mňa zhnité už na úrovni ,,pravidlá IS-A", čo povedie takmer neodvratne k divnej dedičnosti. MyslivecSoPsami nie určite je vektor psov :-) (A IMyslivec extends IVector je už zhůveřilost.) Tu úplne stačí použiť kompozíciu, kde MyslivecSoPsami implements IMyslivec a má inštančnú premennú List<Psi>.


Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re: Jste zastánci OOP programování?
« Odpověď #129 kdy: 16. 12. 2010, 14:10:21 »
Vau, konečně spřízněná duše :-). I když s Tigerem bych se ati taky shodnul.


Citace
Hlavne mi nie je jasné, ako psy súvisia s interfejsom Myslivca. Podľa mňa veľmi treba zvážiť, či ten coupling tried je naozaj potrebný. Naozaj má každý myslivec psy? Čo ak mám robotického myslivca, ktorý o psoch netuší?
Souhlas. To jsem i snad už někde v postech psal, že vlastnit psy může kdokoli a tedy by mělo být spešl rozhraní IVlastníkPsů. Pak je otázka, zdali Myslivec je musí nutně vlastnit, pokud ano (my jsme si ho tak neformálně definovali), pak by měl být od toho rohraní poděděn (v podstatě se tím říká myslivec je člověk, který bla bla bla a taky vlastní psy), pokud ne, tak ne.

Za zmíňku možná tady stojí, že pokud 95%myslivců má psy a často se s nima pracuje, tak považuju za legální říci, myslivec má psy, a robotický myslivec pak bude mít nula psů. Práce s tím (zbytečné definování metody getPsy u robota) bude menší, než neustálé dotazy: implementuje tento myslivec IVlastnikPsu?

Co my schází v objektovvých jazycích je "multitypová kontrola". Např. objekt A implementuje rozhraní IA, IB, IC a ID. Mám funkci, která požaduje objekty implementující IA a IB. Ve všech jazycích s typovou kontrolou, co znám, se to musí vyřešit tak, že nadefinuji rozhraní IAB extends IA, IB a checkuji proti němu.
To má ale velké nevýhody - ten objekt A by tedy měl být poděděn z IAB, IC, ID. To ale tvůrce objektu nemusel vědět. Navíc, další funkce můžče chtít objekt implementující IA a IC. Nebo IB a ID.. Takže v podstatě pro každou použitou kombinaci rozhraní musím psát vlastní rozhraní a to už je trochu opruz. Jak by bylo krásné, kdyby šlo do definice funkce napsat, sem smí objekty, které implementují IA a zároveň IB. Něco jako
fce(IMyslivec + IMaFlintu myslivecSFlintou)
nebo
fce(IMyslivec + IMaPsy myslivecSePsem)

Nejlépe tak, že by šlo definovat
IMyslivec + IMaPsy = IMyslivecSePsy
ale nikoli ve formě dědičnosti, ale opravdu rovnosti. TJ. že každý objekt implementující tyto dvě rozhraní by se považoval za IMyslivceSePsy.

Citace
Má každý myslivec (vzhľadom na aktuálne poznatky o systéme) práve jedného psa a je to bezpodmienečne nutné?....
Souhlas.

Citace
A IMyslivec extends IVector je už zhůveřilost.
Právě! :-) Jen jsem ukazoval, proč je to zhůvěřilost. Pokud se na rozhraní kouká čistě jako na poskytované služby, jako na něco, čím s polu komunikují dva objekty (v tomto případě myslivec a někdo, kdo chce znát jeho psy), tak by to bylo v pořádku. Proto jsem tvrdil, že tento pohled na rozhraní není správný. Že rozhraní není jen nějaký anonymní popis toho, co daný objekt poskytuje, ale vyjadřuje schopnosti či identitu daného objektu. A jelikož myslivec není seznam psů, tak nemůže implementovat rozhraní ISeznamPsu (respektive IVector<PES>.
Pokud potřebuji vědět, že myslivec je vlastník psů, tak může implementovat rozhraní IVlastnikPsu (to je) a IVectorPsu zahrnout právě jak píšeš nikoli dědičností, ale agregací.

Ono i todle (pod)téma vlastně začalo nad tím, kdy jsem protestoval nad zneužíváním dědičnosti. (na místě, kde by měla být agregace) :-)
« Poslední změna: 16. 12. 2010, 14:12:26 od Logik »

coubeatczech

Re: Jste zastánci OOP programování?
« Odpověď #130 kdy: 17. 12. 2010, 00:29:25 »
Citace
Co my schází v objektovvých jazycích je "multitypová kontrola". Např. objekt A implementuje rozhraní IA, IB, IC a ID. Mám funkci, která požaduje objekty implementující IA a IB. Ve všech jazycích s typovou kontrolou, co znám, se to musí vyřešit tak, že nadefinuji rozhraní IAB extends IA, IB a checkuji proti němu.
Kód: [Vybrat]
scala> trait A
defined trait A

scala> trait B
defined trait B

scala> class SomethingWithAB[T <: A with B]
defined class SomethingWithAB

scala> class AB extends A with B
defined class AB

scala> new SomethingWithAB[AB]   
res8: SomethingWithAB[AB] = SomethingWithAB@f52d950



Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re: Jste zastánci OOP programování?
« Odpověď #131 kdy: 17. 12. 2010, 10:43:16 »
Vau :-) dík za info, řikal jsem si, že takovou hezklou věc určitě už někdo musel vymyslet :-)

alefo

Re: Jste zastánci OOP programování?
« Odpověď #132 kdy: 17. 12. 2010, 12:26:32 »
Pokiaľ ide čisto o kontrolu dátových typov v parametroch, v Jave sa dajú na to hacknúť generiká.

Kód: [Vybrat]
public class Test {
public <T extends Serializable & Comparable<T>> int compareTwoSerializables(T object1, T object2) {
return object1.compareTo(object2);
}

public static void main(String[] args) {
Integer i1 = 2;
Integer i2 = 5;

Test test = new Test();
int result = test.compareTwoSerializables(i1, i2);

System.out.println(result);
}
}

backup

Re: Jste zastánci OOP programování?
« Odpověď #133 kdy: 17. 12. 2010, 18:29:56 »
jen pro uplnost, jestli to jeste nikdo nezpozoroval. Tato diskuze je ten nejvetsi dukaz, ze OOP je velice problematicka zalezitost a skoro jiste na ho.no.

Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re: Jste zastánci OOP programování?
« Odpověď #134 kdy: 18. 12. 2010, 14:05:43 »
Málo lidí rozumí kvantové teorii a je kolem ní plno sporů. To je ten největší důkaz, že kvantová teorie je problematická záležitost a skoro jistě na ho.no.