Recientemente he estado leyendo un sitio web sobre el desarrollo de código limpio (no pongo un enlace aquí porque no está en inglés).
Uno de los principios anunciados por este sitio es el Principio Abierto Cerrado : cada componente de software debe estar abierto para la extensión y cerrado para la modificación. Por ejemplo, cuando hemos implementado y probado una clase, solo debemos modificarla para corregir errores o agregar nuevas funcionalidades (por ejemplo, nuevos métodos que no influyan en los existentes). La funcionalidad y la implementación existentes no deben modificarse.
Normalmente aplico este principio definiendo una interfaz I
y una clase de implementación correspondiente A
. Cuando la clase se A
ha estabilizado (implementado y probado), normalmente no lo modifico demasiado (posiblemente, para nada), es decir
- Si llegan nuevos requisitos (por ejemplo, rendimiento o una implementación totalmente nueva de la interfaz) que requieren grandes cambios en el código, escribo una nueva implementación
B
y sigo usandoA
mientrasB
no esté madura. CuandoB
está maduro, todo lo que se necesita es cambiar cómoI
se instancia. - Si los nuevos requisitos también sugieren un cambio en la interfaz, defino una nueva interfaz
I'
y una nueva implementaciónA'
. Por lo tantoI
,A
se congelan y se mantienen a la aplicación del sistema de producción, siempre y cuandoI'
yA'
no son lo suficientemente estable como para reemplazarlos.
Entonces, en vista de estas observaciones, me sorprendió un poco que la página web sugiriera el uso de refactorizaciones complejas , "... porque no es posible escribir código directamente en su forma final".
¿No hay una contradicción / conflicto entre hacer cumplir el Principio Abierto / Cerrado y sugerir el uso de refactorizaciones complejas como una mejor práctica? ¿O la idea aquí es que uno puede usar refactorizaciones complejas durante el desarrollo de una clase A
, pero cuando esa clase se haya probado con éxito, debería congelarse?