NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Зайчик
Člen
Avatar
Зайчик:1.2.2013 16:40

Ahoj, bylo mi řečeno že používat out parametry je to nejhorší co můžu udělat. A tak jsem tak nějak zkoušel a nevím teda co mam používat... byl bych vděčný kdyby mi někdo řekl co je z těchto 3ech verzí nejlepší a proč díky. ;)

// main.cs
Trida t = new Trida();
int cislo = t.UkazCislo();
// Trida.cs
public int UkazCislo()
{
    return 5;
}

nebo

// main.cs
Trida t = new Trida();
int i;
t.UkazCislo(i);
// Trida.cs
public void UkazCislo(out i)
{
     i = 5;
}

a nebo...

// main.cs
Trida t = new Trida();
int i;
t.UkazCislo(ref i);
// Trida.cs
public int UkazCislo(ref i)
{
    i = 5;
    return i;
}
Editováno 1.2.2013 16:41
Odpovědět
1.2.2013 16:40
Коммунизм для нашего будущего!
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Зайчик
matesax:1.2.2013 17:21

Vždy se dá obejít bez obou... Osobně jsem je nikdy nepotřeboval.

 
Nahoru Odpovědět
1.2.2013 17:21
Avatar
Odpovídá na Зайчик
Luboš Běhounek Satik:1.2.2013 17:31

První verze je nejhezčí, ostatní použiješ jen v hodně speciálních případech a běžně se nepoužívají.

Normálně se v C# parametry předávají hodnotou - když zavoláš nějakou funkci, tak se vytvoří kopie parametrů a ty se té funkci předají, takže když je změníš, tak je změníš jen lokálně uvnitř funkce.

Když je předáváš přes ref, tak se předává odkaz - co změníš uvnitř funkce, změní i ty data mimo ni, protože měníš data na místě, kam ta reference ukazuje (a ne jen kopii těch dat).

Pozor na chování, pokud v parametrech předáváš (bez ref) třídu (na rozdíl od structu, kdy se kopírují jeho data), tak se nevytváří kopie jejích dat, ale kopie ukazatele na ni. Pokud do ní přiřadíš null nebo nějaký jiný objekt, tak to děláš jen lokálně v té funkci, ale pokud měníš její data, tak ty už měníš přímo na tom objektu i mimo funkci.

out je obdoba ref a používá se, když se předpokládá, že v době vstupování ta proměnná ještě neexistuje, musíš ji uvnitř funkce vytvořit.

Nahoru Odpovědět
1.2.2013 17:31
https://www.facebook.com/peasantsandcastles/
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
matesax:1.2.2013 18:04

Nevím - jak jsem psal - nikdy jsem to nepotřeboval. Proč je out třeba v TryParse? Všude jinde se normálně vrací -1 při nezdařeném pokusu - proč je TryParse výjimkou? Atd...

 
Nahoru Odpovědět
1.2.2013 18:04
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:1.2.2013 18:10

TryParse vrací zda byla hodnota úspěšně naparsována. Pokud ano, pak se uloží do zadané proměnné a já s ní můžu pak pracovat. Pokud se nepovede parsování, tak se provede jiná větev. To je krásný příklad, kde to použít. Pokud toho potřebuju vrátit víc.
Зайчик: Je lepší používat return. ref a out jen tam, kde toho potřebuješ vrátit víc. Je to takové přirozenější. A i si můžeš všimnout, že se nepoužívají tak hojně, protože to není většinou třeba.

Nahoru Odpovědět
1.2.2013 18:10
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Odpovídá na matesax
Luboš Běhounek Satik:1.2.2013 18:11

A jak bys rozlišil výjimku a rozparsování stringu "-1"?

Nahoru Odpovědět
1.2.2013 18:11
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na David Jančík
Luboš Běhounek Satik:1.2.2013 18:13

Když toho potřebuju vracet víc, tak dávám většinou přednost udělat si na výsledek nějakej zabalovací struct/třídu, kterým si těch víc hodnot vrátím, ale dá se smozřejmě použít i ref nebo out.

Nahoru Odpovědět
1.2.2013 18:13
https://www.facebook.com/peasantsandcastles/
Avatar
Зайчик
Člen
Avatar
Зайчик:1.2.2013 18:17

Tak díky. :) je sice pravda že se to dá skoro vždy obejít, já to teď taky obešel ale myslím že je dobré vědět co je správnější používat. :)

Nahoru Odpovědět
1.2.2013 18:17
Коммунизм для нашего будущего!
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Jančík:1.2.2013 18:21

Jj tak to určitě. Já spíš myslel třeba, když jsem si dělal input message box. Tak mi vracel DialogResult a jako ref jsem si nastavil výchozí text pro textbox, ten se pak dal případně změnit. Když těch parametrů není moc tak je to takhle v pohodě imho.

Nahoru Odpovědět
1.2.2013 18:21
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Odpovídá na David Jančík
Luboš Běhounek Satik:1.2.2013 18:27

Tohle co popisuješ je perfektní příklad pro vhodné využití ref - pokud se má vracet hodnota a ještě jedna proměnná, která se ale dá nastavit při volání. :)

Nahoru Odpovědět
1.2.2013 18:27
https://www.facebook.com/peasantsandcastles/
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:1.2.2013 18:28

Ale k čemu? Jinde to použito není a normálně se ptám:

ddd != -1

A to v nemálo případech...

 
Nahoru Odpovědět
1.2.2013 18:28
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:1.2.2013 19:05

Out a ref jsou zbytečné a vždy se jim dá vyhnout pomocí výjimek nebo vrácením nějaké kolekce/objektu. Každý jazyk má něco, co by se nemělo používat. TryParse je zkrácení kódu za cenu snížení jeho kvality, asi by to tam být nemělo.

Nahoru Odpovědět
1.2.2013 19:05
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:1.2.2013 19:13

Není žádný důvod, proč by se out a ref nemělo nepoužívat.
Out a ref prasárna nejsou, právě naopak, prasárna by bylo použít na vracení výsledku funkce výjimku.

Název výjimka vychází z toho, že se stávají výjimečně...
Taky mají výjimky o něco vyšší režii.

Editováno 1.2.2013 19:13
Nahoru Odpovědět
1.2.2013 19:13
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:1.2.2013 19:16

Pokud se out používá jen k předání chybového stavu (jako v TryParse, přesněji nahrazuje původní návratovou hodnotu metody, která nahrazuje výjimku), je to prasárna. K tomu jsou výjimky :) Pokud chci, aby mi funkce vrátila 2 věci (přesněji tedy 3: 2 hodnoty a informaci o chybě), většinou je někde chyba v návrhu.

Editováno 1.2.2013 19:18
Nahoru Odpovědět
1.2.2013 19:16
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:1.2.2013 19:26

Konečně nejsou všichni proti mně... :) Navíc by se mi občas výjimka hodila - tedy já si ji udělal přes Parse,...

 
Nahoru Odpovědět
1.2.2013 19:26
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:1.2.2013 19:58

Ne, vyvolávat výjimku při drobný akci - jako je třeba parsování stringu je prostě prasárna, za tím si stojím.
Výjimky maj ohromnou režii - schválně jsem to teď testoval.

Rozdíl doby trvání těchto dvou kódů:

if (!Int32.TryParse(parse, out res))
                    res = 42;

a

try
                {
                    res = Int32.Parse(parse);
                }
                catch
                {
                    res = 42;
                }

je v případě vyvolání výjimky více než 600 (!) násobek v neprospěch výjimky.

600 už mi přijde jako docela velkej důvod pro nepoužívání výjimek zbytečně.

A když bys ty kódy spustil v Visual Studiu, tam ten rozdíl v času je (u mě) 50 000 násobek, protože se chyba vypisuje do konzole.

Editováno 1.2.2013 19:59
Nahoru Odpovědět
1.2.2013 19:58
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:1.2.2013 21:14

Není to jen tím, že tolikrát zasebou vytváříš a opouštíš chránněnou sekci? Obvykle mám metodu co mi naparsuje vstup a pokud to někde upadne, moc mě nazajímá co přesně je zadáno špatně. Takže mám v jednom try-catch bloku parsování všech hodnot. Navíc v GUI se už moc neparsuje, to je spíše konzolová záležitost nebo záležitost souborů, kde jsem stejně ve schráněnné sekci.

Nahoru Odpovědět
1.2.2013 21:14
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:1.2.2013 21:34

Když ti to umře na parsování jedný věci, tak se to pak ale přeruší úplně celý, takže kdybych dal do try-catch celej cyklus, tak to po pokusu o naparsování první hodnoty vykočí.

Nahoru Odpovědět
1.2.2013 21:34
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:2.2.2013 9:39

Java např. nic takového nemá, v těhle vyšších jazycích k tomu slouží výjimky a na rychlost se nehledí. Chápu, že tobě to jako lowlevelákovi přijde hrozné, ale až tak špatné to není :)

Nahoru Odpovědět
2.2.2013 9:39
New kid back on the block with a R.I.P
Avatar
lcet.m
Člen
Avatar
lcet.m:4.2.2013 0:19

Matesi a dost. Teď jsem viděl tvůj vejžblebtek o zbytečnosti "var", tady jsou zase zbytečné "out" a "ref".

Víš proč je TryParse řešené přes out? Protože:

int hodnota;
if (int.TryParse(str, out hodnota) && (hodnota > 0))
   ....

Srovnej si eleganci tohohle řešení s těmi tvými vyjímkami (vím, že obecně řídíš kód výjimkami, protože jseš prase, ale ne, není to správné).

Pro případ, kdy chceš aby špatný formát vstupu vyhodil výjimku, tu máš int.Parse. Try znamená "zkusit", takže každému s mozkem asi doje, proč TryParse nevyhazuje výjimku. Borec tvého formátu si samozřejmě před voláním Try projde v cyklu znaky stringu a podle ASCII si zkontroluje, jestli jsou to jen čísla a znménko -. Před voláním DateTime.TryPar­seExact si můžeš udělat regex. A já zatím klidně použiju to out.

Proč má třeba Dictionary TryGetValue(key, out value), místo aby nevím vlastně co vracel?

string text;
if(!_dictionary.TryGetValue(id, out text))
{
    _text = GetTextById(id);
    _dictionary.Add(id, _text);
}

Takhle přehledného zápisu s jinou konstrukcí nedosáhneš, nehledě na výkon.

Ref je taky rychlejší než vytváření kopie. Tebe, Matesi, samozřejmě výkon netrápí, ale jestli víš co je třeba .NET MicroFramework, tak tam už ref smysl má.

Líbí se mi, kolik lidí by tady umělo Microsoftu poladit .NET. Nechápu, proč už tam dávno nešéfujete vývoji.

 
Nahoru Odpovědět
4.2.2013 0:19
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:4.2.2013 8:47

Pomalost výjimek není na závadu, neboť k výjimkám dochází výjimečně.

Nahoru Odpovědět
4.2.2013 8:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na lcet.m
matesax:4.2.2013 11:43

Prasárna je neustále větvit - a také to, že to odporuje logice - TryParse - Try == pokus omyl. Try == Try blok... Ne větvení - které nepokryje všechny možnosti... Try blok vyhodí zprávu o problému - a díky této zprávě víme přesně o co go...

Neznám jediné valné využití var, ref a out... Cpeš sem vzhled kódu a ukecanost, která ale k C# patří. Už jen proto, že je silně typovaný atd...

Editováno 4.2.2013 11:44
 
Nahoru Odpovědět
4.2.2013 11:43
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:4.2.2013 12:15

Výjimečně k nim dochází jen, pokud je někdo nepoužívá k běžnému řízení kódu.

Nahoru Odpovědět
4.2.2013 12:15
https://www.facebook.com/peasantsandcastles/
Avatar
vodacek
Tvůrce
Avatar
Odpovídá na matesax
vodacek:4.2.2013 12:23

je zajímavé sledovat jak se tu lidi oháněj tím že je něco prasárna obvykle je to ale pouze něco čeho se zoufale bojí nebo to radši nepoužívají protože nechápou význam dané věci...

 
Nahoru Odpovědět
4.2.2013 12:23
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:4.2.2013 12:31

K běžnému řízení kódu se výjimky zásadně nepoužívají. Proto k nim dochází výjimečně.

Nahoru Odpovědět
4.2.2013 12:31
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 vodacek
Kit:4.2.2013 12:35

Někteří programátoři nedokáží rozlišit datový a chybový tok dat z funkce a proto pracují s nesmysly typu TryParse().

Nahoru Odpovědět
4.2.2013 12:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vodacek
Tvůrce
Avatar
Odpovídá na Kit
vodacek:4.2.2013 12:46

co je tedy na tryparse tak špatného a zlého?

 
Nahoru Odpovědět
4.2.2013 12:46
Avatar
Kit
Tvůrce
Avatar
Odpovídá na vodacek
Kit:4.2.2013 13:03

... že výsledkem funkce není získaná hodnota, ale chybový stav.

Nahoru Odpovědět
4.2.2013 13:03
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:4.2.2013 13:37

A na tom je špatného co? Už od dob Céčka se to používá naprosto běžně.

Nahoru Odpovědět
4.2.2013 13:37
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:4.2.2013 13:53

Tak ono to v C jinak nejde žejo :D ...leda přes globální proměnnou, nebo pointer v parametru, ale to se většinou nedělá.

 
Nahoru Odpovědět
4.2.2013 13:53
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:4.2.2013 15:21

C# už s Céčkem nemá mnoho společného. Céčko nemá výjimky, tak to nešlo řešit jinak, než prznit kód.

Nahoru Odpovědět
4.2.2013 15:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
lcet.m
Člen
Avatar
Odpovídá na Kit
lcet.m:4.2.2013 18:39

Ehm, boolean je chybový stav? Ty jseš teda srandista :) Na CHYBOVÝ stav samozřejmě existuje řešení - int.Parse. Pokud TryParse vrací false, není to žádný chybový stav, ale prostá informace o tom, že vstup není textová reprezentace integeru. Tečka. Za to, že ty v tom vidíš nějaký chybový stav, .NET ani lidi co chápou out nemůžou.

 
Nahoru Odpovědět
4.2.2013 18:39
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na lcet.m
David Hartinger:4.2.2013 18:41

Ne, je to chybový stav, který je zcela špatně zaměněn za hodnotu funkce a ta se místo pomocí return vrací v parametru, čehož je násilně docíleno pomocí modifikátoru out.

Nahoru Odpovědět
4.2.2013 18:41
New kid back on the block with a R.I.P
Avatar
lcet.m
Člen
Avatar
Odpovídá na matesax
lcet.m:4.2.2013 18:53

Nevím co přesně myslíš neustálým větvením - možná něco jako je ten tvůj HTML parser? Nojono, s tím by se i souhlasit dalo.

Tobě připadá, že když metoda Try... vrací boolean, odporuje to logice?

Přátelé, nevím kolik z vás se programováním živí, a kdo jenom kecá jako Mates, ale fakt mě zaráží názory některých tady. Nikdo vás přece nenutí používat var, dynamic, ref, out, C# ani Windows. Dělejte si pokusy o parsování čísel v Try-Catch. Dokud půjde o práce do školy nebo e-shopy pro deset zákazníků, bude to asi jedno. Pokud se někdy propracujete k něčemu zajímavějšímu, praxe vás sama naučí co je nejlepší. Do té doby ale neshazujte něco, co neumíte správně používat.

A otázka na konec - jak by tedy mělo být napsáno to, co teď normální bílý muž zná jako:

Dictionary<T1, T2>.TryGetValue(T1 key, out T2 value)
 
Nahoru Odpovědět
4.2.2013 18:53
Avatar
lcet.m
Člen
Avatar
Odpovídá na David Hartinger
lcet.m:4.2.2013 18:55

Můžeš mi prosím najít, kde se v MSDN píše, že int.Parse vrací chybový stav?

Díky

 
Nahoru Odpovědět
4.2.2013 18:55
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na lcet.m
David Hartinger:4.2.2013 18:57

Java ref, out ani var nemá a jedou v ní systémy, kde je určitě více než deset uživatelů. Je to nejžádanější jazyk z ohledu businessu mimochodem :) To že jazyk něco umí neznamená, že je to dobře. Do PHP v jedné z posledních verzí také přidali GOTO :)

Nahoru Odpovědět
4.2.2013 18:57
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na lcet.m
matesax:4.2.2013 19:06

Ha - dostal jsi se! :)

Programováním se živím... :) To je sladká vůně vítězství... :) (A neplatí mne špatně...)

 
Nahoru Odpovědět
4.2.2013 19:06
Avatar
lcet.m
Člen
Avatar
lcet.m:4.2.2013 19:30

Hm. To bych vážně chtěl být tvůj zákazník, s tím co tu předvádíš.

Jasně, GOTO je úplně špatná věc, protože vždycky když jsem ho použil, tak jsem se potom ve svém kódu nedokázal vyznat a proto to používají jen jelimani a ne machři jako jsem já. Programovací jazyky ho maj proto, že je vymejšlej taky jelimani.

Osobně jsem GOTO nepoužil několik let, ale nevidím jediný důvod, proč by nemělo existovat.

Že Java ref, out ani var nemá a přesto je skvělá, přece není vůbec nic zarážejícího. Zarážející je, když si někdo vybere pro práci C# a .NET a potom se ošklíbá nad věcmi, které ten jazyk umožňuje a framework používá.

 
Nahoru Odpovědět
4.2.2013 19:30
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na lcet.m
David Hartinger:4.2.2013 19:33

Oháněl jsi se tu businessem, tak ti vysvětluji, že out a ref není nic, co business potřebuje. Jinak kromě toho zpraseného TryParse jsem to nikde v .NETu neviděl.

Nahoru Odpovědět
4.2.2013 19:33
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:4.2.2013 19:58

Proč používat třídy List, Dictionary, ternární výrazy, foreach atd., když to bussiness nepotřebuje?

Můžeme přece List a Dictionary napsat vlastní za použití pole, ternární výrazy opíšeme obyčejnou podmínkou a foreach nahradíme obyčejným cyklem...

Nahoru Odpovědět
4.2.2013 19:58
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:4.2.2013 20:05

Jak souvisí třída List s konstrukcí jazyka? Já odsud padám, vracejte si hodnoty v parametru, když se vám to líbí, třeba 10 :)

Nahoru Odpovědět
4.2.2013 20:05
New kid back on the block with a R.I.P
Avatar
lcet.m
Člen
Avatar
Odpovídá na David Hartinger
lcet.m:4.2.2013 21:41

Ale já právě vůbec neříkám, že je Java díky absenci ref a out horší nebo lepší než C#, je to prostě jiný jazyk. Jiný v hodně věcech, zdaleka ne jen v tom, že chybí možnost předávat parametry referencí. Vím toho o Javě poměrně málo, ale není to třeba dáno taky tím, že Java už hodně dávno uměla anonymní typy, navíc pojaté použitelněji než v C#, takže bylo vždy snadnější vracet z metody strukturu?

To, že jsi neviděl out jinde než v TryParse vypovídá jen o tom, že znáš .NET z rychlíku. Ale hlavně že máš názor na to, co používají jenom jelimani.

Dal jsem příklad s Dictionary.Try­GetValue a pořád čekám, že mi tu nějaký borec vysvětlí, jak to udělat bez prokletého satana out. Předem říkám, že za lepší řešení nepovažuju takové, kdy se kolekce klíčů prohledává dvakrát, nebo se při neexistujícím klíči vyhazuje výjimka.

 
Nahoru Odpovědět
4.2.2013 21:41
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:4.2.2013 21:42

Když se ti nelíbí List, tak třeba ten foreach - taky se bez něj obejdeš, když chceš, ale občas ti to může ulehčit, podobně jako ref nebo out :)

Nahoru Odpovědět
4.2.2013 21:42
https://www.facebook.com/peasantsandcastles/
Avatar
vodacek
Tvůrce
Avatar
Odpovídá na matesax
vodacek:4.2.2013 21:42

jsem rád že sem nekomerční trouba co dělá rád věci pro radost sobě i druhým

 
Nahoru Odpovědět
4.2.2013 21:42
Avatar
lcet.m
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
lcet.m:4.2.2013 21:53

No jistěěě :) Foreach používají jen jelimani, co nevědí jak dlouhou mají kolekci. A IEnumerable je stejně jen pro blbce, kteří si neumí na začátku správně alokovat pole.

For je vlastně takový while pro lemply. A while je jenom jinak zapsané goto s jedním jediným if.

Try-catch je taky taková lemplovská obezlička. Správný programátor si umí ošetřit vstupy tak, aby chyba nikdy nenastala.

Jak už jsem psal jinde - zbytečné (a obvykle neefektivní!) je úplně všechno, co je nad strojovým kódem. Jenže já tady všade možně vidím, jak se tok programu řídí výjimkami, za OOP se považuje mapování názvů kontrolních prvků na nějaké offsety podle slovníku, místo obyčejného threadu se dělá instance Timeru na jeden tick, ale ref a out, to slušný člověk nepoužije protože to Java taky nemá. Ha ha ha.

 
Nahoru Odpovědět
4.2.2013 21:53
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:5.2.2013 9:55

Foreach se překládá takto (pseudokód):

interator = kolekce.GetIterator();
while ((item = iterator.MoveNext()) != null)
{
...
}

Nedochází zde k žádnému narušení principů objektově orientovaného programování, je to jen zjednodušující konstrukce. Jako příklad je to úplně nesmyslné. Ref a out používají vstupní parametry funkce k výstupu a to je prasárna, protože to úplně mění původní koncepci programu. Vaše argumenty nedávají smysl, jak jsem řekl, vracejte si 10 hodnot parametry funkce když se vám to líbí.

Nahoru Odpovědět
5.2.2013 9:55
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na lcet.m
Kit:5.2.2013 9:58

Chybový stav to je, protože očekávám vstup čísla a to číslo jsem nedostal. Místo čísla dostanu jen jakýsi boolean. To číslo třeba potřebuji dosadit do vzorce, ale ten vzorec se bez čísla nemá provést ani srandistům. Musím kvůli tomu testovat hodnotu toho boolean ještě před dosazením výsledku parsování do vzorce a to je pakárna. Musím kvůli tomu zbytečně zakládat dvě proměnné.

Nahoru Odpovědět
5.2.2013 9:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:5.2.2013 10:44

Vracení hodnot přes parametry narušuje principy objektového programování? Jaké konkrétně? Nám nic takového neříkali, asi jsem chodil na špatnou školu...

Co je prasárna na vracení (částí) výsledku přes parametry? Ve výsledku se to stejně všechno předává stejným způsoběm - přes zásobník, případně přes registry.

A odpověz prosím na příspěvek m.tecla - cituji
"A otázka na konec - jak by tedy mělo být napsáno to, co teď normální bílý muž zná jako:"

Dictionary<T1, T2>.TryGetValue(T1 key, out T2 value)

Mě by to zajímalo taky :)

Kit : Když očekávám číslo a číslo to není, tak s vyhozením výjimky souhlasím. Ale co když očekávám něco, co číslo být může, ale nemusí? Pak nemůžu jeden stav oznamovat výjimkou - výsledek, že to číslo není neznamená chybu a potřebuju nějak zjistit, jestli to bylo číslo a pokud ano, tak jaké. Řešit to ve dvou funkcích - nejdřív zjištěním, jestli to číslo je a pak zjištěním, o jaké číslo se jedná není zrovna efektivní - parsovalo by se to dvakrát - lepší je rozparsovat to jednou a dát vědět, jestli je to číslo.
V tomhle případě by výjimka byla prasárna, protože bych ji používal k řízení toku programu a ne k zachytávání výjimek, protože s variantou, že to číslo není jsem počítal a jsem na to připraven, není to pro mě výjimka, ale stav.

A srandistům se některé (=ty, u kterých mi nevadí, že tu hodnotu ze stringu nemám) vzorce i bez čísla přece můžou provádět - s nějakou defaultní hodnotou, kterou si tam dosadí, když řetězec nebyl číslo .

A na co zakládat dvě proměnné, když stačí jen ta jedna, ve které je to číslo?

int number;
if (!Int32.TryParse(str, out number))
    number = 42;
else
    return; // nebo jak chci zareagovat na to, když to číslo není..
Editováno 5.2.2013 10:44
Nahoru Odpovědět
5.2.2013 10:44
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:5.2.2013 11:05

Ano, vracení výstupu vstupem překvapivě opravdu narušuje principy OOP. Místo TryGetKey bych si předtím zavolal KeyExists nebo něco podobného, případně použil výjimku jako bílý muž.

Nahoru Odpovědět
5.2.2013 11:05
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:5.2.2013 11:07

Vidíš, jak ses do toho sám zamotal. Do větve else ti to vstoupí, když to je číslo.

Pokud na vstupu očekávám volitelně číslo nebo textový řetězec, např. pokud bych dělal interpretr, asi bych raději použil tokenizer. Ten mi nebude vracet boolean, ale hotový token s rozlišením typu symbolu. Například číslo, řetězec, klíčové slovo, operátor apod.

Editováno 5.2.2013 11:10
Nahoru Odpovědět
5.2.2013 11:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 50 zpráv z 91.