Design Otázka: Jak se vypořádat s inicializaci?

hlasů
1

Předpokládejme, že máme třídu, která bude široce používán v celé (C #) kód, například třída Log. Říkají, že Log zapíše položky do XML souborů v určitém adresáři. Nyní jeden pokus přinutit uživatele k inicializovat třídu s požadované informace by bylo, aby se výchozí (bez parametrů) konstruktor soukromý a poskytne ten, který vezme logdirectory parametr. Nevýhodou na to by bylo, aby uživatel kdykoliv se něco musí být zapsán do protokolu, a proto je vytvořena instance třídy protokolu, je třeba parametr mají být poskytnuty.

Jaké další možnosti jsou k dispozici? Díky předem za vaše odpovědi.

Položena 24/03/2009 v 15:51
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
4

Čtyři možnosti (většinou pokryté, ale ne explicitně a společně):

  • Jen se volání statické a zahrnují statickou inicializaci. To je hrozné pro testování (tříd, které jsou závislé na tom), ale velmi jednoduché.

  • Použít singleton jak naznačuje většina ostatních odpovědí. To je potenciálně lepší z testovacího hlediska (můžete mít vlastní metody nahradit Singleton pouze pro testovací účely), a implementovat rozhraní pro zesměšňovat účely.

  • Používat injekce závislost: dělat vše, co potřebuje, závislost vzít v konstruktoru nebo cokoliv, a dostat své DI rámec připojit všechno nahoru. Mnohem lepší z testování pohledu, ale to není zrovna pohodlné.

  • Použijte továrnu - jako jedináček, ale odděluje implementaci ze stavby. (To může efektivně skončit jako jedináček, ale bez tolik předpokladů, že).

Odpovězeno 24/03/2009 v 16:06
zdroj uživatelem

hlasů
1

Myslím, že termín budete chtít hledat je Singleton. Nebudu psát úplně to tady - je to velmi google-schopný termín. Ale v podstatě inicializaci jednu instanci objektu kdysi jako zatížení aplikací, a poté v celé aplikaci odkazovat tentýž instance

Odpovězeno 24/03/2009 v 15:54
zdroj uživatelem

hlasů
0

Jedináček. Můžete použít statickou třídu, takže to nemusí být vytvořena. Potom, pokud máte adresář protokolu, mít výchozí cestu protokolu a možnou hodnotou Null parametr metody writelog nebo potlačené metody podpisu, jeden přijímá cestu, kdo předpokládají výchozí nastavení z konfiguračního souboru.

Odpovězeno 24/03/2009 v 15:58
zdroj uživatelem

hlasů
0

Jen aby se Logger.Log () funkci statickou hovor a mít ji odkazovat na statický člen, který má informace o adresáři. Potom stačí jen nastavit adresář infomration člen jednou, na začátku výkonu, a všechny následné volání Logger.Log () bude „prostě fungovat“.

Odpovězeno 24/03/2009 v 15:57
zdroj uživatelem

hlasů
0

Jsi tak blízko ... realizovat to jako singleton a nebudete muset inicializovat více než jednou. Stručná odpověď je vytvořit statickou veřejnou instance vaší třídy uvnitř sebe a veřejné statické metody, které buď (a) inicializuje tuto instanci, pokud je to v současné době null, nebo (b) vrátí již inicializovat instanci.

Existuje více informací, aby zvážila s Singleton, ale mělo by to dostat jste začali.

Odpovězeno 24/03/2009 v 15:55
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more