Como su pregunta abarca mucho terreno, con muchas suposiciones, señalaré el tema de su pregunta:
¿Por qué necesitamos tantas clases en patrones de diseño
No lo hacemos. No hay una regla generalmente aceptada que diga que debe haber muchas clases en los patrones de diseño.
Hay dos guías clave para decidir dónde colocar el código y cómo dividir tus tareas en diferentes unidades de código:
- Cohesión: cualquier unidad de código (ya sea un paquete, un archivo, una clase o un método) debe pertenecer juntas . Es decir, cualquier método específico debería tener una tarea, y hacerlo bien. Cualquier clase debe ser responsable de un tema más grande (cualquiera que sea). Queremos alta cohesión.
- Acoplamiento: cualquiera de las dos unidades de código deben depender lo menos la una de la otra, especialmente no debe haber dependencias circulares. Queremos acoplamiento bajo.
¿Por qué deberían ser importantes esos dos?
- Cohesión: un método que hace muchas cosas (por ejemplo, una secuencia de comandos CGI pasada de moda que hace GUI, lógica, acceso a bases de datos, etc., todo en un largo lío de código) se vuelve difícil de manejar. Al momento de escribir, es tentador simplemente poner tu tren de pensamiento en un método largo. Esto funciona, es fácil de presentar y demás, y se puede hacer con él. El problema surge más tarde: después de unos meses, puedes olvidar lo que hiciste. Una línea de código en la parte superior puede estar a unas pocas pantallas de distancia de una línea en la parte inferior; Es fácil olvidar todos los detalles. Cualquier cambio en cualquier parte del método puede romper cualquier cantidad de comportamientos de lo complejo. Será bastante fácil refactorizar o reutilizar partes del método. Y así sucesivamente.
- Acoplamiento: cada vez que cambias una unidad de código, potencialmente rompes todas las demás unidades que dependen de ella. En lenguajes estrictos como Java, puede obtener sugerencias durante el tiempo de compilación (es decir, sobre parámetros, excepciones declaradas, etc.). Pero muchos cambios no están provocando tales (es decir, cambios de comportamiento), y otros idiomas más dinámicos no tienen tales posibilidades. Cuanto más alto sea el acoplamiento, más difícil será cambiar algo, y podría detenerse, donde es necesaria una reescritura completa para lograr algún objetivo.
Estos dos aspectos son los "controladores" básicos para cualquier opción de "dónde colocar qué" en cualquier lenguaje de programación y cualquier paradigma (no solo OO). No todo el mundo está explícitamente al tanto de ellos, y lleva tiempo, a menudo años, obtener una sensación realmente arraigada de cómo estos influyen en el software.
Obviamente, esos dos conceptos no te dicen nada sobre lo que realmente debes hacer hacer . Algunas personas se equivocan por demasiado, otras por demasiado poco. Algunos lenguajes (mirándote aquí, Java) tienden a favorecer muchas clases debido a la naturaleza extremadamente estática y pedante del lenguaje en sí (esto no es una declaración de valor, pero es lo que es). Esto se hace especialmente notable cuando lo comparas con lenguajes dinámicos y más expresivos, por ejemplo, Ruby.
Otro aspecto es que algunas personas se suscriben al enfoque ágil de solo escribir el código que es necesario en este momento , y refactorizar mucho más tarde, cuando sea necesario. En este estilo de desarrollo, no crearía un interface
cuando solo tenga una clase de implementación. Simplemente implementarías la clase concreta. Si, más tarde, necesitas una segunda clase, te refactorizarás.
Algunas personas simplemente no funcionan de esa manera. Crean interfaces (o, más generalmente, clases base abstractas) para cualquier cosa que pueda usarse de manera más general; esto lleva a una explosión de clase rápidamente.
Una vez más, hay argumentos a favor y en contra, y no importa cuál, o usted, prefiera. En su vida como desarrollador de software, se encontrará con todos los extremos, desde métodos de spaghetti largos, a través de diseños de clase ilustrados, lo suficientemente grandes, hasta esquemas de clase increíblemente volados que están muy desarrollados. A medida que adquiera más experiencia, crecerá más en roles "arquitectónicos" y podrá comenzar a influir en esto en la dirección que desee. Descubrirás un medio dorado por ti mismo, y todavía encontrarás que muchas personas no estarán de acuerdo contigo, hagas lo que hagas.
Por lo tanto, mantener una mente abierta es lo más importante aquí, y ese sería mi principal consejo para ti, ya que parece que te duele mucho el tema, a juzgar por el resto de tu pregunta ...