• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    EUCHRID
    EUCHRID --- ---
    Jde o to, že nechci, aby ve vyšších vrstvách s některými vlastnostmi někdo manipuloval, ale chci mu umožnit je číst. Veřejný konstruktor s takovými parametry bych dělal jen kvůli db, nikde jinde bych ho ale nechtěl dovolit použít (a tohle by řešilo problém).
    Když udělám parametrický konstruktor, a někdo mi ve vyšších vrstvách vytvoří ten objekt, tak do těch parametrů dá co chce, a tomu se potřebuji vyhnout. Neměl by tyhle položky mít možnost nijak měnit.
    Pokud je tohle to řešení, budu muset nakonec použít parametrický konstruktor, a potom děkuji za radu.
    MORMEGIL
    MORMEGIL --- ---
    EUCHRID: No dobře, ale ten odkazovaný příklad má vedle bezparametrického privátního konstruktoru i normální parametrický, který vše nastaví zcela legálně. Má ho ta tvoje třída? (Tak proč ho nepoužiješ?) Nemá ho? (Proč? Jak si představuješ, že mají legálně vzniknout její instance?)
    EUCHRID
    EUCHRID --- ---
    MORMEGIL: Ony se mají nastavovat jen, když vytahuju objekt z db, nikde jinde. Jak píšu, běžně to dělá i microsoftí EF (https://thedatafarm.com/data-access/entity-framework-private-constructors-and-private-setters/) a s Dapperem to v jiné třídě normálně funguje.
    MORMEGIL
    MORMEGIL --- ---
    EUCHRID: Nechápu, jak se tedy ty hodnoty toho objektu mají nastavovat, když má privátní settery. To je tam nějaká metoda, která jich nastavuje víc najednou, nebo se nastavují jenom v parametrickém konstruktoru nebo jak? (Pokud ten objekt tu vlastnost nastavovat vůbec nedovoluje, tak máš prostě smůlu a _chceš_ ho znásilňovat a prasárna to bude vždycky…)
    EUCHRID
    EUCHRID --- ---
    Zdravím všechny, po mnohahodinovém pátrání se obracím zde, zdali by mi někdo neporadil, nebo nenavedl správným směrem.
    V práci nemůžu používat EF, jen Dapper. Mám objekt, který má některé settery propert privátní, ale jejich hodnoty potřebuji dostat z db do toho objektu. EF to umí (jak to dělá se mi nepodařilo najít, ale nějak vyžívá privátní konstruktor), Dapper také, ale musí se shodovat názvy sloupců v db s názvy propert v objektu. Toho ale nemůžu využít, protože Dapper vyžaduje bezparametrický konstruktor a ten objekt parametry má, takže to v datové vrstvě musím sestavovat pomocí non-generic api, jak to mají popsané v dokumentaci (MojeVlastnost = row.MojeVlastnost). Což mě vrací k problému, že samozřejmě nejde vložit hodnotu z db do property s privátním setterem. Řešení, která jsem našel se mi moc nelíbí: buď to znásilnit pomocí reflexe, nebo mezi db a daný objekt vložit další třídu a slepit to v nějaké továrně (to by šlo, ale zase se musím starat o nějakou mezitřídu). Nebo to vyřešit tím, že se objekt bude umět sám uložit a načíst z db a potom je problém s přístupem vyřešen, ale byl bych raději, kdyby se o databázi starala nějaká třída k tomu určená.
    Nerad bych udělal nějakou prasárnu a fakt si tady nevím rady, ale možná se jenom špatně ptám googlu...
    Nesetkal se někdo s něčím podobným? Mohlo by mě navést i to, jak se to řeší v ado.netu?
    SUBVERSION
    SUBVERSION --- ---
    [ OFFERING WORKNABÍZÍM PRÁCI: junior C++ Software Engineer / Prague / 60000 CZK ] shanime absolventa nebo proste C++ juniora, nevite o nekom? posta pls
    TOOMIX
    TOOMIX --- ---
    Updates on .NET Core Windows Forms designer | .NET Blog
    https://devblogs.microsoft.com/dotnet/updates-on-net-core-windows-forms-designer/
    TOOMIX
    TOOMIX --- ---
    TOOMIX
    TOOMIX --- ---
    PJOTRIK
    PJOTRIK --- ---
    PJOTRIK: "tenhle code analyzer" mel byt https://github.com/SergeyTeplyakov/ErrorProne.NET , nevim co ten odkaz po ceste spolklo
    MAIMONIDES
    MAIMONIDES --- ---
    PJOTRIK: Situace, kterou to řeší je, že máš někde velký structy a předáváš si je v parametru bez refu a bereš je jako readonly a zároveň je to v něčem časově kritickym. Trochu teoretická situace.
    PJOTRIK
    PJOTRIK --- ---
    MAIMONIDES: Ja vnimam jako uzitecny i samotny fakt ze deklaruju ze parametr je "in", zvysena rychlost je fajn, ale resil bych ji jen na konkretnich mistech na hot path (a to jsem nijak nemeril).
    Chybu jsem v te souvislosti objevil jednu, netykala se ale konkretne in parametru. Na upravy jsem vyuzil tenhle code analyzer, ktery odchytil ze nekdo pouzil KeyValuePair jako klic v Dictionary.

    MORMEGIL: ale jo, smysl to dava, ale libilo by se mi kdyby kompilator umel rozlisit ty opravdu problematicky pripady a ty kde se lambda pouziva jen treba kvuli citelnosti. Na druhou stranu, to ze se tam pouziva takova konstrukce asi znamena ze to nebude nekde uvnitr vykonnostne kritickyho mista, tak se to da chapat i jako signal ze tady ten "in" parametr neni potreba.

    A u toho dynamic dispatche teda nechapu ani duvod.
    JANFROG
    JANFROG --- ---
    MORMEGIL: To je validni pohled. Pak se najdou jini, kteri jsou nastvani ze to "funguje jen nekdy" (coz je tedy pripad temer vseho v .NET ceho jsem dotkl - pravda, neni toho moc :-)

    Ja osobne radeji preferuji ortogonalitu, kam vede tenhle pristup "nejdulezitejsi je vykonostni optimalizace" je videt pekne na C++.
    Ale to jsme OT, ja jen odpovidal na MORMEGIL a MORMEGIL
    MORMEGIL
    MORMEGIL --- ---
    MAIMONIDES: Tak primární motivací je výkonnostní optimalizace (méně kopírování), úplně bych nečekal, že se tím odhalí nějaká chyba… (Jedinou možnost vidím v tom, že někdo ve struktuře předávané hodnotou něco změní, protože si myslí, že se to projeví někde jinde, ale to je vcelku obskurní scénář, řekl bych.)
    MAIMONIDES
    MAIMONIDES --- ---
    PJOTRIK: a odhalilo to zavádění jedinou chybu nebo přineslo nějakej užitek?
    MORMEGIL
    MORMEGIL --- ---
    JANFROG: Jasně, ale to mi právě přijde, že je úplně proti smyslu celé té konstrukce, sloužící k výkonnostní optimalizaci, aby se všechno předávalo bez kopírování. Pokud něco takového potřebuju, tak si to holt někde na heapu alokuju sám, zatímco pokud by mi jazyk umožnil to dělat automaticky s tím, že mi tam občas skrytě přidá nějakou alokaci nebo dokonce kopii, tak asi budu dost naštvaný, řekl bych.
    JANFROG
    JANFROG --- ---
    MORMEGIL: Tak, detaily se mohou lisit (a v tech je dabel), ale pro pristup k nelokalnim promennym lze pouzit dve metody (zjednodusene):
    1) implementacne jednodussi je alokovat tyhle promenne ve skutecnosti na heap v "tempvector" a propagovat constantni referenci na ten "tempvector"
    2) o neco slozitejsi je alokovat na stacku a detekovat situaci, kdy se lambda "ulozi do globalni promenne" (a jine pripady) a zaroven dojde k ukonceni te metody, na jejimz stacku ta promenna (promenne) byla (byly) a v tom pripade referenci "evakuovat" na heap.

    1) je jednodussi, ale platis alokaci na heap pri kazde aktivaci metody ktera to potrebuje, 2) je slozitejsi ale v pripadech kdy lambda neprezije aktivaci vnejsi metody je overhead mensi (overhead pri "evakuaci" je v pravde desivy).

    Implementoval jsem oboji zpusob, udelat 2) spravne a rychle je netrivialni (= zesedivis z toho :-), ale zda se mi, ze to vychazi vykonove lepe (ale tohle se blbe meri)
    MORMEGIL
    MORMEGIL --- ---
    JANFROG: Jak?
    JANFROG
    JANFROG --- ---
    MORMEGIL: To je IMHO resitelne...
    MORMEGIL
    MORMEGIL --- ---
    PJOTRIK: No a jak čekáš, že by tam in/ref/out parametry fungovaly? Ta proměnná někde leží (třeba na stacku nějaké funkce o pět úrovní volání výše) a ty ji použiješ v lambdě, kterou si uložíš do globální proměnné a necháš ji tam ještě hodinu, když už ta metoda, na jejímž stacku ta proměnná ležela, dávno skončila…
    Kliknutím sem můžete změnit nastavení reklam