2010-05-04 19 views
6

Here's una explicación de la regla que estoy tratando de comprender. Aquí está el código simplificado que el analizador de código se quejaba:CA1034: Los tipos anidados no deberían estar visibles

Public Class CustomerSpeed 

    Public Enum ProfitTypeEnum As Integer 
     NotSpecified = 0 
     FlatAmount = 1 
     PercentOfProfit = 2 
    End Enum 

    Private _ProfitTypeEnum As ProfitTypeEnum 

    Public Sub New(ByVal profitType As ProfitTypeEnum) 

     _ProfitTypeEnum = profitType 

    End Sub 

End Class 

Si la enumeración se refiere sólo a la clase, ¿por qué es una mala cosa para que sea un tipo de contenido dentro de la clase? Parece más ordenado para mí ...

¿Alguien sabe lo que se quiere decir con la siguiente línea ?:

tipos anidados incluyen la noción de accesibilidad miembros, que algunos programadores no entienden claramente

Uso Los espacios de nombres para agrupar la clase y Enum no parecen una forma útil de resolver esta advertencia, ya que me gustaría que tanto la enumeración pertenezcan al mismo nivel padre como el nombre de la clase.

Respuesta

4

Además de los problemas de usabilidad y descubrimiento detectados en otras respuestas, también existe un problema potencial de mantenimiento. ¿Qué sucede el día en que descubres que tu enumeración también es potencialmente útil en otro lugar? Sacarlo de su clase principal sería un cambio radical, copiarlo introduciría sus propios problemas de mantenimiento y requeriría que los consumidores API lo usen con otra clase que se pone fea. ¿Por qué no evitar estos posibles problemas al evitar sistemáticamente enumeraciones anidadas?

+0

Como sabes si lees lo suficiente de lo que escribí, no compre el argumento de capacidad de descubrimiento o usabilidad, porque con Intellisense trabajando como lo hace en VS2005 en lugar de 2010, no pensé que ninguno de los dos fuera un problema.Pero su nuevo pt, estoy absolutamente de acuerdo. Lo consideré brevemente por mi cuenta, pero perdí mi enfoque, ya que no fue mencionado por nadie. Debo admitir que no tengo una defensa para esa discusión y no espero tener una más tarde, así que ... estoy convencido solo sobre esta base. Eso me parece una razón suficiente para no incrustar enumeraciones en las clases. ¡Gracias! – ChadD

1

Supongo que indica que el tipo anidado se puede confundir con la variable estática porque ambos aparecerán en intellisense (autocompletar) después del ".".

Incluso si ve BCL (Biblioteca de clases base) de .NET, todas las enumeraciones, incluso si solo se usan en una clase, no están anidadas, razón por la cual, cuando se quiere comparar o crear instancias, la clase nombres + "." + los nombres enum serán confusos como se muestra a continuación, también Microsoft tiene razón en que confundirá a las personas.

- Ejemplo

class RootClass 
{ 
    enum NestedEnum 
    { 
     StaticItem = 0  
    } 

    static string NestedString = ""; 
} 


RootClass.NestedEnum <-- represents enum, 
RootClass.NestedString <-- represents static variable 

Se trata de un tipo y otro es variable, la mayoría de las advertencias MS Código del analizador son para un mejor diseño, sin embargo, tiene una gran excepción de @George, si no te gusta, no te Úselo, solo siga adelante y deshabilite las advertencias. Ciertamente puede usar nombres de clase grande en lugar de espacios de nombres, es simplemente su elección. Pero una buena capacidad de programación se trata de cómo otros perciben tu código en lugar de lo que te gusta.

Y los espacios de nombres están ahí para organizar y, al organizar, escribimos menos, eso es todo acerca de hacer más trabajo con menos esfuerzo. Pero si te gustan los grandes nombres, nadie te detiene.

+0

¿Es más grande para escribir? Hombre, el framework .NET es un gran árbol de espacios de nombres. ¿Por qué usar espacios de nombre cuando esto hace que uno escriba más?La respuesta es: "¡Organizarlos para que puedas encontrar cosas!" ¿Por qué las enumeraciones en una clase son diferentes? Su solución recomendada es usar Namespaces para organizar. Este enfoque no reduce la cantidad de tipeo requerido, pero por alguna razón es "preferido". Entonces, en el momento de tipear tu creación, no lo compro. En cuanto a confundir el tipo anidado con un tipo estático, no estoy seguro de entender. Por tipo estático, ¿quieres decir, por ejemplo, una constante? ¡La enumeración es una constante! – ChadD

+0

Sí, me doy cuenta de que puedo desactivarlo y estoy cuestionando esto y usando el analizador de código para que pueda mejorar mis habilidades de programación. ¿Viste mi pantalla proyectada? En VS2005 intellisense hizo el tipeo para usted. No te entiendo sobre enum vs. var estático Como con cualquier método, debe mirar el tipo de retorno de la función, que se muestra en la información sobre herramientas. Puede tener una función de la Clase RootClass que devuelve un tipo de objeto anotehr, ¿sería esto confuso y deberíamos advertirle? Diablos no. MS solo necesita hacer que el intellisense funcione como lo hizo en mi elenco de pantalla publicado. Es útil ... – ChadD

+0

..feed to embed. Y su solución solución es usar espacios de nombres, por lo que su idea de escribir demasiado no se sostiene. Sospecho que probablemente tengas razón (solo porque soy una minoría) pero no creo que hayas presentado un buen caso o estoy malentendiendo. – ChadD

6

enumeraciones no se suelen colocar en la clase que los utiliza, por lo que las personas no están acostumbrados a que especifique, en la enumeración es:

Dim speed As New CustomerSpeed(CustomerSpeed.ProfitTypeEnum.FlatAmount) 

La colocación de la enumeración fuera de la clase hace que sea más fácil de usar:

Dim speed As New CustomerSpeed(ProfitTypeEnum.FlatAmount) 

La enumeración todavía está contenida en el mismo espacio de nombres que la clase. Como lo explica la explicación del análisis, debe usar espacios de nombres para agrupar miembros públicos en lugar de anidarlos entre sí.

+0

Bueno, me gusta su respuesta mejor, pero supongo que no estoy de acuerdo con usted y MS en que esta incrustación enumera en una clase es malo porque confundirá a las personas que no están acostumbradas a tener enumeraciones incrustadas en las clases. Creo que la solución es hacer obvio que la enumeración está incrustada (si ese es el caso) en lugar de adverbio en contra de ella. Me parece que esos intellisense para enums ya no son automáticos. Por ejemplo, en la primera línea de código que escribió donde instancia un nuevo obj CustomerSpeed, independientemente de si la enumeración está incrustada o no, intellisense no presenta una lista de selección estrecha – ChadD

+0

..de solo valores enum. Aunque el intellisense le muestra la jerarquía de parámetros de espacio calificada del param esperado, también podría ayudarlo al proporcionar una lista de selección de solo valores de tipo ProfitTypeEnum. Me parece que si Intellisense dio un paso atrás con VS2010 (en este caso, generalmente mejorado) – ChadD

+0

Good intellisense (además de la información de información de param proporcionada anteriormente) resolvería el problema con el usuario que no esperaba calificar la enumeración. HEY ... Solo prueba esto en el 2008. Estoy bastante seguro de que funciona en 2008, como lo describo, debería ser en 2010. – ChadD

Cuestiones relacionadas