Java a statické metody

Re:Java a statické metody
« Odpověď #45 kdy: 22. 10. 2015, 10:42:02 »
Já zírám. Opravdu někoho napadne, že by implementace sinu měla jít přehazovat za běhu? Tohle už snad není ani overengineering.
Nemusí jít přehazovat za běhu, ale výběr nejlepší možné implementace je logický. Proč bych to mám všude počítat pomalým způsobem jenom proto, že na některých platformách není rychlejší způsob dostupný?

To, že jsou různé algoritmy schované za tou funkcí je přece výhoda. Mně nezajímá postup ale počet platných číslic co dostanu.
Takže jste si to nakonec vysvětlil sám, že by kód neměl záviset na konkrétní implementaci.


JSH

Re:Java a statické metody
« Odpověď #46 kdy: 22. 10. 2015, 11:05:03 »
Já zírám. Opravdu někoho napadne, že by implementace sinu měla jít přehazovat za běhu? Tohle už snad není ani overengineering.
Nemusí jít přehazovat za běhu, ale výběr nejlepší možné implementace je logický. Proč bych to mám všude počítat pomalým způsobem jenom proto, že na některých platformách není rychlejší způsob dostupný?
A tohle je argument pro to že pro sinus nestačí úplně jednoduchá funkce? Přece implementace té funkce závisí na platformě.

Re:Java a statické metody
« Odpověď #47 kdy: 22. 10. 2015, 11:19:19 »
A tohle je argument pro to že pro sinus nestačí úplně jednoduchá funkce? Přece implementace té funkce závisí na platformě.
Implementace té funkce závisí na něčem. Takže nemůžu mít ve svém programu závislost na jedné konkrétní implementaci. Kdybych si dal do své aplikace závislost třeba na implementaci, která používá GPU, nebude to fungovat na zařízení, které žádné GPU nemá.

JSH

Re:Java a statické metody
« Odpověď #48 kdy: 22. 10. 2015, 11:29:20 »
Implementace té funkce závisí na něčem. Takže nemůžu mít ve svém programu závislost na jedné konkrétní implementaci. Kdybych si dal do své aplikace závislost třeba na implementaci, která používá GPU, nebude to fungovat na zařízení, které žádné GPU nemá.
Já to fakt nechápu. Sinus je matematická funkce R->R. V C(++) a spoustě dalších jazyků je to přetížená funkce float->float, double->double. Na GPU (glsl, hlsl, opencl, cuda) je to všude funkce float->float.

Implementace sinu se volí v době překladu protože na nějaké rozskakování za běhu nemá moc cenu. Spláchnutí pipeline které je s tím spojené se prostě nevyplatí. Sinus je tak low level, že jediná smysluplná volba podle platformy probíhá při překladu.

Fakt mě nenapadá jediný důvod proč ze sinu dělat cokoliv jiného než obyčejnou jednoduchou funkci.

F.

Re:Java a statické metody
« Odpověď #49 kdy: 22. 10. 2015, 11:38:55 »
Zajimalo by me jakym zpusobem bys resil bez getteru konverzi tveho objektu do nejakeho request objektu(dto, ..), ktery je api knihovny/sluzby co pouzivas. To jako udelas neco jako

Kód: [Vybrat]
RequestObject request = entity.convertToRequestObject()
a pridas tak do te tve entity zavislost na RequestObject?? Co kdyz k tomu potrebujes informace od jinud? Treba nejaky opravneni?

Zapomněl jsi specifikovat, co se má na co konvertovat. Nevím, co má být v objektu třídy RequestObject, v knihovnách Javy jsem tu třídu nenašel. Také nevím, jaké třídy je objekt entity a co má dělat metoda convertToRequestObject(), která jí evidentně nepatří. Co po něm budeš požadovat? Popsané rozhraní prostě rozdělím na více menších.

Kód: [Vybrat]
Dto dto = request.presentate(entity)
Objekt entity implementuje rozhraní Presentable, metoda request.presentate() si ji v entity zavolá jako entity.show() s výsledkem v rozhraní Showable a zkonvertuje ji do objektu rozhraní Dto. Možná to vypadá trochu chaoticky, ale vzhledem k tomu, že mám chaotické zadání, to zas tak moc nevadí.

Hlavním pravidlem OOP je: Tell, do'nt ask. Je porušeno už v zadání, tak si příště vymysli jiný příklad. Nepotřebuješ request, ale response.

Zadani je jednoduche, mas svoji entitu, treba Employee a chces zavolat nejakou 3rd party service, s parametrem treba CreateEmployeeRequest, ten request je vicemene dto, ktere obsahuje vetsinu informaci z te entity (jmeno, email, adresa, oddeleni atd..), takze ve vysledku potrebujes zavolat tohle:

Kód: [Vybrat]
client.createEmployee(createEmployeeRequest);
Takze misto converteru, ktery pomoci getteru vytaha data z entity a nasype je do dto (typicky priklad v java ee / springu):

Kód: [Vybrat]
CreateEmployeeRequest request = entityToCreateRequestConverter.convert(entity);
client.createEmployee(request);

udelas presne co?


Re:Java a statické metody
« Odpověď #50 kdy: 22. 10. 2015, 11:45:24 »
Implementace sinu se volí v době překladu protože na nějaké rozskakování za běhu nemá moc cenu. Spláchnutí pipeline které je s tím spojené se prostě nevyplatí. Sinus je tak low level, že jediná smysluplná volba podle platformy probíhá při překladu.
Při překladu Java programu bude cílovou platformou JVM, na tom není moc co řešit. Což ale vůbec neznamená, že nemůžete mít různé implementace – pár příkladů už jsem vyjmenoval. Vůbec není potřeba dělat nějaký rozskok za běhu programu – prostě budete mít mezi knihovnami při startu aplikace jednou knihovnu s jednou implementací, a příště tam dáte jinou implementaci.

perceptron

Re:Java a statické metody
« Odpověď #51 kdy: 22. 10. 2015, 11:52:15 »
Citace
udelas presne co?
skor prejde tava uchom ihly ako da kit priklad architektury. jeho priklady su vyblitky, v jave nerobil, a nevie o com hovori. to sa tyka uz 9 threadov.

JSH

Re:Java a statické metody
« Odpověď #52 kdy: 22. 10. 2015, 12:10:33 »
Při překladu Java programu bude cílovou platformou JVM, na tom není moc co řešit. Což ale vůbec neznamená, že nemůžete mít různé implementace – pár příkladů už jsem vyjmenoval. Vůbec není potřeba dělat nějaký rozskok za běhu programu – prostě budete mít mezi knihovnami při startu aplikace jednou knihovnu s jednou implementací, a příště tam dáte jinou implementaci.
Jo, můžu mít různé implementace a pří JIT překladu překladač nějakou vybere. Já tam pořád nevidím ten důvod, proč by měl být sinus cokoliv jiného než jednoduchá funkce. O to tu snad celou dobu jde.

Re:Java a statické metody
« Odpověď #53 kdy: 22. 10. 2015, 12:27:21 »
Já tam pořád nevidím ten důvod, proč by měl být sinus cokoliv jiného než jednoduchá funkce. O to tu snad celou dobu jde.
Ne, nejde tu o to, že by sinus měl být cokoli jiného, než jednoduchá funkce. Jsou to různé jednoduché implementace – jednou je to jednoduchá funkce implementovaná instrukcemi pro celočíselnou aritmetiku, která bude fungovat všude. Podruhé je to jednoduchá funkce implementovaná instrukcemi pro aritmetiku v plovoucí řádové čárce. Potřetí je to jednoduchá funkce implementovaná pomocí instrukcí GPU. A já jako uživatel nechci vybírat, která implementace se použije – protože ani nemusí být vždy všechny dostupné.

JSH

Re:Java a statické metody
« Odpověď #54 kdy: 22. 10. 2015, 12:33:48 »
Ne, nejde tu o to, že by sinus měl být cokoli jiného, než jednoduchá funkce. Jsou to různé jednoduché implementace – jednou je to jednoduchá funkce implementovaná instrukcemi pro celočíselnou aritmetiku, která bude fungovat všude. Podruhé je to jednoduchá funkce implementovaná instrukcemi pro aritmetiku v plovoucí řádové čárce. Potřetí je to jednoduchá funkce implementovaná pomocí instrukcí GPU. A já jako uživatel nechci vybírat, která implementace se použije – protože ani nemusí být vždy všechny dostupné.
Tak o čem tu teda diskutujeme, pokud je správně aby byl sinus obyč funkce. Celé tohle vlákno se točí kolem toho že pro některé věci je obyč funkce to nejlepší a sinus tu padl jako příklad.

Re:Java a statické metody
« Odpověď #55 kdy: 22. 10. 2015, 12:49:54 »
Tak o čem tu teda diskutujeme, pokud je správně aby byl sinus obyč funkce. Celé tohle vlákno se točí kolem toho že pro některé věci je obyč funkce to nejlepší a sinus tu padl jako příklad.
Četl jste ten komentář, na který odpovídáte? Máte tři různé implementace jednoduché funkce, někde jsou dostupné všechny, někde třeba jenom jedna z nich. Uživatel té funkce nepotřebuje jednu konkrétní implementaci, on potřebuje nějakou implementaci, a pokud možno takovou, která je v dané chvíli nejlepší.

JSH

Re:Java a statické metody
« Odpověď #56 kdy: 22. 10. 2015, 13:00:35 »
Četl jste ten komentář, na který odpovídáte? Máte tři různé implementace jednoduché funkce, někde jsou dostupné všechny, někde třeba jenom jedna z nich. Uživatel té funkce nepotřebuje jednu konkrétní implementaci, on potřebuje nějakou implementaci, a pokud možno takovou, která je v dané chvíli nejlepší.
Ano, četl. Mám jednoduchou funkci sinus a její tři možné implementace z nichž jednu překladač při JIT vybere a použije. Triviální peephole optimalizace. Přesně tak to pokud vím Java dělá, akorát nemá ty jednoduché funkce a musí si vypomáhat statickýma metodama. Proč bych tady měl chtít cokoliv jiného než tu jednoduchou funkci?

Re:Java a statické metody
« Odpověď #57 kdy: 22. 10. 2015, 13:22:47 »
Mám jednoduchou funkci sinus a její tři možné implementace z nichž jednu překladač při JIT vybere a použije.
Ne, překladač JIT žádnou implementaci nevybere.

Přesně tak to pokud vím Java dělá, akorát nemá ty jednoduché funkce a musí si vypomáhat statickýma metodama.
Ne, JIT žádnou implementaci nevybírá. Kdybyste použil statickou metodu, váš kód na té statické metodě bude záviset a nezměníte to jinak, než změnou zdrojového kódu. Až se za pár let stane běžnou součástí počítačů komponenta, která bude umět sinus počítat tisíckrát rychleji, váš kód bude pořád dál používat starou pomalou metodu počítání na CPU.

Proč bych tady měl chtít cokoliv jiného než tu jednoduchou funkci?
Máte tři různé implementace. Pokud chcete, aby byly vzájemně zastupitelné, musí mít společné rozhraní. Uživatel té funkce používá rozhraní, nemá vazbu přímo na nějakou implementaci. No a pak samozřejmě musíte mít nějaký kód, který dosadí tu konkrétní implementaci.

Třeba budete mít takovýhle kód. Všimněte si, že Calculator neví nic o nějaké konkrétní implementaci. Kdybyste použil statickou metodu, bude Calculator na tuto metodu pevně navázán a bez změny zdrojového kódu tu implementaci nezměníte.
Kód: [Vybrat]
interface TrigonometricFunctions {
  public double sin(double angle);
}

class Calculator {
  private final TrigonometricFunctions trigonometricFunctions;

  public Calculator(TrigonometricFunctions trigonometricFunctions) {
    assert trigonometricFunctions != null;
    this.trigonometricFunctions = trigonometricFunctions;
  }

  public void compute() {
    …
    double sinResult = trigonometricFunctions.sin(0.0d);
    …
  }
}

Radek Miček

Re:Java a statické metody
« Odpověď #58 kdy: 22. 10. 2015, 13:32:43 »
Kdybyste použil statickou metodu, váš kód na té statické metodě bude záviset a nezměníte to jinak, než změnou zdrojového kódu.

Statická metoda může volat implementaci, jenž je uložena v nějaké statické proměnné, stačí tedy změnit tuto proměnnou.

Re:Java a statické metody
« Odpověď #59 kdy: 22. 10. 2015, 13:37:58 »
Statická metoda může volat implementaci, jenž je uložena v nějaké statické proměnné, stačí tedy změnit tuto proměnnou.
Uživatel je pak ale pořád závislý na implementaci té statické metody. Navíc ta statická proměnná je globální proměnná pro celý classloader, takže když jí jeden uživatel změní, změní implementaci všem.