Avatar
Honza
Člen
Avatar
Honza:

Ahoj, začínám dělat jednu databázovou evidenci v C# (Win Forms) a chtěl bych znát vaše názory na použití statických tříd.

Na začátku jsem si vytvořil jednu staticku třídu, kde uchovávám data která používám v celé aplikaci (informace o verzi aplikace, info o uživateli, connectionstring k databázi atd., prostě nastavení aplikace). To si myslím že je ok.

Ale pak jsem tam začal nabalovat další věci jako třeba různé číselníky načtené z databáze (funguje to tak že se číselník načte až při prvním použití a uloží se na určitou dobu do cache aby se z databáze nemusel načítat při každém použití). To jsem vyřešil tak že jsem si pro různé oblasti vytvořil klasické třídy a do statické třídy jsem přidal static property s type dané třídy.

Chtěl bych jen znát vaše názory, zda není cesta do pekel mít tolik věcí jako static, protože se drží v paměti celou dobu kde je aplikace v provozu. Zas na druhou stranu jsou to věci které používám napříč celou aplikací a kdybych vždy vytvářel novou instanci dané třídy, budu muset údaje načítat znovu z databáze.

Děkuji za názory

Odpovědět 16.1.2014 8:48
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Paradise
Redaktor
Avatar
Paradise:

Pokud tam máš pár stringů, tak bych nároky na pměť moc neřešil. Přijde mi to lepší, než to třeba stále načítat ze souborů.

 
Nahoru Odpovědět 16.1.2014 10:16
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Honza
David Čápka:

Pokud chceš data z DB cachovat, tak nic nevymýšlej, ale použij DataSet a odpojenou aplikaci tak, jak je to k tomu v .NETu navržené.

Co se týče toho návrhu, tak pokud ta data potřebuješ opravdu pořád a není jich moc, je to asi ok. Na devbooku podobně ukládám článek, člena a diskuzi. Pro více než pár vlastností by ses měl zamyslet nad něčím lepším, typicky se vytvoří nějaká systémová třída, která v sobě obsahuje načtené instance jako spravceFaktur, spravcePohledavek, každá instance má v sobě data, která s ní souvisejí.

Nahoru Odpovědět  +1 16.1.2014 10:28
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Honza
Člen
Avatar
Odpovídá na David Čápka
Honza:

Díky za názor.

Aplikace jako taková je online, jen tam je pár (asi 10) malých číselníku (typicky do 20 záznamů) které používám napříč aplikací. Cache používám z důvodu abych je nenačítal při každém použití. Na druhou stanu je nechci nechat uplně offline, protože potřebuju aby se změna číselníku v databázi projevila u uživatele dřív než při restartu aplikce. Takže mám nastavenou expiraci v cache na 5 minut a daná třída si už řeší interně, zda načte data v databázi a nebo je najde v cache.

Nahoru Odpovědět 16.1.2014 10:53
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Honza
Kit:

Statika je velmi často zbytečná a vede do pekel. Značně omezuje testovatelnost aplikace, ale to si ti, kteří testy nepíší, vůbec neuvědomují.

Nahoru Odpovědět 16.1.2014 10:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Honza
Kit:

Podle mne tu cache na číselníky děláš zbytečně, protože systém si ji dělá ve vlastní režii. Nejlepší je, pokud je cache součástí databázového engine, ale už nikde jinde. Ani v objektu.

Nahoru Odpovědět 16.1.2014 11:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Honza
Člen
Avatar
Odpovídá na Kit
Honza:

Ono to je tak že statickou třídu mám jen jednu. Ty ostatní třídy (například ta která načítá číselníky) statická není. Ale dávám ji do statické property te jediné statické třídy.
Nicméně díky tomu že není statická není problém ji testovat i izolovaně.

Nahoru Odpovědět 16.1.2014 12:05
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Honza
Kit:

Problém není s testováním statické třídy, ale s testováním tříd, které jsou na statické třídě závislé. Statická třída se nedá jednoduše nahradit mockem.

Nahoru Odpovědět 16.1.2014 12:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Honza
David Čápka:

Už jsem ti psal, že abys nenačítal data při každém použití, tak se používá DataSet.

Nahoru Odpovědět 16.1.2014 14:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
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 9 zpráv z 9.