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 »
Citace od: Filip Jirsák kdy 16. 08. 2017, 22:00:08
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 »
Citace od: Aoidhghean kdy 17. 08. 2017, 00:28:42
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.

Citace od: Aoidhghean kdy 17. 08. 2017, 00:28:42
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 »
Citace od: Ivan Nový kdy 17. 08. 2017, 07:10:45
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 »
Citace od: Filip Jirsák kdy 17. 08. 2017, 06:53:58
Citace od: Aoidhghean kdy 17. 08. 2017, 00:28:42
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.

Citace od: Aoidhghean kdy 17. 08. 2017, 00:28:42
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:
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 »
Citace od: perceptron kdy 17. 08. 2017, 09:01:35
Map<String, List<JdbcTemplate>>
To není parametrizované generickým typem. V pseudokódu jde o něco jako:

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:


class StringMap<T> implements Map<String, T> {
}

Aoidhghean

Re:Template on template v Javě
« Odpověď #11 kdy: 17. 08. 2017, 12:20:48 »
Citace od: Filip Jirsák 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:


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 »
Citace od: Filip Jirsák kdy 17. 08. 2017, 08:31:23
Citace od: Ivan Nový kdy 17. 08. 2017, 07:10:45
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 »
Citace od: Aoidhghean kdy 17. 08. 2017, 12:20:48
Citace od: Filip Jirsák 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:


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 »
Citace od: Filip Jirsák kdy 17. 08. 2017, 13:14:44
Citace od: Aoidhghean kdy 17. 08. 2017, 12:20:48
Citace od: Filip Jirsák 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:


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
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í  ;)