2010-05-31 12 views
15

Co jest nie tak z używaniem klas zagnieżdżonych do grupowania stałych?Używanie klas zagnieżdżonych dla stałych?

tak:

public static class Constants 
{ 
    public static class CategoryA 
    { 
     public const string ValueX = "CatA_X"; 
     public const string ValueY = "CatA_Y"; 
    } 
    public static class CategoryB 
    { 
     public const string ValueX = "CatB_X"; 
     public const string ValueY = "CatB_Y"; 
    } 
} 

Używane tak:

Console.WriteLine(Constants.CategoryA.ValueY); 
Console.WriteLine(Constants.CategoryB.ValueX); 

Można także dokonać "Stałe" -class częściowy ...

Odpowiedz

17

Istnieje kilka guideline (aktualizacja dla fx 4.5) przeciwko publicznych zagnieżdżonych klas:

√ WOLNO używać zagnieżdżonych typów kiedy relacja między zagnieżdżonego typu i jego zewnętrznej typu jest taki, że semantyka członkiem-dostępność są pożądane .

X UNIKAĆ oferowana na zagnieżdżone typy. Jedynym wyjątkiem jest to, że zmienne typu zagnieżdżonego muszą być zadeklarowane tylko w rzadkich przypadkach, takich jak podklasy lub inne zaawansowane scenariusze dostosowywania.

X NIE używać zagnieżdżonych typów, jeśli typ jest prawdopodobne, aby odwoływać się poza zawierającej typu.

Myślę, że twój przykład pasuje do pierwszego punktu (np. Jesteś dobry).

+0

Wspaniale słyszeć, wszelkie przemyślenia na temat tego, dlaczego takie użycie nie jest bardziej rozpowszechnione - nie mogę być jedynym, który o tym pomyślał? – antirysm

+0

Być może przeceniasz przypadki użycia. Stałe są zwykle zorganizowane całkiem naturalnie wraz z ich klasami. A zajęcia nie powinny rosnąć tak duże, że ich członkowie potrzebują grupowania. –

+1

Zbyt wiele stałych jest zdecydowanie potencjalną oznaką złego projektu; jednak w moim przypadku mówimy o SharePoint, który mocno wykorzystuje stałe. – antirysm

4

Kto powiedział, że to było złe? Stałe mogą być (i są) zdefiniowane w dowolnym miejscu w hierarchii klas.

+0

Tak, myślę, że to bardzo miłe - ale nie widziałem go zrobić, więc jestem podejrzewać, że są pewne efekty uboczne ... – antirysm

+1

Myślę, że nie chodzi o stałe, ale o zagnieżdżone klasy. –

+1

Faktycznie używanie klas zagnieżdżonych Dla stałych umożliwia całkowite zastąpienie lub rozszerzenie ich dla podklas. Dodatkowa korzyść z tej koncepcji. – Aren

2

Nie mówiąc, że to co zrobił jest złe, ale co z użyciem nazw zamiast tak:

namespace Constants 
{ 
    public static class CategoryA 
    { 
     public const string ValueX = "CatA_X"; 
     public const string ValueY = "CatA_Y"; 
    } 
    public static class CategoryB 
    { 
     public const string ValueX = "CatB_X"; 
     public const string ValueY = "CatB_Y"; 
    } 
} 
+0

Tak, to działałoby, gdy masz dwa poziomy - Kategoria i Wartość, ale z klasami zagnieżdżonymi możesz dodać nieskończoną liczbę poziomów; tj. Languages.English.American = "en-US". – antirysm

+0

(bez dodawania dodatkowych nazw Dodam ...) – antirysm

+1

Ale dlaczego nie dodać przestrzenie nazw? W niektórych sytuacjach, które mogą być lepsze, można dodać do pliku ns w innym pliku/złożeniu. –

Powiązane problemy