2010-05-31 10 views
15

¿Qué hay de malo con el uso de clases anidadas para constantes de grupo?¿Usar clases anidadas para constantes?

así:

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"; 
    } 
} 

usados ​​de esta manera:

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

También podría hacer que las "constantes" -class parcial ...

Respuesta

17

Existe cierta guideline (actualizado para fx 4.5) en contra de clases anidadas públicas:

√ NO utilizar tipos anidados cuando la relación entre el tipo anidado y su tipo exterior es tal que la semántica miembro-accesibilidad son deseables .

X EVITAR los tipos anidados expuestos públicamente. La única excepción a esto es si las variables del tipo anidado deben declararse solo en escenarios raros, como subclases u otros escenarios de personalización avanzada.

X NO use tipos anidados si el tipo es probable que se hace referencia fuera del tipo que contiene.

Creo que su ejemplo coincide con el primer punto (es decir: usted es bueno).

+0

Genial para escuchar, cualquier idea sobre por qué este uso no está más extendido. ¿No puedo ser el único que lo pensó? – antirysm

+0

Quizás sobreestimes los casos de uso. Las constantes generalmente se organizan de manera bastante natural junto con sus clases. Y las clases no deberían crecer tanto que sus miembros necesiten agruparse. –

+1

Demasiadas constantes son definitivamente un signo potencial de un mal diseño; sin embargo, en mi caso estamos hablando de SharePoint que usa constantes en gran medida. – antirysm

4

que dijeron que era malo? Las constantes se pueden (y se) definen en cualquier parte de una jerarquía de clases.

+0

Sí, creo que es bastante limpio - pero no he visto hacer así que estoy sospechando que hay algunos efectos secundarios ... – antirysm

+1

Creo que no se trata de las constantes sino de las clases anidadas. –

+1

En realidad, el uso de clases anidadas para constantes le permite anularlas por completo o ampliarlas para las subclases. Hay un beneficio adicional para el concepto. – Aren

2

no digo que lo que hizo está mal, pero ¿qué pasa con el uso de espacios de nombres en lugar de esta manera:

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

Sí, eso funcionaría cuando tiene dos niveles: Categoría y Valor pero con clases anidadas puede agregar un número infinito de niveles; es decir, Languages.Spanish.American = "en-US". – antirysm

+0

(Sin agregar espacios de nombres adicionales, debería agregar ...) – antirysm

+1

¿Pero por qué no agregar espacios de nombres? En algunas situaciones que podrían ser mejores, puede agregar un ns en otro archivo/ensamblaje. –

Cuestiones relacionadas