Udostępnij za pomocą


Projektowanie wyliczeń

Uwaga / Notatka

Ta treść jest przedrukowana za zgodą Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2. wydanie. Wydanie to zostało opublikowane w 2008 roku, a książka została w pełni zmieniona w trzecim wydaniu. Niektóre informacje na tej stronie mogą być nieaktualne.

Wyliczenia są specjalnym rodzajem typu wartości. Istnieją dwa rodzaje wyliczenia: proste wyliczenia i wyliczenia flagowe.

Proste wyliczenia reprezentują niewielkie zamknięte zestawy opcji. Typowym przykładem prostego wyliczenia jest zestaw kolorów.

Wyliczenia flag są przeznaczone do obsługi operacji bitowych na wartościach wyliczenia. Typowym przykładem wyliczenia typu flagowego jest lista opcji.

✔️ DO używać wyliczenia do silnego typowania parametrów, właściwości i zwracanych wartości reprezentujących zestawy wartości.

✔️ Faworyzuj używanie wyliczenia zamiast stałych statycznych.

❌ NIE używaj enum do nieograniczonych zestawów (takich jak wersja systemu operacyjnego, nazwy znajomych itp.).

❌ NIE należy podawać zarezerwowanych wartości wyliczenia, które mają być używane w przyszłości.

Zawsze możesz po prostu dodać wartości do istniejącego wyliczenia w późniejszym czasie. Aby uzyskać więcej informacji na temat dodawania wartości do enumeracji, zobacz Dodawanie wartości do enumeracji. Zastrzeżone wartości po prostu zanieczyszczają zestaw rzeczywistych wartości i zwykle prowadzą do błędów użytkowników.

❌ UNIKAJ publicznego uwidaczniania wyliczenia z tylko jedną wartością.

Powszechną praktyką w zakresie zapewnienia przyszłej rozszerzalności interfejsów API języka C jest dodanie parametrów zarezerwowanych do podpisów metod. Takie parametry zarezerwowane można wyrazić jako wyliczenia z pojedynczą wartością domyślną. Nie należy tego robić w zarządzanych interfejsach API. Przeciążenie metody umożliwia dodawanie parametrów w przyszłych wersjach.

❌ NIE dołączaj wartości sentinel w wyliczeniach.

Chociaż czasami są one pomocne dla deweloperów platformy, wartości sentinel są mylące dla użytkowników platformy. Są używane do monitorowania stanu wyliczenia, a nie jako jedna z wartości zestawu reprezentowanego przez to wyliczenie.

✔️ Używaj wartości zerowej w prostych wyliczeniach.

Rozważ nazwanie wartości jako "Brak". Jeśli taka wartość nie jest odpowiednia dla tego konkretnego wyliczenia, najbardziej typowa wartość domyślna dla wyliczenia powinna być przypisana do wartości bazowej równej zero.

✔️ ROZWAŻ użycie Int32 jako podstawowego typu wyliczenia (jest to wartość domyślna w większości języków programowania), chyba że zostanie spełniony dowolny z następujących warunków:

  • Typ wyliczeniowy jest typem wyliczeniowym z flagami i masz więcej niż 32 flagi lub spodziewasz się, że w przyszłości będzie ich jeszcze więcej.

  • Podstawowy typ musi być inny niż Int32, aby umożliwić łatwiejszą interoperacyjność z niezarządzanym kodem, który oczekuje wyliczeń w różnych rozmiarach.

  • Mniejszy typ bazowy spowoduje znaczne oszczędności w przestrzeni. Jeśli oczekujesz, że wyliczenie będzie używane głównie jako argument przepływu sterowania, rozmiar ma niewielkie znaczenie. Oszczędności rozmiaru mogą być znaczące, jeśli:

    • Zakłada się, że wyliczenie będzie używane jako pole w bardzo często tworzonej strukturze lub klasie.

    • Oczekujesz, że użytkownicy będą tworzyć duże tablice lub kolekcje wystąpień wyliczenia.

    • Oczekujesz, że duża liczba wystąpień wyliczenia ma być serializowana.

W przypadku użycia w pamięci należy pamiętać, że obiekty zarządzane są zawsze wyrównane do DWORD, dlatego w wystąpieniu należy efektywnie używać wielu wyliczeń lub innych małych struktur, aby spakować mniejsze wyliczenia i uzyskać istotną różnicę, ponieważ całkowity rozmiar wystąpienia będzie zawsze zaokrąglany do DWORD.

✔️ Nazywaj wyliczenia flagami za pomocą rzeczowników w liczbie mnogiej lub wyrażeń rzeczownikowych oraz proste wyliczenia za pomocą rzeczowników w liczbie pojedynczej lub wyrażeń rzeczownikowych.

❌ NIE rozszerzaj System.Enum bezpośrednio.

System.Enum jest specjalnym typem używanym przez CLR do tworzenia wyliczeń zdefiniowanych przez użytkownika. Większość języków programowania udostępnia element programowania, który zapewnia dostęp do tej funkcji. Na przykład w języku C# enum słowo kluczowe jest używane do definiowania wyliczenia.

Projektowanie wyliczeń typu flag

✔️ Zastosuj System.FlagsAttribute do wyliczeń flagowych. Nie należy stosować tego atrybutu do prostego wyliczenia.

✔️ Należy użyć uprawnień dwóch dla wartości wyliczenia flagi, aby można je było swobodnie łączyć przy użyciu bitowej operacji OR.

✔️ ROZWAŻ przekazanie specjalnych wartości wyliczeniowych dla powszechnie używanych kombinacji flag.

Operacje bitowe są zaawansowaną koncepcją i nie powinny być wymagane w przypadku prostych zadań. ReadWrite jest przykładem takiej wartości specjalnej.

❌ UNIKAJ tworzenia wyliczenia flag, w których niektóre kombinacje wartości są nieprawidłowe.

❌ UNIKAJ używania wartości wyliczenia flagi, która wynosi zero, chyba że oznacza ona "wszystkie flagi są wyczyszczone" i jest odpowiednio nazwana zgodnie z kolejnymi wytycznymi.

✔️ DO nadaj wartość zerową wyliczenia typu flaga None. W przypadku wyliczenia flagi, wartość musi zawsze oznaczać, że "wszystkie flagi są wyczyszczone".

Dodawanie wartości do enumów

Bardzo często okazuje się, że należy dodać wartości do wyliczenia po jego wysłaniu. Istnieje potencjalny problem ze zgodnością aplikacji, gdy nowo dodana wartość jest zwracana z istniejącego interfejsu API, ponieważ nieprawidłowo napisane aplikacje mogą nie obsługiwać nowej wartości poprawnie.

✔️ ROZWAŻ dodanie wartości do enumów, pomimo niewielkiego ryzyka zgodności.

Jeśli masz rzeczywiste dane dotyczące niezgodności aplikacji spowodowanych przez dodatki do wyliczenia, rozważ dodanie nowego interfejsu API, który zwraca zarówno nowe, jak i stare wartości. Następnie oznacz stary interfejs API jako przestarzały, przy czym powinien on nadal zwracać tylko stare wartości. Dzięki temu istniejące aplikacje pozostaną zgodne.

© Części 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.

Przedrukowane za zgodą Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition przez Krzysztofa Cwalinę i Brada Abramsa, opublikowane 22 października 2008 przez Addison-Wesley Professional w ramach serii Microsoft Windows Development.

Zobacz także