Projekt wyliczeń
Uwaga
Ta zawartość jest drukowana przez uprawnienie Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. 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ą małe zamknięte zestawy wyborów. 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 flag jest lista opcji.
✔️ DO używać wyliczenia do silnie typ parametrów, właściwości i zwracanych wartości reprezentujących zestawy wartości.
✔️ Czy faworyzować używanie wyliczenia zamiast stałych statycznych.
❌ NIE używaj wyliczenia do otwartych zestawów (takich jak wersja systemu operacyjnego, nazwy znajomych itp.).
❌ NIE należy podawać zarezerwowanych wartości wyliczenia, które są przeznaczone do użycia w przyszłości.
Zawsze możesz po prostu dodać wartości do istniejącego wyliczenia na późniejszym etapie. Aby uzyskać więcej informacji na temat dodawania wartości do wyliczenia, zobacz Dodawanie wartości do wyliczenia . 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ą one używane do śledzenia stanu wyliczenia zamiast być jedną z wartości z zestawu reprezentowanego przez wyliczenie.
✔️ Do podaj wartość zero w prostych wyliczeniach.
Rozważ wywołanie wartości podobnej do "Brak". Jeśli taka wartość nie jest odpowiednia dla tego konkretnego wyliczenia, najbardziej typowa wartość domyślna dla wyliczenia powinna być przypisana do bazowej wartości zero.
✔️ ROZWAŻ użycie ( Int32 wartość domyślna w większości języków programowania) jako podstawowy typ wyliczenia, chyba że zostanie spełniony dowolny z następujących warunków:
Wyliczenie to wyliczenie flag i masz więcej niż 32 flagi lub spodziewasz się, że w przyszłości będzie ich więcej.
Podstawowy typ musi być inny niż Int32 w celu łatwiejszego współdziałania z niezarządzanym kodem, który oczekuje wyliczenia o różnym rozmiarze.
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:
Oczekuje 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 DWORD
wyrównane, dlatego w wystąpieniu należy efektywnie używać wielu wyliczenia lub innych małych struktur, aby spakować mniejsze wyliczenie, aby wprowadzić różnicę, ponieważ całkowity rozmiar wystąpienia będzie zawsze zaokrąglany do DWORD
wartości .
✔️ Wyliczenie flagi nazwy DO z liczbami mnogimi lub frazami nounowymi i prostymi wyliczeniami z pojedynczymi nounami lub frazami nounowymi.
❌ 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 wyliczenia flag
✔️ ZASTOSUJ element do System.FlagsAttribute wyliczenia flagi. Nie należy stosować tego atrybutu do prostych 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Ż podanie specjalnych wartości wyliczenia 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 zero, chyba że wartość reprezentuje "wszystkie flagi są wyczyszczone" i jest odpowiednio nazwana zgodnie z następnymi wytycznymi.
✔️ DO nadaj zero wartości wyliczenia flagi None
. W przypadku wyliczenia flagi wartość musi zawsze oznaczać, że "wszystkie flagi są czyszczone".
Dodawanie wartości do wyliczenia
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 wyliczenia, pomimo małego 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 nowe i stare wartości, a następnie wycofa stary interfejs API, który powinien nadal zwracać tylko stare wartości. Dzięki temu istniejące aplikacje pozostaną zgodne.
© Części 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.
Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published oct 22, 2008 by Addison-Wesley Professional w ramach Microsoft Windows Development Series.