1) Tome un hilo de un caso de uso.
2) Implementarlo como antes.
3) Toma otro hilo.
4) Implementarlo como antes.
5) Busque las características comunes.
6) Factorice el código para que las características se recopilen en las funciones. Objetivo para la claridad del código. Sin globales, pasa todo.
7) Cualquier bloque de código que no esté claro, agrupe en una función también.
8) Implemente otro hilo de cualquier forma antigua, pero use sus funciones existentes si son instantáneas.
9) Una vez que esté funcionando, vuelva a factorizar para eliminar la duplicación. A estas alturas, puede descubrir que está pasando pedazos de cosas similares de una función a otra. Para eliminar la duplicación, muévala a objetos.
10) Implemente otro hilo una vez que su código sea perfecto.
11) Refactor para evitar la duplicación hasta que se aburra.
Ahora el bit OO ...
12) En este momento deberían estar surgiendo algunos roles más altos para los candidatos. Agrupe esas funciones en roles por clase.
13) Vuelva a configurar de nuevo con el objetivo de la claridad. Ninguna clase más grande que un par de páginas de código, ningún método de más de 5 líneas. Sin herencia a menos que la variación sea solo unas pocas líneas de código.
partir de este momento se puede completar un ciclo para un poco ...
14) Implementar un hilo de casos de uso de cualquier manera.
15) Refactor como el anterior. La refactorización incluye el cambio de nombre de objetos y clases a medida que evolucionan sus significados.
16) Repita hasta que se aburra.
Ahora las cosas de patrones!
Una vez que tenga un par de docenas de clases y un poco de funcionalidad en funcionamiento, puede observar que algunas clases tienen un código muy similar, pero no hay una división obvia (no, no use herencia). En este punto, consulte los libros de patrones para conocer las opciones para eliminar la duplicación. Sugerencia: probablemente quieras "Estrategia".
Los siguientes repeticiones ...
17) Implementar otro hilo de un caso de uso de cualquier manera.
18) Refactorizar métodos de hasta cinco líneas o menos, clases de hasta 2 páginas o menos (preferiblemente mucho menos), busque patrones para eliminar la duplicación de nivel superior si realmente hace que el código sea más limpio.
19) Repita hasta que sus constructores de nivel superior tengan muchos parámetros, o se encuentre usando "nuevo" mucho para crear objetos dentro de otros objetos (esto es malo).
Ahora tenemos que limpiar las dependencias. Cualquier clase que funcione no debe usar "nuevo" para crear cosas dentro de sí misma. Pasa esos sub objetos desde afuera. Las clases que no realizan trabajos mecánicos pueden usar el operador "nuevo". Simplemente ensamblan cosas, las llamaremos fábricas. Una fábrica es un papel en sí mismo. Una clase debe tener un solo rol, por lo tanto, las fábricas deben ser clases separadas.
20) Factorizar las fábricas.
Ahora repetimos de nuevo ...
21) Implementar otro hilo de un caso de uso de cualquier manera.
22) Refactorizar métodos de hasta cinco líneas o menos, clases de hasta 2 páginas o menos (preferiblemente mucho menos), busque patrones para eliminar la duplicación de nivel superior si realmente hace que el código sea más limpio, asegúrese de usar un separador clases para fábricas.
23) Repita hasta que sus clases de nivel superior tengan un número excesivo de parámetros (digamos 8+).
Probablemente ya haya terminado. De lo contrario, busque el patrón de inyección de dependencia ...
24) Cree (solo) sus clases de nivel superior con un inyector de dependencia.
Entonces puede repetir de nuevo ...
25) Implementar otro hilo de un caso de uso de cualquier forma anterior.
26) Refactorizar métodos de hasta cinco líneas o menos, clases de hasta 2 páginas o menos (preferiblemente mucho menos), buscar patrones para eliminar la duplicación de nivel superior si realmente hace que el código sea más limpio, asegúrese de usar un dispositivo por separado clases para fábricas, pasan las dependencias de nivel superior (incluidas las fábricas) a través de DI.
27) Repita.
En cualquier etapa de esta heurística es probable que desee echar un vistazo a desarrollo impulsado por prueba. Por lo menos, detendrá las regresiones mientras se refactoriza.
Obviamente, este es un proceso bastante simple, y la información contenida en el mismo no se debe aplicar a cada situación, pero me siento como Marcus lo hace bien, especialmente con respecto al proceso se debe utilizar para diseñar OO código. Después de un tiempo, comenzarás a hacerlo de forma natural, se convertirá en una segunda naturaleza. Pero mientras aprenden a hacerlo, este es un gran conjunto de pasos a seguir.
"Diseño OOPS" es un término extraño y divertido, sugeriría usar el mejor "diseño OO" o simplemente "OOD" en su lugar. –
@Peter: Bueno, creo que la mayoría de nosotros hemos escrito un montón de código que solo puede describirse como un "diseño extraño";) – jalf
@jalf, oh sí :-) Aunque no estoy seguro de que el OP signifique ese tipo de hazañas ;-) –