Simplify tuple types using aliases

To som sa dnes zasa rozpísal. Trošku o Vision Pro, trošku o budúcnosti AI, a tým som veru neskončil. @vlkodotnet Udalosť týždňa: Apple Vision Pro Po dlhej dobe je tu konečne kontroverzný produkt. A môžete si z neho robiť srandu, polemizovať nad jeho zbytočnosťou, vysokou cenou od 3500 dolárov. Aj


Toto je sprievodná diskusia k pôvodnej téme na https://blog.vyvojari.dev/simplify-tuple-types-using-aliases
1 Like

Je to mimo scope blog postu.

Ale pri tom kode ma hned napadlo, ze by pre mna bolo lepsie pouzit record (lebo ma aj automaticky deconstruct). Samozrejme ta kolekcia by bol problem.

Určite. V kontexte môjho príkladu (a pravdepodobne aj mnohých ďalších) dáva väčší zmysel použiť records (ak to niekto použije na úrovní global using tak už naozaj nie je o čom :grinning:)

Ale je za mňa viacero cases kde to dáva zmysel. Len sa mi ich nepodarila zhmotniť do rozumného príkladu :joy:

Vedel by si aspon slovne opisat ake?

Lebo napriklad tuples pouzivam pri privatnych/internal metodach, ale tam maju zas pomenovane membre.

Tak ako píšeš, pri privátnych metódach. Pomenované membre v tupple máš aj v tomto prípade.
Čo sa týka tých scenárov, tak sú to za mňa napríklad rôzne “parsovačky”: spracovávanie rôznych zdrojov dát, kde priebežne spracovávam dáta, transformujem, … v rámci tej triedy to robím viac menej funkcionálne a na predávanie si medzivýsledkov nie vždy chcem vytvárať extra typy a tuples sa hodia.

Čo sa týka toho, že to používam len v privátnych metódach. Tak dlho som bol celkom silne tohto názoru. Teraz by som sa ale už asi v niektorých prípadoch nechal ukecať a povolil takto pomenované tuple aj v public API nejakej triedy. (napadajú mi napríklad rôzne konfiguračné lambdy atď, kde pre rôzne parametre nie vždy dáva zmysel vytvárať triedy / recordy) Ale ešte sa to nestalo, tak neviem naisto :slightly_smiling_face:

Uz viem, ake prsacinky mi na tom vadili. A pre co je lepsie v pripade tuples na public API pouzit rekordy.

Tento kod je uplne validny a kompilovatelny, pricom je semanticky uplne zle:

using FullName = (string FirstName, string LastName);
using XyError = (string Code, string Message);

public static void Test()
{
    XyError error = GetLastError();
    SendEmail(error);
}

private static void SendEmail(FullName name)
{
    //
}

private static XyError GetLastError()
{
    throw new NotImplementedException();
}

Za mna su aliasy skor pre taketo pripady pouzitia, ked mame zlozitu genericku strukturu a cloveku sa to nechce vypisovat x-krat:

using VectorCache = System.Collections.Generic.Dictionary<MyNs.ComparatorWrapper<float, MyNs.Vector3<float>>, MyNs.CacheEntry<MyNs.Vector3<float>>>;