Návrh vlastností

Poznámka:

Tento obsah je znovu vytištěn oprávněním Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms a Patterns for Reusable .NET Libraries, 2. vydání. Tato edice byla publikována v roce 2008 a kniha byla od té doby plně upravena ve třetím vydání. Některé informace na této stránce můžou být zastaralé.

I když jsou vlastnosti technicky velmi podobné metodám, jsou poměrně odlišné z hlediska jejich scénářů použití. Měly by být považovány za inteligentní pole. Mají syntax připomínající volání polí a flexibilitu metod.

✔️ Vytvořte vlastnosti typu get-only, pokud volající nemá mít možnost změnit hodnotu vlastnosti.

Mějte na paměti, že pokud je typ vlastnosti proměnlivým referenčním typem, lze hodnotu vlastnosti změnit i v případě, že je vlastnost pouze get-only.

❌ NEPOSKYTUJTE vlastnosti určené pouze pro nastavení ani vlastnosti, u kterých má setter širší přístupnost než getter.

Nepoužívejte například vlastnosti s veřejným setterem a chráněným getterem.

Pokud metodu getter nelze poskytnout, implementujte místo toho funkci jako metodu. Zvažte zahájení názvu metody znakem Set a poté pokračujte názvem, který byste dali vlastnosti. Například AppDomain má metodu zvanou SetCachePath místo toho, aby měl vlastnost určenou pouze pro nastavení zvanou CachePath.

✔️ POSKYTNĚTE rozumné výchozí hodnoty pro všechny vlastnosti, čímž zajistíte, že výchozí hodnoty nebudou mít za následek bezpečnostní díru nebo strašně neefektivní kód.

✔️ POVOLTE nastavení vlastností v libovolném pořadí, i když to vede k dočasně neplatnému stavu objektu.

Je běžné, že dvě nebo více vlastností souvisí s bodem, kdy některé hodnoty jedné vlastnosti mohou být neplatné vzhledem k hodnotám jiných vlastností ve stejném objektu. V takových případech by měly být výjimky vyplývající z neplatného stavu odloženy, dokud objekt ve skutečnosti nepoužívá vzájemně propojené vlastnosti.

✔️ Zachovejte předchozí hodnotu, pokud setter vlastnosti vyvolá výjimku.

❌ Vyhněte se vyvolání výjimek z getterů vlastností.

Metody získávání vlastností by měly být jednoduché operace a nemají mít žádné předpoklady. Pokud getter může vyvolat výjimku, měl by pravděpodobně být přepracován tak, aby se stal metodou. Všimněte si, že toto pravidlo se nevztahuje na indexery, kdy očekáváme výjimky v důsledku ověřování argumentů.

Návrh indexované vlastnosti

Indexovaná vlastnost je speciální vlastnost, která může mít parametry a lze ji volat se speciální syntaxí podobnou indexování pole.

Indexované vlastnosti se běžně označují jako indexery. Indexery by se měly používat jenom v rozhraních API, která poskytují přístup k položkám v logické kolekci. Například řetězec je kolekce znaků a System.String byl přidán indexer pro přístup ke svým znakům.

✔️ ZVAŽTE použití indexerů k poskytování přístupu k datům uloženým v interním poli.

✔️ ZVAŽTE poskytnutí indexerů u typů představujících kolekce položek.

❌ Nepoužívejte indexované vlastnosti s více než jedním parametrem.

Pokud návrh vyžaduje více parametrů, znovu zvažte, zda vlastnost skutečně představuje přístup k logické kolekci. Pokud ne, použijte místo toho metody. Zvažte začátek názvu metody s Get nebo Set.

❌ Vyhněte se indexerům s jinými typy parametrů než System.Int32, System.Int64, System.String, System.Object nebo výčtem.

Pokud návrh vyžaduje jiné typy parametrů, důrazně přehodnotit, zda rozhraní API skutečně představuje přístup k logické kolekci. Pokud ne, použijte metodu. Zvažte začátek názvu metody s Get nebo Set.

✔️ Použijte název Item pro indexované vlastnosti, pokud není zjevně lepší název (např. viz vlastnost Chars[] na System.String).

V jazyce C# jsou indexery ve výchozím nastavení pojmenované Položka. IndexerNameAttribute lze použít k přizpůsobení tohoto názvu.

❌ NEPOSKYTUJTE indexer i metody, které jsou sémanticky ekvivalentní.

❌ Neposkytujte více než jednu sadu přetížených indexátorů v jednom typu.

To vynucuje kompilátor jazyka C#.

❌ NEPOUŽÍVEJTE nedefault indexované vlastnosti.

To vynucuje kompilátor jazyka C#.

Události oznamující změnu parametrů

Někdy je užitečné poskytnout událost, která upozorňuje uživatele na změny hodnoty vlastnosti. Například System.Windows.Forms.Control vyvolá TextChanged událost po změně hodnoty jeho Text vlastnosti.

✔️ ZVAŽTE vyvolání událostí oznámení o změnách, pokud jsou změněny hodnoty vlastností v rozhraních API vysoké úrovně (obvykle komponenty návrháře).

Pokud je pro uživatele vhodný scénář, aby věděl, kdy se vlastnost objektu mění, měl by objekt vyvolat událost oznámení o změně vlastnosti.

Není však pravděpodobné, že by stálo za režii vyvolávat takové události pro rozhraní API nízké úrovně, jako jsou základní typy nebo kolekce. Například List<T> by takové události nevyvolával, když je do seznamu přidána nová položka a změní se vlastnost Count.

✔️ ZVAŽTE vyvolání událostí oznámení o změnách, když se hodnota vlastnosti změní prostřednictvím externích sil.

Pokud se hodnota vlastnosti změní vlivem nějakého externího faktoru (jiným způsobem než voláním metod u objektu), události vyvolají indikaci pro vývojáře, že hodnota se mění a již se změnila. Dobrým příkladem je Text vlastnost ovládacího prvku textového pole. Když uživatel zadá text do objektu TextBox, hodnota vlastnosti se automaticky změní.

Části z © 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.

Přetištěno se svolením Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition od Krzysztofa Cwaliny a Brada Abramse, vydáno 22. října 2008 nakladatelstvím Addison-Wesley Professional jako součást série Microsoft Windows Development.

Viz také