Template on template v Javě

temple

Template on template v Javě
« kdy: 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í).


Re:Template on template v Javě
« Odpověď #1 kdy: 16. 08. 2017, 22:00:08 »
V Javě šablony nejsou. Napište raději, jaký problém řešíte.

Trollopata

Re:Template on template v Javě
« Odpověď #2 kdy: 16. 08. 2017, 22:29:22 »
No to zase bude flejm...

Aoidhghean

Re:Template on template v Javě
« Odpověď #3 kdy: 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.

Re:Template on template v Javě
« Odpověď #4 kdy: 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.


Ivan Nový


Re:Template on template v Javě
« Odpověď #6 kdy: 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.

perceptron

Re:Template on template v Javě
« Odpověď #7 kdy: 17. 08. 2017, 09:01:35 »
Map<String, List<JdbcTemplate>>

Aoidhghean

Re:Template on template v Javě
« Odpověď #8 kdy: 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).

Aoidhghean

Re:Template on template v Javě
« Odpověď #9 kdy: 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.

Re:Template on template v Javě
« Odpověď #10 kdy: 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> {
}

Aoidhghean

Re:Template on template v Javě
« Odpověď #11 kdy: 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.

Ivan Nový

Re:Template on template v Javě
« Odpověď #12 kdy: 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.
 

Re:Template on template v Javě
« Odpověď #13 kdy: 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.

Aoidhghean

Re:Template on template v Javě
« Odpověď #14 kdy: 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í  ;)