Implementace rozhraní v Javě

Re:Implementace rozhraní v Javě
« Odpověď #15 kdy: 13. 07. 2017, 14:02:13 »
(...) Rozhodne bych to nedelal. Pouzit jednu implementacni tridu na vice rozhani doporucuji jen v extremnich pripadech (...)

Ještě máme defaultní implementace metod v rozhraní, což někdo používá jako traity. To tam těch rozhraní pak může být docela dost a IMHO to není nic proti ničemu.

Obecně mi nepřijde nic špatného na tom, když nějaká třída implementuje více rozhraní. Jestli je návrh dobrý nebo se pozná podle spíš podle toho, která konkrétní rozhraní to jsou - jestli jde o smysluplnou kombinaci funkčnosti.

V případě, že dvě rozhraní mají metodu se stejnou signaturou ale jinou sémantikou, tak to smysluplné podle mě není, protože bych měl mít vždy možnost napsat pro ně i dvě odlišné implementace, což ale nemám, čím vzniká bezprostředně problém. A naopak v případě, že by ta sémantika byla stejná, tak mi to přijde sice lehce varovné, ale ještě přijatelné. Varovnost spočívá v tom, že pokud by ta rozhraní byla určena pro společné použítí a měla mít společnou metodu, byla ta metoda nejspíš ve společném předkovi těch dvou rozhraní. Pokud to tak není, může to znamenat, že v té implementaci chci kombinovat příliš funkčnosti naráz a mohla by být lepší ta kompozice, jak již bylo řečeno.


Kit

Re:Implementace rozhraní v Javě
« Odpověď #16 kdy: 13. 07. 2017, 16:14:36 »
Pouzit jednu implementacni tridu na vice rozhani doporucuji jen v extremnich pripadech,

Běžně v jedné třídě implementuji až 5 různých rozhraní a nevidím v tom problém. ISP v SOLID.

kimec

Re:Implementace rozhraní v Javě
« Odpověď #17 kdy: 14. 07. 2017, 21:44:10 »
Jak určí, kterou z těch dvou metod s různou funkcionalitou ale stejnou signaturou má volající kód zrovna na mysli?

Implementace je jen jedna. Nic určovat nemusí.
V Jave 8 moze byt implementacia sucastou rozhrania, tzv. default implementacia. V pripade, ze trieda implementuje 2 rozhrania, obe s metodami s rovnakou signature a obe s default implementaciami, programator musi urcit, ci si zela pouzit uplne vlastnu implementaciu a vyuzije iba siganturu alebo zvoli jednu z defaultnych implementaci - je na to novy Java 8 syntax. Kompiler to neprepusti len tak.

dustin

Re:Implementace rozhraní v Javě
« Odpověď #18 kdy: 14. 07. 2017, 22:06:37 »
Defaultní metody jsou vzhledem ke svým omezením vhodné jen na něco jednoduššího. Nemožnost rozpadu kódu do privátních metod a uložení stavu do fieldu instance je zásadní omezení využitelnosti. S nimi by se to mixinovalo, ale třeba se taky dočkáme (privátní metody v java 9, fieldy nevím).

kimec

Re:Implementace rozhraní v Javě
« Odpověď #19 kdy: 14. 07. 2017, 22:19:03 »
Defaultní metody jsou vzhledem ke svým omezením vhodné jen na něco jednoduššího. Nemožnost rozpadu kódu do privátních metod a uložení stavu do fieldu instance je zásadní omezení využitelnosti. S nimi by se to mixinovalo, ale třeba se taky dočkáme (privátní metody v java 9, fieldy nevím).
Osobne si myslim, ze primarne ide o to, aby ste mohli opatchovat viac metodove rozhrania tak, aby sa z nich stali SAMy a bolo mozne robit lambdy aj z povodne neSAMoidneho trebars historickeho rozhrania.