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

Člen

Zobrazeno 41 zpráv z 91.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Nějaký odkaz na nějaký materiál, kde je to zmiňováno?
Při volání funkce ContainsKey a až pak vybrání hodnoty z kolekce bys ji prohledával dvakrát, nějaké jiné řešení?
Zamysli se nad tou větou "vracení výstupu vstupem", na takovou blbost nemusí být materiál. Jiné řešení jsem ti také uvedl. Vaříš z vody.
Spěchám do práce
V tom kódu jsem se upsal, smotal jsem dva kódy dohromady:
int number;
if (!Int32.TryParse(str, out number))
return; // pokud to není číslo a nechci ho použít v nějaké části kódu a nějak na něj reagovat
int number;
if (!Int32.TryParse(str, out number))
number = 42;
// zpracování number s defaultní hodnotou 42
Jak můžeš vidět, nikde není žádná druhá proměnná.
TryParse nepoužívám. Kde jsi tento blud vyhrabal?
Když mi int.Parse vrátí -1, tak to znamená, že jsem obdržel hodnotu -1. Chybový stav to není, je to hodnota -1. Chybou se to stane až pokud se pokusím tuto hodnotu použít třeba jako index prvku v poli.
Aha, takže ty dáš přednost dvojímu prohledávání kolekce před tím
zlým zlým škaredým out?
Jak vůbec skalní odpůrci out řeší takovéhle kešování?
private Dictionary<string, string> _chineseTranslations = new Dictionary<string, string>();
private string GetChineseTranslation(string text)
{
string translated;
if (!_chineseTranslations.TryGetValue(text, out translated))
{
translated = TranslatorServerClient.Current.TranslateToChinese(text);
_chineseTranslations.Add(text, translated);
}
return translated;
}
Opravdu bys to přepsal na try - catch, ačkoliv je jasné, že ty výjimky
se tam budou sypat každou chvíli? A co kurnik global warming - víš co
výkonu ti ty výjimky požerou? A víš co je úplně nejlepší? Že ty to TryGetValue vůbec
používat nemusíš a můžeš zůstat prasátkem - C# má to out
navíc, nesetkal jsem se s případem, kdy by to bez
něj nešlo.
Zamysli se nad tou větou "vracení výstupu vstupem", na takovou blbost nemusí být materiál. Jiné řešení jsem ti také uvedl. Vaříš z vody.
Jo. Out se to jmenuje, protože je to vstup.
Jenže pokud použiji int.Parse, nepotřebuji ani první proměnnou a nemusím tam mít ani if. Pokud očekávám na vstupu číslo a je tam něco jiného, je to chyba a je nutné s ní tak i zacházet.
Všechny parametry funkce jsou vstupem. Výstupem je výraz za klíčovým slovem "return".
Nevykrucuj se a pošli mi ten odkaz, že argumenty funkce mají být jen vstupní.
S tím TryGetValue bylo jen ukázáno, že některý věci se dají třeba řešit efektivněji s out než bez něj, kdy musíš celou kolekci projet dvakrát...
Ale ty jsi napsal, že ti TryParse vadí, protože jeho hodnotu chceš dosazovat do nějakého vzorce. A já ti říkám, že .NET opravdu nemůže za to, že ty chceš, aby byl napsaný jinak.
Skalní odpůrci "out" v uvedeném případě raději použijí databázi.
Né vždy máš data v DB.
Aha, počkat, Kit má vždy vše v DB, tak to pak ano .
TryParse mi vadí, protože nezapadá do funkcionálního stylu programování, který používám. Proto místo něj používám Parse, které touto nectností netrpí.
Ne, Out se to jmenuje protože to mění vstup na výstup, je to modifikátor.
Sakra, tys mě normálně rozsekal bravurní argumentací. Co si teď jenom
počnu? Můj svět postavený na Dictionary se zhroutil - ona se místo něj
používá databáze
A na co mění vstup ref? Na vstupovýstup?
Databáze je hodně široký pojem. Na takové záležitosti často používám NoSQL databáze. Některé z nich pracují v operační paměti a jsou rychlejší než kolekce.
Někteří lidé pracují v týmech a nemůžou si věci řešit po svém a
používat na všechno databázi a jsou nuceni používat třeba kolekce.
Ti mají smůlu .
No tím jsem chtěl Kitovi naznačit, že asi nemá smysl řešit, že metoda vrací výstup vstupem. Teď už je to ale jedno. Jsem rozsekanej a jdu si nainstalovat na Netduino SQL Server, abych se zbavil těch ošklivých Dictionary. Nebo mi tam líp poběží Oracle? Kluci, nevíte někdo?
Tato doporučení se v softwaru nazývají "best practices", měl by ses na nějaké podívat, určitě najdeš takovou i co se týče argumentů funkcí.
Proto stále čekám na nějaký odkaz, kde něco takovýho najdu, nic o argumentech jsem nenašel (byť jsem googlil jen velmi krátce), kromě zmínky, že se mám snažit, aby jich bylo co nejméně.
Když se nad tím zamyslíš, tak přijdeš na to, že každý běžný slovník v databázi na disku se při běžné práci nacachuje do RAM. Na běžném stroji (Atom 330) tak mohu přeložit cca 200 000 slov za sekundu. To bych neviděl jako moc velkou ztrátu výkonu.
Kristepane, šlo o příklad. Snažíš se stočit
konverzaci úplně mimo původní téma, což bývá ve fórech považováno za
neslušnost.
____________________
Navíc pořád nevím, jak to udělám na tom Netduinu.
U velkého množství dat si nemůžeš dovolit pokaždé všechno natahovat ze souboru do kolekce, protože to dlouho trvá a často se to tam ani nevejde. Taková data prostě musíš uložit do databáze.
Koukni třeba sem na MSDN: http://msdn.microsoft.com/…s182131.aspx
"Library architects who design for a general audience should not expect users to master working with out or ref parameters."
Další tuny názorů máš
na různých fórech, koukni třeba sem:
http://stackoverflow.com/…-a-parameter
Najdi si nějaké dobré praktiky, určitě se ti budou hodit, náhodně jsem něco našel třeba tady: http://excalibur.apache.org/…actices.html . Dále návrhové vzory a metodiky vývoje softwaru.
Na Netduinu ti dobře poběží například SQLite.
No, to víš že jo Nevadí
že nevím o čem je řeč, hlavně něco říct, že?
Netduino jsem se snadno vyhledal Googlem. Nechápu, jak na tom chceš provozovat .NET, ale SQLite na tom poběží.
Hmm, nějak jsem to přehlédl. Myslel jsem si, že je to jen kus HW, na který se dá nainstalovat cokoli. Máš bod.
Proč bych do kolekce ze souboru natahoval něco, co už tam celou dobu mám?
První odkaz:
"...the correct application of out and ref parameters requires intermediate
design and coding skills. Library architects who design for a general audience
should not expect users to master working with out or ref parameters."
"Methods that implement the Try<Something> pattern, such as Int32TryParse, do not raise this violation"
Druhý odkaz: "... but in any given instance ref and out are OK."
Třetí odkaz: tam jsem nic k tématu ref / out nenašel.
Při startu programu v kolekcích žádná data nejsou, proto je tam musíš natáhnout buď ze souboru nebo z databáze. To může být u velkého objemu zdržující a je lepší natahovat z disku jen data, která jsou v daný okamžik potřebná.
Tohle už záleží případ od případu - někdy stačí načítat všechna
data ze souboru, někdy tahat je lepší je tahat z už běžící databáze,
ale jsme už zase koukám někde úplně mimo téma.
Kdo si začal o natahování kolekcí, když už je tam má a přitom nemá?
Chlape, poslal jsem ti dokument přímo od Microsoftu, kde píší, že se to
nemá používat. Kód, který nedoporučuje používat Microsoft, bude asi
nějakým způsobem závadný. Psát kód tak, aby byl srozumitelný jen pro
experty, je špatné. Už nevím, co víc pro tebe mohu udělat, pokud neumíš
prohrávat, tak s tím ti nepomohu
Prohrávat umím, ale nebudu to dělat, když mám pravdu.
Nebo alespoň zatím nikdo nepodal žádný argument, který by potvrzoval, že
ji nemám.
Zobrazeno 41 zpráv z 91.