Esto es cosas muy básicas, pero aquí va. Encuentro que nunca puedo estar de acuerdo conmigo mismo si la manera en que yo dividí las clases grandes en más pequeñas hace que las cosas sean más fáciles de mantener o menos mantenibles. Estoy familiarizado con patrones de diseño, aunque no en detalle, y también con los conceptos de diseño orientado a objetos. Dejando a un lado todas las reglas y pautas de lujo, estoy buscando elegir tu cerebro con respecto a lo que me falta con un escenario de muestra muy simple. Esencialmente en la línea de: "... este diseño lo hará más difícil", etc ... Todas las cosas que no anticipo debido a la falta de experiencia en esencia.Cómo dividir el código en componentes ... ¿grandes clases? clases pequeñas?
Supongamos que necesita escribir una clase de estilo básica de "lector de archivos/grabadora de archivos" para procesar un determinado tipo de archivo. Llamemos al archivo un archivo YadaKungFoo. El contenido de los archivos de YadaKungFoo es esencialmente similar a los archivos de INI, pero con diferencias sutiles.
hay secciones y valores:
[Sections]
Kung,Foo
Panda, Kongo
[AnotherSection]
Yada,Yada,Yada
Subtle,Difference,Here,Yes
[Dependencies]
PreProcess,SomeStuffToPreDo
PreProcess,MoreStuff
PostProcess,AfterEight
PostProcess,TheEndIsNear
PostProcess,TheEnd
OK, por lo que este puede producir 3 clases básicas:
public class YadaKungFooFile
public class YadaKungFooFileSection
public class YadaKungFooFileSectionValue
Las dos últimas clases son esencialmente sólo las estructuras de datos con un override ToString() para escupir una lista de cadenas de valores almacenados usando un par de listas genéricas. Esto es suficiente para implementar la funcionalidad de guardado YadaKungFooFile.
Con el tiempo, el YadaYadaFile comienza a crecer. Varias sobrecargas para guardar en diferentes formatos, incluido XML, etc., y el archivo comienza a avanzar hacia 800 líneas más o menos. Ahora la pregunta real: Queremos agregar una función para validar el contenido de un archivo YadaKungFoo. La primera cosa que viene a la mente es, obviamente, para agregar:
var yada = new YadaKungFooFile("C:\Path");
var res = yada .Validate()
Y hemos terminado (incluso podemos llamar a ese método desde el constructor). El problema es que la validación es bastante complicado, y hace que la clase muy grande, por lo que deciden crear una nueva clase como esta:
var yada = new YadaKungFooFile("C:\Path");
var validator = new YadaKungFooFileValidator(yada);
var result = validator.Validate();
Ahora bien, esta muestra es, obviamente, terriblemente simple, trivial e insignificante. Cualquiera de las dos formas anteriores, probablemente no hará mucha diferencia, pero lo que no me gusta es:
- El YadaKungFooFileValidator clase y la claseYadaKungFooFile parecen estar muy fuertemente acoplados por este diseño . Parece que un cambio en una clase, probablemente provocaría cambios en la otra.
- Soy consciente de que frases como "Validador", "Controlador", "Administrador", etc. indican una clase que se preocupa por el estado de otros objetos en lugar de "su propio negocio", y por lo tanto viola la separación de principios de preocupación y envío de mensajes.
En general, creo que no tengo la experiencia para entender todos los aspectos de por qué un diseño es malo, en qué situaciones realmente no importa y qué preocupación tiene más peso: más pequeño clases o más clases cohesivas. Parecen ser requisitos contradictorios, pero tal vez estoy equivocado.Tal vez la clase de validador debe ser un objeto compuesto?
Básicamente, estoy solicitando comentarios sobre posibles beneficios/problemas que podrían surgir del diseño anterior. ¿Qué se puede hacer de manera diferente? (clase FileValidator base, interfaz FileValidator, etc. u nombre). Piense en la funcionalidad de YadaKungFooFile como siempre crece con el tiempo.
"No creo que el tamaño de una clase sea una preocupación". En teoría, estoy tentado de estar de acuerdo. En la práctica, nunca he visto una clase con más de 2000 líneas que me hayan gustado. – PeterAllenWebb
@PeterAllenWebb ... Estoy de acuerdo, pero el número de LOC no debe ser el factor decisivo, más bien la semántica de la clase debería ayudar a decidir si la clase se preocupa por una cosa o más de una cosa. En realidad, la mayoría de las clases serán pequeñas. –
@Vincent Ramdhanie LOC es un buen indicador de olor, mi regla general es que si hay más de 100 LOC en un método es sospechoso hasta que se pruebe Innocent y 500 LOC para las clases –