Múltiples clases en un solo archivo .cs: ¿bueno o malo? [cerrado]


30

¿Es aconsejable crear varias clases dentro de un archivo .cs o cada archivo .cs debe tener una clase individual?

Por ejemplo:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

Esquivando el hecho de que este es un mal ejemplo de buena arquitectura, ¿tiene más de una clase en un archivo .cs un olor a código?

Respuestas:


30

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 Itemsclase 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.


1
Estoy de acuerdo, pero, de nuevo, las clases internas son muy poco frecuentes en mi experiencia. Para ser justos, en realidad no hay mucho que pueda justificar realmente las clases internas, el único caso que conozco es IEnumerable classes donde realmente no se trata de la clase real siempre que pueda enumerarla. En todos los demás casos, cada clase debería tener su propio archivo. Si por ninguna otra razón debido a problemas de control de fuente.
Homde

2
Añadiría que las clases internas deberían ser una rara excepción y casi nunca deberían ser públicas.
Josh

Sí, me enseña por ser tan rápido, las clases internas están bien, sin embargo, preguntar si debe usar clases internas es otra pregunta :)
krystan honor

11

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 privatesi puede diseñar esto) y esto está perfectamente bien en un solo archivo.


3
Oh dios, eso suena terrible.

¿Porque lo preguntas? ¿Alguien te denigró y quieres preguntarte por qué?

Espera ... ¿te referías a la pequeña anécdota sobre mi último trabajo? Si es así, entendí mal y me disculpo por eso.
Jesse C. Slicer

De acuerdo completamente. Estoy trabajando en un proyecto donde la mayoría de los archivos tienen al menos 4 clases por archivo. Y algunos tienen hasta 22 clases + 1 interfaz por archivo.
L_7337

7

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 Entityy EntityMapen 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.


1
Específicamente para NHibernate fluido, encontré útil mantenerlos no solo en el mismo archivo, sino también en la misma clase. Todas mis entidades tienen una clase anidada llamada Mapa.
James Beninger el

7

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 :)


3

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! :)


-3

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.