NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: vracení více hodnot jednou metodou

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
keke1
Člen
Avatar
keke1:27.8.2013 9:54

Ahojte,

existuje nějaká možnost jednou metodou v třídě vrátit více hodnot?
Rychlý nástin:
Z DB potřebuji načíst řádky údajů (neměnný formát tabulky--- nemůžu upravit tabulku, že bych do ni přidal jeden sloupec pro tuto vypočtenou hodnotu) a k nim dopočítat hodnotu a tohle vrátit do hlavního programu, kde tyto údaje vypíšu na obrazovku.

Taky mi nepomůže GET, protože existuje právě jedna instance třídy, která mi děla dotaz do DB a vrací mi LIST<nazevTabulky>

nejvhodnější by bylo vrátit pomocí return <nazevTabulky> + hodnota;
ale to samozřejmě nejde... :-(

 
Odpovědět
27.8.2013 9:54
Avatar
Odpovídá na keke1
Michal Žůrek - misaz:27.8.2013 10:05

můžeš si napsat vlastni třídu a předávat tu:

class Neco {
    public int neco1;
    public int neco2;
}
 
Nahoru Odpovědět
27.8.2013 10:05
Avatar
Theodor Johnson
Tvůrce
Avatar
Odpovídá na keke1
Theodor Johnson:27.8.2013 10:13

Tuple<string, int>

Nahoru Odpovědět
27.8.2013 10:13
Mo8ilε 15 Ѐλđ
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:27.8.2013 10:47

... neboli Messenger.

Pojem Tabulka v DB je vlastně ekvivalentem pro seznam n-tic s nedefinovaným pořadím. Původně jsem chtěl napsat množina, ale to by vylučovalo duplicitní záznamy.

Nahoru Odpovědět
27.8.2013 10:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na keke1
Luboš Běhounek Satik:27.8.2013 11:11

Nebo můžeš použít ref / out.

Nahoru Odpovědět
27.8.2013 11:11
https://www.facebook.com/peasantsandcastles/
Avatar
keke1
Člen
Avatar
keke1:27.8.2013 11:24

Díky všem :-)
zkusil jsem pro mne novinku Tuple<> a po potřebné úpravě programu to opravdu funguje tak, jak potřebuji. Opravdu moc díky :-)

 
Nahoru Odpovědět
27.8.2013 11:24
Avatar
keke1
Člen
Avatar
keke1:27.8.2013 11:39

Jen se ještě zeptám, protože Tuple jsem použil poprvé... jsou nějaké zásadní nevýhody tohoto použití? např. zbytečně velké nároky na paměť, citelná ztráta výkonu atd... máte někdo nějaké špatné zkušenosti s Tuple? Kdy ho není třeba vhodné používat? předem díky za vaše názory

 
Nahoru Odpovědět
27.8.2013 11:39
Avatar
vitamin
Člen
Avatar
Odpovídá na keke1
vitamin:27.8.2013 15:50

Tuple je trieda, takze ma vsetky nevyhody a vyhody tried (relativne velka pametova rezia, GC, ...). Ak je pre teba velmi dvolezita rychlost tak radsej pouzi ref/out alebo vrat strukturu ktora bude obsahovat data. Ak nie je rychlost prvorada tak kludne pouzi Tuple, bude to prehladnejsie.

 
Nahoru Odpovědět
27.8.2013 15:50
Avatar
Kit
Tvůrce
Avatar
Odpovídá na vitamin
Kit:27.8.2013 16:02

Kdyby sis to vyzkoušel, tak bys zjistil, že rychlost je stejná. Proto je lepší udělat return Tuple, protože je přehlednější. Zároveň umožňuje tuto přepravku ihned použít, což ref neumí.

Navíc při vyvolání výjimky v metodě se return chová mnohem lépe - návratový objekt se vůbec nevytváří.

Nahoru Odpovědět
27.8.2013 16:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:27.8.2013 16:15

Zase píšeš nesmysly, rychlost stejná není.

Nahoru Odpovědět
27.8.2013 16:15
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:27.8.2013 16:20

To jsi měřil nebo hádáš? Je přece výkonově jedno jestli instanci té přepravky dělám vně nebo uvnitř metody. Když ji udělám uvnitř, tak je to objektově čisté.

Nahoru Odpovědět
27.8.2013 16:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vitamin
Člen
Avatar
Odpovídá na Kit
vitamin:27.8.2013 16:34

Ak pouzies ref/out tak nepotrebujes prepravku, ak pouzies strukturu ako prepravku tak sa prepravka alokuje na stacku, ak pouzies tuple tak je alokovana prepravka na heape. Kazda moznost ma ine vyhody/nevyhody. Tuple je navyse readonly.

 
Nahoru Odpovědět
27.8.2013 16:34
Avatar
Kit
Tvůrce
Avatar
Odpovídá na keke1
Kit:27.8.2013 16:34

Z DB potřebuji načíst řádky údajů (neměnný formát tabulky--- nemůžu upravit tabulku, že bych do ni přidal jeden sloupec pro tuto vypočtenou hodnotu) a k nim dopočítat hodnotu a tohle vrátit do hlavního programu, kde tyto údaje vypíšu na obrazovku.

Tohle běžně dělám. Přidám si do tabulky virtuální sloupec, který vznikne jako výsledek výrazu. Odpadne tím zmíněný mezičlánek a dostanu jen údaje, které skutečně potřebuji. Tabulka se tím vůbec nezmění.

Nahoru Odpovědět
27.8.2013 16:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na vitamin
Kit:27.8.2013 16:36

To je přece dobře, že je tuple readonly. Je to immutable objekt a je to žádoucí vlastnost. Přece ho nebudu modifikovat.

Tuple je implementací přepravky.

Editováno 27.8.2013 16:37
Nahoru Odpovědět
27.8.2013 16:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Kit
Jan Vargovský:27.8.2013 16:50

http://www.itnetwork.cz/…ash/test.png bude ti stačit tohle ? Testováno 108 vrácení přes struct, class, tuple a 2x out.

 
Nahoru Odpovědět
27.8.2013 16:50
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Kit:27.8.2013 16:57

No jo, stejně však ten out musíš zabalit do struct, class nebo tuple, abys ho mohl dál použít k požadovanému účelu. Takže tím nic nezískáš.

Nahoru Odpovědět
27.8.2013 16:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Kit
Jan Vargovský:27.8.2013 17:01

To už závisí na daném problému, ale tady vidíš že je to cca 5x rychlejší :)

 
Nahoru Odpovědět
27.8.2013 17:01
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Kit:27.8.2013 17:04

Je to rychlejší, protože jsi to vytrhl z kontextu programu. Když to pak použiješ ve skutečném programu, výsledek bude podobný. Ale to už asi měřit nebudeš, protože v tomhle testu jsi získal sice zajímavý, ale nepoužitelný výsledek.

Nahoru Odpovědět
27.8.2013 17:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:27.8.2013 17:15

Hádám, ale je to logické, vytvoření instance třídy zabere přece mnohem víc než jen uložení hodnoty na stack/do registru.

Nahoru Odpovědět
27.8.2013 17:15
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:27.8.2013 17:21

Jsi hrozný demagog.

Píšeš, že rychlost je stejná, někdo ti dokáže opak, tak napíšeš, že to vlastně nevadí.

Už mě to začíná trochu unavovat, děláš to často a často u věcí, kterým evidentně moc nerozumíš.

Nahoru Odpovědět
27.8.2013 17:21
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:27.8.2013 17:22

Vyšel jsi z předpokladu, že dál budeme používat tyto dvě proměnné primitivního datového typu samostatně. V tom případě to v daném místě skutečně rychlejší bude. Ale stejně ty dvě proměnné budeš muset do něčeho zabalit, abys to mohl dál použít. Proč si to nenechat zabalit rovnou v té metodě, která ta data poskytuje?

Nahoru Odpovědět
27.8.2013 17:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:27.8.2013 17:23

Tak se neunavuj :)

Nahoru Odpovědět
27.8.2013 17:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:27.8.2013 17:23

A co když je dohromady potřebovat nebude?

Nahoru Odpovědět
27.8.2013 17:23
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:27.8.2013 17:25

V tom případě má chybu v návrhu aplikace.

Nahoru Odpovědět
27.8.2013 17:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:27.8.2013 17:26

"Tak se neunavuj :)"

  • Rád bych, ale vadí mi, když někdo (s tvojí reputací) roztrušuje po fóru nesmysly a ještě se je o nich schopný hádat.

Možná umíš databáze a lepíš do sebe knihovny (aby jsi nemusel používat algoritmy), ale co se týče některých věcí, tak jsi dost mimo.

Nahoru Odpovědět
27.8.2013 17:26
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:27.8.2013 17:30

Děkuji za poklonu :)

Nahoru Odpovědět
27.8.2013 17:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Kit
Lukáš Hruda:27.8.2013 19:46

Proč by měl mít někdo chybu v návrhu aplikace jenom proto že použije dvě samostatné proměnné? Co když to tak udělá jen proto aby šetřil výkonem?

 
Nahoru Odpovědět
27.8.2013 19:46
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Kit:27.8.2013 20:01

Metoda, která vrací dvě nezávislé hodnoty, u kterých potřebuji každou jinde, je přinejmenším podivná.

Nahoru Odpovědět
27.8.2013 20:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Libor Šimo (libcosenior):3.9.2013 7:28

V tomto vlákne bolo spomenutých niekoľko spôsobov ako vrátiť jednou metódou viacej hodnôt.

Mám prosbu.

Mohli by ste sem dať jednoduché príklady?
Úloha: vrátiť lokalizáciu bodu hodnotou x, y.

Mne sa páčilo, čo napísal Misaz, predstavujem si to asi takto:
(dúfam, že správne)

class Neco {
    public int neco1;
    public int neco2;
}

class Pozicia
{
    Neco neco = new Neco();
    public Neco VratXaY(int x, int y)
    {
       neco.X = x;
       neco.Y = y;
       return neco;
    }
}

Môže niekto doplniť príklad na Tuple<>, ref / out, struct?

Nahoru Odpovědět
3.9.2013 7:28
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Hartinger:3.9.2013 8:08

Obdivuji tvoji schopnost neustále vyhledávat podivná řešení.

Nahoru Odpovědět
3.9.2013 8:08
New kid back on the block with a R.I.P
Avatar
vitamin
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
vitamin:3.9.2013 8:13
public struct Pair<T1, T2>
{
    public T1 first;
    public T2 second;

    public Pair(T1 f, T2 s)
    {
        first = f;
        second = s;
    }
}
public abstract struct Pair
{
    public static Pair<T1, T2> Create<T1, T2>(T1 f, T2 s)
    {
        return new Pair<T1, T2>(f, s);
    }
}

public Pair<int, int> VratStruct(int x, int y)
{
    return Pair.Create(x, y);
}
public Tuple<int, int> VratTuple(int x, int y)
{
    return Tuple.Create(x, y);
}
public void VratByRef(ref int x, ref int y)
{
    x = 45;
    y = 13;
}
 
Nahoru Odpovědět
3.9.2013 8:13
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:3.9.2013 8:16

Kdyby se místo těch blbostí ptal na správné řešení, tak bych mu poradil Point.

Nahoru Odpovědět
3.9.2013 8:16
New kid back on the block with a R.I.P
Avatar
Odpovídá na vitamin
Libor Šimo (libcosenior):3.9.2013 8:48

Ďakujem.

@sdraco, ďakujem aj tebe za radu. :)

Nahoru Odpovědět
3.9.2013 8:48
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 33 zpráv z 33.