Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: temple 16. 08. 2017, 21:33:53

Název: Template on template v Javě
Přispěvatel: temple 16. 08. 2017, 21:33:53
Jde v Javě udělat šablona nad šablonou (jako v C++)? Dost by mi to usnadnilo (a zpřehlednilo) kód, ale zatím nemůžu najít, jak na to (odtud podezření, že je možná Java blbá a nejde to v ní).
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 16. 08. 2017, 22:00:08
V Javě šablony nejsou. Napište raději, jaký problém řešíte.
Název: Re:Template on template v Javě
Přispěvatel: Trollopata 16. 08. 2017, 22:29:22
No to zase bude flejm...
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 00:28:42
V Javě šablony nejsou. Napište raději, jaký problém řešíte.
Zcela zjevně jde o generika, není proč slovíčkařit.

K věci: Java to neumí (má dost omezený typový systém) a nevím o tom, že by to bylo v plánu. Možná bych checknul Scalu.
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 17. 08. 2017, 06:53:58
Zcela zjevně jde o generika, není proč slovíčkařit.
Generika jsou něco jiného, než šablony. Generika Java umí. Důvod ke slovíčkaření je ten, že můžeme poradit, jak řešit tazatelův problém – místo střílení od bokou, zda „to“ Java umí nebo neumí, přičemž každý si pod „to“ bude představovat něco jiného.

K věci: Java to neumí (má dost omezený typový systém) a nevím o tom, že by to bylo v plánu. Možná bych checknul Scalu.
Asi tedy chápete, co „to“ má být. Můžete to tedy napsat? Třeba někdo jiný dokáže navrhnout řešení, když bude vědět, jaký je vlastně problém.
Název: Re:Template on template v Javě
Přispěvatel: Ivan Nový 17. 08. 2017, 07:10:45
https://www.tutorialspoint.com/design_pattern/template_pattern.htm :-)
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 17. 08. 2017, 08:31:23
https://www.tutorialspoint.com/design_pattern/template_pattern.htm :-)
To je návrhový vzor šablona / template. To je něco jiného než template v C++ i než generiky v Javě. Dá se implementovat i bez C++ šablon i bez Java generik, jak je ostatně vidět na příkladech uvedených v odkazu.

Návrhový vzor šablona se zřetězit („šablona nad šablonou“) dá. Generika nad generikou se také udělat dá (alespoň s tím, co si pod „generika nad generikou“ představím já). Takže jestli se dá v Javě udělat „šablona nad šablonou“ se tu můžeme dohadovat do nekonečna, protože si každý může sám určit, co tím „šablona nad šablonou“ myslí. A nebo tazatel napíše, co vlastně řeší za problém.
Název: Re:Template on template v Javě
Přispěvatel: perceptron 17. 08. 2017, 09:01:35
Map<String, List<JdbcTemplate>>
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 09:42:57
Zcela zjevně jde o generika, není proč slovíčkařit.
Generika jsou něco jiného, než šablony. Generika Java umí. Důvod ke slovíčkaření je ten, že můžeme poradit, jak řešit tazatelův problém – místo střílení od bokou, zda „to“ Java umí nebo neumí, přičemž každý si pod „to“ bude představovat něco jiného.

K věci: Java to neumí (má dost omezený typový systém) a nevím o tom, že by to bylo v plánu. Možná bych checknul Scalu.
Asi tedy chápete, co „to“ má být. Můžete to tedy napsat? Třeba někdo jiný dokáže navrhnout řešení, když bude vědět, jaký je vlastně problém.
Na úrovni teorie typů rozdílu není. Zřejmě jde o konstrukci, která v C++ vypadá takto:
Kód: [Vybrat]
template<template<typename> class T> ...Java nic takového nemá (bohužel).
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 09:50:57
Map<String, List<JdbcTemplate>>
To není parametrizované generickým typem. V pseudokódu jde o něco jako:
Kód: [Vybrat]
class A<T> {...}
class B<T<_>,U> {
T<U> x
}
V teorii typů je A funkce na množině typů, kdežto B je funkce na množině funkcí na typech (proto "template on template" v terminologii C++). Boost je toho plný, umožňuje to elegantní kód. Ale zas to málokdo zná, takže vně knihoven se to používá zřídka.
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 17. 08. 2017, 12:16:46
Já tam pořád ten rozdíl nevidím. Třeba tohle je podle mne šablona nad šablonou:

Kód: [Vybrat]
class StringMap<T> implements Map<String, T> {
}
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 12:20:48
Já tam pořád ten rozdíl nevidím. Třeba tohle je podle mne šablona nad šablonou:

Kód: [Vybrat]
class StringMap<T> implements Map<String, T> {
}
Není, protože T v mapě je už vázaná typová proměnná. Map je funkcí nad dvěma typy.
Název: Re:Template on template v Javě
Přispěvatel: Ivan Nový 17. 08. 2017, 12:36:55
https://www.tutorialspoint.com/design_pattern/template_pattern.htm :-)
To je návrhový vzor šablona / template. To je něco jiného než template v C++ i než generiky v Javě. Dá se implementovat i bez C++ šablon i bez Java generik, jak je ostatně vidět na příkladech uvedených v odkazu.

Návrhový vzor šablona se zřetězit („šablona nad šablonou“) dá. Generika nad generikou se také udělat dá (alespoň s tím, co si pod „generika nad generikou“ představím já). Takže jestli se dá v Javě udělat „šablona nad šablonou“ se tu můžeme dohadovat do nekonečna, protože si každý může sám určit, co tím „šablona nad šablonou“ myslí. A nebo tazatel napíše, co vlastně řeší za problém.

Template z C++ do Javy nepatří. Java makra nepotřebuje.
 
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 17. 08. 2017, 13:14:44
Já tam pořád ten rozdíl nevidím. Třeba tohle je podle mne šablona nad šablonou:

Kód: [Vybrat]
class StringMap<T> implements Map<String, T> {
}
Není, protože T v mapě je už vázaná typová proměnná. Map je funkcí nad dvěma typy.
A jak by to vypadalo, kdyby T nebyla vázaná typová proměnná? Jakou by to mělo funkci/význam? Jak by se to lišilo od stavu, kdy T je vázaná typová proměnná? Ideální by bylo ukázat to na nějakém konkrétním případu – mám tyhle tři třídy, chtěl bych udělat tohle, ale nemůžu, místo toho můžu jen zkopírovat kód.
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 13:22:13
Já tam pořád ten rozdíl nevidím. Třeba tohle je podle mne šablona nad šablonou:

Kód: [Vybrat]
class StringMap<T> implements Map<String, T> {
}
Není, protože T v mapě je už vázaná typová proměnná. Map je funkcí nad dvěma typy.
A jak by to vypadalo, kdyby T nebyla vázaná typová proměnná? Jakou by to mělo funkci/význam? Jak by se to lišilo od stavu, kdy T je vázaná typová proměnná? Ideální by bylo ukázat to na nějakém konkrétním případu – mám tyhle tři třídy, chtěl bych udělat tohle, ale nemůžu, místo toho můžu jen zkopírovat kód.
Typický příklad jsou pevné body struktur, tedy něco jako
Kód: [Vybrat]
class Fix<F> : F<Fix<F>> {...}Informací a příkladů použití je k tomu na webu hafo, přeju příjemné vstřebávání vědomostí  ;)
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 17. 08. 2017, 13:49:13
Pokud někdo nedokáže odpovědět na jasně danou otázku ani nedokáže uvést konkrétní příklad, místo toho odkáže „na web“, většinou to bývá příznakem toho, že někde zaslechl pár pojmů, ale vůbec netuší, o čem je řeč.

Jestli jsem to ale pochopil správně, tazatel by v Javě chtěl napsat něco takového:

Kód: [Vybrat]
class Animal<T> extends T {
}

To v Javě opravdu napsat nejde. A mimochodem to ukazuje, proč je „šablona“ špatný název pro Java generiky. „Šablona“ je označení po kód, na základě kterého kompilátor vygeneruje správný kód pro všechny potřebné typy (proto šablona). A proto tohle v Javě nejde napsat, protože generika nejsou šablony pro vytváření kódu, a jsou to jen upravené běžné typy. V terminologii Javy tedy tazatel nechtěl generiku nad generikou, ale chtěl vytvořit potomka typového parametru.
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 13:54:43
Pokud někdo nedokáže odpovědět na jasně danou otázku ani nedokáže uvést konkrétní příklad, místo toho odkáže „na web“, většinou to bývá příznakem toho, že někde zaslechl pár pojmů, ale vůbec netuší, o čem je řeč.

Jestli jsem to ale pochopil správně, tazatel by v Javě chtěl napsat něco takového:

Kód: [Vybrat]
class Animal<T> extends T {
}
1. Pokud si někdo neumí vygooglit pojem, který nezná, tak je přinejlepším to, čemu zde někteří říkají "lopata". Přispěvatelé do fóra nejsou tvoje sekretářka. Doporučuji návrat do školy, pokud Google nevyhovuje.

2. Pochopils to špatně. Doporučuji obrátit se na M.Prýmka  ;)
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 13:56:50
To v Javě opravdu napsat nejde. A mimochodem to ukazuje, proč je „šablona“ špatný název pro Java generiky. „Šablona“ je označení po kód, na základě kterého kompilátor vygeneruje správný kód pro všechny potřebné typy (proto šablona). A proto tohle v Javě nejde napsat, protože generika nejsou šablony pro vytváření kódu, a jsou to jen upravené běžné typy. V terminologii Javy tedy tazatel nechtěl generiku nad generikou, ale chtěl vytvořit potomka typového parametru.
To je zásadní neznalost terminologie. Swift taky nemá šablony, jen generika, a přitom proměnné pro vyšší typy má.
Název: Re:Template on template v Javě
Přispěvatel: Sten 17. 08. 2017, 14:00:44
Aby to byla šablona nad šablonou, musí být ta šablona parametr toho nového typu. Například
Kód: [Vybrat]
template <template <typename> typename T>
class Collector
{
private:
    T<std::string> _collection;
};

je Collector šablona nad šablonou, protože se tomu jako parametr předává šablona. Kolektor je typický případ, dostane jako šablonu kontejner, do kterého ukládá data:
Kód: [Vybrat]
B<std::vector> vectorCollector{};
B<std::set> setCollector{};

Java nic takového nemá, protože type erasure v generikách zabraňuje takovému použití. Java to řeší rozhraními, zde by kolektor musel dostat zvenčí instanci Collection. To je často omezující, protože ten, kdo tu třídu vytváří, nemusí vědět, co jí vlastně má předat do konstruktoru; v C++ jednoduše volá bezparametrový konstruktor. Řešit to v Javě lze pomocí továrny, ale vede to k typickému javovskému lasagna code.
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 15:03:35
Aby to byla šablona nad šablonou, musí být ta šablona parametr toho nového typu. Například
Kód: [Vybrat]
template <template <typename> typename T>
class Collector
{
private:
    T<std::string> _collection;
};

je Collector šablona nad šablonou, protože se tomu jako parametr předává šablona. Kolektor je typický případ, dostane jako šablonu kontejner, do kterého ukládá data:
Kód: [Vybrat]
B<std::vector> vectorCollector{};
B<std::set> setCollector{};

Java nic takového nemá, protože type erasure v generikách zabraňuje takovému použití. Java to řeší rozhraními, zde by kolektor musel dostat zvenčí instanci Collection. To je často omezující, protože ten, kdo tu třídu vytváří, nemusí vědět, co jí vlastně má předat do konstruktoru; v C++ jednoduše volá bezparametrový konstruktor. Řešit to v Javě lze pomocí továrny, ale vede to k typickému javovskému lasagna code.
To je názorný příklad, ale s tím type erasure nesouhlasím, šlo by to udělat i v Javě (nad JVM), jen asi někdo usoudil, že to nemá smysl, protože průměrný cílový programátor to není schopen pobrat (jak je vidět i přímo zde ve vlákně).

A jen tak mimochodem, i v C++ se rychle narazí na omezení typového systému, jakmile dojde na generické metody.
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 17. 08. 2017, 15:17:13
Pokud si někdo neumí vygooglit pojem, který nezná, tak je přinejlepším to, čemu zde někteří říkají "lopata". Přispěvatelé do fóra nejsou tvoje sekretářka. Doporučuji návrat do školy, pokud Google nevyhovuje.
Nechápu, proč sem píšete poznámky, které nijak nesouvisí s touhle debatou. Nebo on se tu objevil někdo takový, o kom píšete? A mimochodem, je hezké, že googlení pojmu doporučuje ten, kdo předtím tvrdil, že používání špatných pojmů nevadí, protože přeci všichni vědí, o co jde.

Pochopils to špatně. Doporučuji obrátit se na M.Prýmka  ;)
Klidně se na něj obraťte, já vám v tom nijak nebráním.

To je zásadní neznalost terminologie. Swift taky nemá šablony, jen generika, a přitom proměnné pro vyšší typy má.
To je právě ten problém, když někdo jenom zaslechne nějaké termíny, ale vůbec netuší, o co vlastně jde. Kdybyste těm termínům rozuměl, tak byste pochopil, že jsem nepsal nic o tom, že šablony jsou podmínkou pro „proměnné pro vyšší typy“. Šablony jsou jenom jeden z možných způsobů implementace, nikoli jediný. A Java prostě šablony implementované nemá, takže není dobrý nápad to šablony nazývat – i když se generiky v Javě často používají stejným způsobem, jako šablony v C++. Právě proto je dobré znát tu terminologii (ne jen slovíčka, ale jejich význam), protože to, že se dva různé nástroje mohou používat ve stejných případech, neznamená, že jsou stejné.
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 17. 08. 2017, 15:34:19
Java nic takového nemá, protože type erasure v generikách zabraňuje takovému použití. Java to řeší rozhraními, zde by kolektor musel dostat zvenčí instanci Collection. To je často omezující, protože ten, kdo tu třídu vytváří, nemusí vědět, co jí vlastně má předat do konstruktoru; v C++ jednoduše volá bezparametrový konstruktor. Řešit to v Javě lze pomocí továrny, ale vede to k typickému javovskému lasagna code.
Tenhle jednoduchý případ bude i v Javě stručný díky lambdám. Ale to je samozřejmě dané tím, že ten vnější typ má jen jeden typ události, což je přesně to, co dělají lambda výrazy.
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 15:44:48
Pokud si někdo neumí vygooglit pojem, který nezná, tak je přinejlepším to, čemu zde někteří říkají "lopata". Přispěvatelé do fóra nejsou tvoje sekretářka. Doporučuji návrat do školy, pokud Google nevyhovuje.
Nechápu, proč sem píšete poznámky, které nijak nesouvisí s touhle debatou. Nebo on se tu objevil někdo takový, o kom píšete? A mimochodem, je hezké, že googlení pojmu doporučuje ten, kdo předtím tvrdil, že používání špatných pojmů nevadí, protože přeci všichni vědí, o co jde.

Pochopils to špatně. Doporučuji obrátit se na M.Prýmka  ;)
Klidně se na něj obraťte, já vám v tom nijak nebráním.

To je zásadní neznalost terminologie. Swift taky nemá šablony, jen generika, a přitom proměnné pro vyšší typy má.
To je právě ten problém, když někdo jenom zaslechne nějaké termíny, ale vůbec netuší, o co vlastně jde. Kdybyste těm termínům rozuměl, tak byste pochopil, že jsem nepsal nic o tom, že šablony jsou podmínkou pro „proměnné pro vyšší typy“. Šablony jsou jenom jeden z možných způsobů implementace, nikoli jediný. A Java prostě šablony implementované nemá, takže není dobrý nápad to šablony nazývat – i když se generiky v Javě často používají stejným způsobem, jako šablony v C++. Právě proto je dobré znát tu terminologii (ne jen slovíčka, ale jejich význam), protože to, že se dva různé nástroje mohou používat ve stejných případech, neznamená, že jsou stejné.
Fakt nechápu, proč když něco nevíš, tak se to prostě nedoučíš. Začal jsi s ad hominem a teď píšeš bláboly jak malý harant, kterého nachytali na švestkách. Pro tvou informaci znám do hloubky Javu i Haskell a stačilo googlit "higher kinded types in Java", abych si ověřil, že to do Javy ještě nedorazilo. Rezistence k dalšímu vzdělávání vede do pekel, radši se jí zbav a věnuj se studiu místo urážení lidí, co tě upozorní na elementární neznalost.
Název: Re:Template on template v Javě
Přispěvatel: Lol Phirae 17. 08. 2017, 16:03:43
Fakt nechápu, proč když něco nevíš, tak se to prostě nedoučíš. Začal jsi s ad hominem a teď píšeš bláboly jak malý harant, kterého nachytali na švestkách.

Zřejmě první setkání s Jirsákem?  ;D :D
Název: Re:Template on template v Javě
Přispěvatel: Filip Jirsák 17. 08. 2017, 16:05:50
Fakt nechápu, proč když něco nevíš, tak se to prostě nedoučíš.
Já zas nechápu, jak jste na takový nesmysl přišel.

Začal jsi s ad hominem
No vidíte, a hned máte další termín na seznam toho, o čem byste si měl zjistit, co to doopravdy znamená.

Pro tvou informaci znám do hloubky Javu i Haskell a stačilo googlit "higher kinded types in Java", abych si ověřil, že to do Javy ještě nedorazilo.
Já si pod „znám do hloubky“ představuju podstatně vyšší úroveň znalostí, než že budete googlovat běžné vlastnosti jazyka.

Lidem, kteří zaslechli nějaké termíny, ale netuší, co znamenají, je těžké poradit, protože nedokážou popsat, jaký problém vlastně řeší. Tazatel se ptá na šablony šablon v Javě, což je poněkud problém, když v Javě nejsou ani šablony. Vy hned víte, že chtěl určitě higher kinded types, protože jste sice někde zaslechl ten termín, ale nemáte představu, co se za tím skrývá a k čemu by se to mohlo použít.

Občas se stane, že někdo shání nějakou vlastnost jednoho řešení (jazyka nebo klidně IPv4) v jazyce jiném (nebo třeba v IPv6), navíc s dodatkem, že to cílový jazyk (IPv6) určitě neumí, protože je blbý. Pokud se podaří z dotyčného vypáčit, jaký problém vlastně řeší, v 99 % případů se najde v cílovém nástroji řešení daného problému, přičemž v 80 % případů je to stejně elegantní řešení, jako v tom vzorovém nástroji, zbývající případy jsou půl na půl, zda je to řešení dokonce ještě lepší nebo horší než vzor. K takovým případům patří mimo jiné mnoho dotazů, kdy se někdo sháněl po šablonách v Javě a jeho problém vyřešily generiky – po té, co dotyčnému někdo jejich existenci v diskusi prozradil.
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 16:08:02
Fakt nechápu, proč když něco nevíš, tak se to prostě nedoučíš. Začal jsi s ad hominem a teď píšeš bláboly jak malý harant, kterého nachytali na švestkách.

Zřejmě první setkání s Jirsákem?  ;D :D
Ano. Takto se chová pořád?
Název: Re:Template on template v Javě
Přispěvatel: Jerry 17. 08. 2017, 16:12:17
tady je to moc hezky napsaný ... stejnej dotaz jako si dal ty :


https://stackoverflow.com/questions/462297/how-to-use-classt-in-java

https://stackoverflow.com/questions/2159338/what-is-the-java-equivalent-of-cs-templates

https://docs.oracle.com/javase/tutorial/java/generics/types.html

tady máš pole templates in Template

https://stackoverflow.com/questions/1831448/java-templates-array-of-template-type-in-template

Název: Re:Template on template v Javě
Přispěvatel: Lol Phirae 17. 08. 2017, 16:17:54
Fakt nechápu, proč když něco nevíš, tak se to prostě nedoučíš. Začal jsi s ad hominem a teď píšeš bláboly jak malý harant, kterého nachytali na švestkách.

Zřejmě první setkání s Jirsákem?  ;D :D
Ano. Takto se chová pořád?

Po cca dvouroční epizodě v ilegalitě následující po legendární diskusi na téma ukládání vs. export z GIMPu (http://www.abclinuxu.cz/clanky/gimp-2.8-v-jednom-okne-a-s-celou-radou-vylepseni) (která si vysloužila i vlastní díl komiksu (http://www.itbiz.cz/komiks/komiks-gimp-2-8)) je již několik let zase zpět a grafomanie spojená s obsedantním přesvědčením o dokonalé znalosti tématu se rapidně zhoršují. Podobným stylem je schopen zaneřádit prakticky jakoukoliv diskusi, ale "oblíbená" jsou krom Javy zejm. témata autorských práv, licencování Windows a PKI (tzv. "důvěryhodné" certifikační autority).
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 16:24:14
Fakt nechápu, proč když něco nevíš, tak se to prostě nedoučíš. Začal jsi s ad hominem a teď píšeš bláboly jak malý harant, kterého nachytali na švestkách.

Zřejmě první setkání s Jirsákem?  ;D :D
Ano. Takto se chová pořád?

Po cca dvouroční epizodě v ilegalitě následující po legendární diskusi na téma ukládání vs. export z GIMPu (http://www.abclinuxu.cz/clanky/gimp-2.8-v-jednom-okne-a-s-celou-radou-vylepseni) (která si vysloužila i vlastní díl komiksu (http://www.itbiz.cz/komiks/komiks-gimp-2-8)) je již několik let zase zpět a grafomanie spojená s obsedantním přesvědčením o dokonalé znalosti tématu se rapidně zhoršují. Podobným stylem je schopen zaneřádit prakticky jakoukoliv diskusi, ale "oblíbená" jsou krom Javy zejm. témata autorských práv, licencování Windows a PKI (tzv. "důvěryhodné" certifikační autority).
Takže troll, co nemá znalosti (jak už stihnul ukázat) a jen provokuje. Díky za upozornění, už je na ignore listu. >:(
Název: Re:Template on template v Javě
Přispěvatel: Aoidhghean 17. 08. 2017, 16:33:35
tady je to moc hezky napsaný ... stejnej dotaz jako si dal ty :


https://stackoverflow.com/questions/462297/how-to-use-classt-in-java

https://stackoverflow.com/questions/2159338/what-is-the-java-equivalent-of-cs-templates

https://docs.oracle.com/javase/tutorial/java/generics/types.html

tady máš pole templates in Template

https://stackoverflow.com/questions/1831448/java-templates-array-of-template-type-in-template
Relevantní je spíše toto: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/template_template_arguments.htm (pro porozumění) a pak první výsledek z googlu: https://stackoverflow.com/questions/876948/higher-kinded-generics-in-java