El ejemplo que diste está realmente bien en mi opinión. Está declarando clases internas , por lo que es perfectamente sensato mantenerlas en el mismo archivo . La única forma de evitar esto sería convertir su Items
clase en una clase parcial y dividirla en varios archivos. Consideraría esta mala práctica. Mi política general para las clases anidadas es que deben ser pequeñas y privadas. Hay dos excepciones a esto:
- está diseñando un grupo de clases (más común en el objetivo-c), por lo tanto, puede ser sensato usar el enfoque de clase parcial
- necesita una enumeración que solo se utiliza con la API pública de la clase principal. En este caso, prefiero que se declare una enumeración pública dentro de la clase principal en lugar de contaminar mi espacio de nombres. El enum siendo un "enum interno" resulta efectivamente en darle un alcance bien definido.
Si formula la pregunta de manera un poco diferente y pregunta "¿Debería poner cada clase de nivel de espacio de nombres en su propio archivo", entonces mi respuesta sería "sí".
Al diseñar las clases respetamos el Principio de responsabilidad única. Leer el código se vuelve mucho más fácil si su forma sigue su semántica, por lo tanto, dividir archivos por clase es sensato.
Desde un punto de vista mecánico, tener un archivo por clase tiene varias ventajas. Puede abrir varias clases al mismo tiempo en diferentes ventanas. Esto es especialmente importante ya que ningún desarrollador serio trabaja con menos de dos pantallas. Ser capaz de tener más contexto frente a mi cabeza significa que puedo mantener más contexto en mi cabeza. (La mayoría de los IDE le permitirán abrir el mismo archivo dos veces, pero esto me resulta incómodo).
El siguiente aspecto importante es el control de origen y la fusión. Al mantener sus clases separadas, evita muchas molestias cuando se realizan cambios en el mismo archivo porque las clases separadas deben cambiarse.
Para ser brutalmente honesto, no agregue más de una clase raíz a un archivo. En mi último trabajo, había archivos con no solo múltiples clases, sino múltiples espacios de nombres y esto se extendía a las múltiples miles de líneas de código. Muy difícil de seguir.
Si hay clases que están estrechamente relacionadas, entonces nombra sus archivos de manera similar o colócalos en una subcarpeta.
La separación física de los archivos de clase ayuda (tenga en cuenta que no todo es el final) genera una separación de preocupaciones y un acoplamiento más laxo.
Por otro lado, su ejemplo no muestra más de una clase raíz. Hay varias clases anidadas (nota: intente no hacer nada de clases anidadas, pero
private
si puede diseñar esto) y esto está perfectamente bien en un solo archivo.fuente
Si los archivos son muy coherentes, por ejemplo, cuando es una alternativa a tener varios archivos muy cortos y con nombres similares, entonces puede ser una buena idea.
Por ejemplo, encuentro que cuando uso NHibernate Fluent es más fácil si lo guardo
Entity
yEntityMap
en un solo archivo, a pesar de lo que mis herramientas tengan que decir al respecto.En la mayoría de los casos, solo hace que las clases sean más difíciles de encontrar. Usar con moderación y con precaución.
fuente
En pocas palabras, sí, no es una buena forma de hacerlo y le diré por qué, un poco más tarde, cuando su solución se vuelva grande, olvidará dónde están las clases, ya que el nombre del archivo ya no representará el contenido, cuál es el nombre del archivo AnimalPersonObject.cs eso no es factible.
Claro que puede evitar esto mediante el uso de funciones en herramientas como resharper para saltar a tipos, pero 1 clase por archivo (incluidas las interfaces) es realmente la columna vertebral de cualquier código estándar que haya visto, no solo en .net sino también en java y c ++ y muchos otros lenguajes, aquellos que a menudo no tienen problemas de mantenimiento y encontrará que los desarrolladores junior tienen dificultades para comprender el código.
Casi todas las herramientas de optimización de código le dirán que mueva las clases a un archivo separado, así que para mí sí, es un olor a código y necesita un poco de impulso para neutralizarlo :)
fuente
Otro problema es que con clases muy grandes y similares en el mismo archivo, cuando no puede ver la declaración de clase en todo momento, puede terminar colocando puntos de interrupción en la clase incorrecta y preguntándose por qué no son golpeados ... grrr! :)
fuente
Básicamente, si solo necesita usar esta clase desde dentro de la clase "padre" (en términos de alcance), entonces generalmente es apropiado definirla como una clase anidada.
fuente