¿Se considera que los tipos de anidación son una mala práctica?

7

Como lo indica el título, ¿los tipos de anidación (por ejemplo, los tipos o estructuras enumerados en una clase) se consideran una mala práctica o no? Cuando ejecuta Code Analysis en Visual Studio, devuelve el siguiente mensaje, que implica que es:

  

Advertencia 34 CA1034: Microsoft.Design:   No anidar tipo   'ClassName.StructueName'.   Alternativamente, cambiar su   accesibilidad para que no sea   visible externamente.

Sin embargo, cuando sigo la recomendación del Análisis de Código, encuentro que en la aplicación suele haber muchas estructuras y tipos enumerados que pueden aplicarse solo a una clase o que solo se usarían con esa clase. Como tal, ¿sería apropiado anidar el tipo de pecado en ese caso, o hay una mejor manera de hacerlo?

    
pregunta rjzii 11.01.2011 - 15:34

4 respuestas

15

Los tipos anidados no son malos. La advertencia que está recibiendo no sugiere que nunca tenga un tipo anidado. Simplemente indica que su tipo anidado debe usar un modificador de acceso y una ubicación de código adecuados.

Si el tipo anidado solo se usa realmente dentro de la clase contenedora (es decir, es un contenedor de datos interno o indicador de estado), entonces configure su modificador de acceso en privado.

Si el tipo anidado es parte de una o más firmas de métodos, entonces de hecho no es local para la clase contenedora. Representa un mensaje que se pasa ao desde instancias de la clase contenedora. En este caso, podría decirse que es mejor mover el tipo anidado fuera de la clase contenedora y darle un modificador de acceso más abierto, como interno o público.

En resumen, la advertencia parece recomendar que los tipos locales sean privados, y los tipos compartidos deberían ser independientes.

    
respondido por el JeremyDWill 11.01.2011 - 16:21
1

Si solo la usa esa clase, debe hacerse privada y eso es exactamente lo que sugiere el mensaje.

    
respondido por el Otávio Décio 11.01.2011 - 15:37
0

No

Un buen ejemplo en C # es IEnumerable donde otras clases no necesitan saber la clase exacta que devuelve, solo que es un IEnumerator. Por lo tanto, tiene sentido convertirlo en una clase anidada, de lo contrario, podría tener muchas clases pequeñas flotando en inteligencia que implementa IEnumerator     

respondido por el Homde 11.01.2011 - 17:28
-1

La advertencia sobre los tipos de anidamiento fue una de las primeras "sugerencias" que recibí hace un tiempo después de haber habilitado el Análisis de código. También fue la razón por la que lo apagué.

Algunas sugerencias son realmente extrañas, como si vinieran de otro planeta.

Pongo la enumeración dentro de las clases para mantener las cosas lógicamente juntas.

Piénsalo de esta manera: si los tipos de anidación hubieran sido absolutamente malos en todos los casos, ¿por qué los diseñadores de lenguajes lo habrían implementado en primer lugar? Debido a que es útil en muchos casos y en ese sentido, dicha advertencia no es más que una indicación de que algo en su código podría no ser óptimo. Si se aplica o no, depende de usted decidir.

    
respondido por el user8685 11.01.2011 - 15:39

Lea otras preguntas en las etiquetas