Extraer clase.
Cuando una clase hace el trabajo de dos, surge la incomodidad.
En su lugar, crea una clase nueva y coloca en ella los campos y métodos responsables de la funcionalidad correspondiente.
##Example
##Why Refactor
Las clases siempre empiezan siendo claras y fáciles de entender. Hacen su trabajo y, por así decirlo, se ocupan de sus propios asuntos, sin entrometerse en el trabajo de otras clases. Pero a medida que el programa crece, se añade un método y luego un campo... y, con el tiempo, algunas clases acaban desempeñando más responsabilidades de las que nunca se imaginaron.
##Benefits
-
Este método de refactorización ayudará a mantener la adhesión al Principio de responsabilidad única. El código de tus clases será más evidente y comprensible.
-
Las clases con una única responsabilidad son más fiables y tolerantes a los cambios. Por ejemplo, supón que tienes una clase responsable de diez cosas distintas. Cuando cambias esta clase para mejorarla en una cosa, te arriesgas a romperla para las otras nueve.
##How to Refactor
Antes de empezar, decide cómo quieres repartir exactamente las responsabilidades de la clase.
-
Crea una clase nueva que contenga la funcionalidad correspondiente.
-
Crea una relación entre la clase antigua y la nueva. Lo ideal es que esta relación sea unidireccional; esto permite reutilizar la segunda clase sin ningún problema. No obstante, si crees que es necesaria una relación bidireccional, siempre puedes establecerla.
-
Usa Mover campo y Mover método para cada campo y método que hayas decidido trasladar a la nueva clase. En el caso de los métodos, empieza por los privados para reducir el riesgo de cometer un gran número de errores. Intenta reubicar solo un poco cada vez y prueba los resultados después de cada traslado, para evitar una acumulación de correcciones de errores al final del todo.
Cuando hayas terminado de trasladar, echa otro vistazo a las clases resultantes. Una clase antigua con responsabilidades modificadas puede renombrarse para mayor claridad. Comprueba de nuevo si puedes deshacerte de las relaciones bidireccionales entre clases, si las hay.
-
Piensa también en la accesibilidad a la nueva clase desde el exterior. Puedes ocultar la clase por completo al cliente haciéndola privada y gestionándola mediante los campos de la clase antigua. Como alternativa, puedes hacerla pública permitiendo que el cliente cambie los valores directamente. Tu decisión aquí depende de cuán seguro sea, para el comportamiento de la clase antigua, que se hagan cambios directos inesperados en los valores de la nueva clase.