7 técnicas de refactorización de código en ingeniería de software

Siendo desarrollador, ¿cómo empiezas a trabajar en un nuevo proyecto…?

En primer lugar, reúne algunos requisitos básicos y luego, en función del requisito, comienza a implementar la función una por una. A medida que avanza con su proyecto y aprende más sobre él, continúa agregando y cambiando el código en su base de código. Más tarde, también cambia el código para corregir el error y los casos extremos. 

7-Code-Refactoring-Techniques-in-Software-Engineering

Pero, ¿qué sucede después de un par de días o meses…? ¿Cómo se ve tu código…? ¿Es complicado? ¿Es difícil de entender? En caso afirmativo, definitivamente no prestó atención para mejorar su código o para reestructurar su código. Es posible que haya escrito un código duplicado sin mirar el código existente o que haya escrito algunos métodos/funciones más largos, clases grandes, demasiados parámetros, nombres de variables no intuitivos, ubicación del código, etc. 

Mejorar o actualizar el código sin cambiar la funcionalidad del software o el comportamiento externo de la aplicación se conoce como refactorización de código. Reduce el costo técnico y hace que el código sea más eficiente y mantenible. Si no presta atención al proceso de refactorización de código antes, pagará los errores en su código más adelante. Así que no ignore la limpieza del código. 

En un proceso de desarrollo de software, diferentes desarrolladores tienen diferentes estilos de escritura de código. Hacen cambios, mantienen el código, amplían el código y la mayoría de las veces dejan el código sin una refactorización continua. El código no refactorizado tiende a pudrirse: mucha confusión y desorden en el código, como código duplicado, dependencias no saludables entre clases o paquetes, mala asignación de responsabilidades de clase, demasiadas responsabilidades por método o clase, etc. Para evitar todos estos problemas continuos la refactorización es importante. 

Ahora la pregunta es… ¿cuáles son las técnicas para refactorizar el código? 

Discutiremos algunas técnicas populares y comunes para refactorizar el código, pero antes de eso, analicemos algunos consejos rápidos… 

Puntas:

  • Debe realizar la refactorización de código en pequeños pasos. Realice pequeños cambios en su programa, cada uno de los pequeños cambios hace que su código sea un poco mejor y deja la aplicación en un estado de funcionamiento.
  • Ejecute la prueba TDD y CI después de realizar pequeños cambios en el proceso de refactorización. Sin ejecutar estas pruebas, crea el riesgo de introducir errores.
  • No cree ninguna característica o funcionalidad nueva durante el proceso de refactorización. Debe refactorizar el código antes de agregar actualizaciones o nuevas características en su código existente. 
  • El proceso de refactorización puede afectar los resultados de las pruebas, por lo que es bueno involucrar a su equipo de control de calidad y pruebas en el proceso de refactorización. 
  • Debe aceptar que no estará completamente satisfecho con su código. Su código refactorizado quedará obsoleto en un futuro cercano y tendrá que refactorizarlo nuevamente.

Técnicas de refactorización de código más comunes

Hay muchos enfoques y técnicas para refactorizar el código. Analicemos algunos de los más populares…

1. Refactorización rojo-verde

Red-Green es la técnica de refactorización de código más popular y ampliamente utilizada en el proceso de desarrollo de software Agile. Esta técnica sigue el enfoque de «prueba primero» para el diseño y la implementación, lo que sienta las bases para todas las formas de refactorización. Los desarrolladores toman la iniciativa para la refactorización en el ciclo de desarrollo basado en pruebas y se realiza en los tres pasos del distrito.

Red-Green-Refactoring

  • ROJO: El primer paso comienza escribiendo la «prueba roja» que falla. Te detienes y compruebas lo que hay que desarrollar.
  • Verde: en el segundo paso, escribe el código lo suficientemente simple y obtiene que el desarrollo pase la prueba «verde».
  • Refactor: en los pasos final y tercero, se enfoca en mejorar y mejorar su código manteniendo su prueba verde.

Entonces, básicamente, esta técnica tiene dos partes distintas: la primera parte consiste en escribir código que agrega una nueva función a su sistema y la segunda parte se trata de refactorizar el código que realiza esta función. Tenga en cuenta que no debe hacer ambas cosas al mismo tiempo durante el flujo de trabajo.

2. Refactorización por abstracción

Los desarrolladores utilizan principalmente esta técnica cuando es necesario realizar una gran cantidad de refactorización. Principalmente usamos esta técnica para reducir la redundancia (duplicación) en nuestro código. Esto implica herencias de clases, jerarquía, creación de nuevas clases e interfaces, extracción, sustitución de herencia por delegación y viceversa. 

Refactoring-By-Abstraction

El método Pull-Up/Push-Down es el mejor ejemplo de este enfoque. 

  • Método Pull-Up: extrae partes del código en una superclase y ayuda a eliminar la duplicación de código.
  • Método Push-Down: toma la parte del código de una superclase y la mueve hacia abajo a las subclases.

Extraiga el cuerpo del constructor, extraiga la subclase, extraiga la superclase, contraiga la jerarquía, forme el método de la plantilla, extraiga la interfaz, reemplace la herencia con la delegación, reemplace la delegación con Herencia, presione el campo hacia abajo, todos estos son los otros ejemplos.

Básicamente, en esta técnica, construimos la capa de abstracción para aquellas partes del sistema que necesitan ser refactorizadas y la contraparte que eventualmente lo reemplazará. Dos ejemplos comunes se dan a continuación…

  • Campo encapsulado : Obligamos al código a acceder al campo con métodos getter y setter.
  • Generalizar tipo: Creamos tipos más generales para permitir compartir código, reemplazar el código de verificación de tipo con el estado, reemplazar condicional con polimorfismo, etc.

3. Método de composición

Durante la fase de desarrollo de una aplicación muchas veces escribimos métodos largos en nuestro programa. Estos métodos largos hacen que su código sea extremadamente difícil de entender y difícil de cambiar. El método de composición se utiliza principalmente en estos casos. 

En este enfoque, usamos métodos simplificados para reducir la duplicación en nuestro código. Algunos ejemplos son: método de extracción, extracción de una variable, Temp en línea, reemplazar Temp con Query, método en línea, dividir variable temporal, eliminar asignaciones a parámetros, etc.

Extracción: dividimos el código en fragmentos más pequeños para encontrar y extraer la fragmentación. Después de eso, creamos métodos separados para estos fragmentos y luego se reemplaza con una llamada a este nuevo método. La extracción involucra variables de clase, interfaz y locales. 

En línea: este enfoque elimina la cantidad de métodos innecesarios en nuestro programa. Encontramos todas las llamadas a los métodos y luego las reemplazamos con el contenido del método. Después de eso, eliminamos el método de nuestro programa.

4. Métodos de simplificación

Hay dos técnicas involucradas en este enfoque… analicemos ambas.

  • Simplificación de expresiones condicionales Refactorización: las declaraciones condicionales en programación se vuelven más lógicas y complicadas con el tiempo. Necesita simplificar la lógica en su código para comprender todo el programa. 
    Hay tantas formas de refactorizar el código y simplificar la lógica. Algunos de ellos son: consolidar la expresión condicional y duplicar fragmentos condicionales, descomponer condicional, reemplazar condicional con polimorfismo, eliminar bandera de control, reemplazar condicional anidado con cláusulas de guardia, etc.
  • Simplificación de la refactorización de llamadas a métodos: en este enfoque, hacemos que las llamadas a métodos sean más simples y fáciles de entender. Trabajamos la interacción entre clases y les simplificamos las interfaces. 
    Los ejemplos son: agregar, eliminar e introducir nuevos parámetros, reemplazar el parámetro con el método explícito y la llamada al método, parametrizar el método, hacer una consulta separada del modificador, conservar todo el objeto, eliminar el método de configuración, etc. 

5. Mover funciones entre objetos

En esta técnica, creamos nuevas clases y movemos la funcionalidad de forma segura entre las clases antiguas y las nuevas. Ocultamos los detalles de implementación del acceso público. 

Ahora la pregunta es… ¿cuándo mover la funcionalidad entre clases o cómo identificar que es hora de mover las funciones entre clases?

Cuando descubre que una clase tiene tantas responsabilidades y suceden demasiadas cosas o cuando descubre que una clase es innecesaria y no hace nada en una aplicación, puede mover el código de esta clase a otra clase y eliminarlo por completo. 

Los ejemplos son: mover un campo, extraer una clase, mover un método, una clase en línea, ocultar un delegado, introducir un método externo, eliminar al intermediario, introducir una extensión local, etc.

6. Refactorización preparatoria

Es mejor usar este enfoque cuando nota la necesidad de refactorizar al agregar algunas características nuevas en una aplicación. Básicamente, es parte de una actualización de software con un proceso de refactorización independiente. Se ahorra una futura deuda técnica si observa que el código debe actualizarse durante las primeras fases del desarrollo de funciones. 

El usuario final no puede ver los esfuerzos del equipo de ingeniería cara a cara, pero los desarrolladores que trabajan en la aplicación encontrarán el valor de refactorizar el código cuando están construyendo la aplicación. Pueden ahorrar tiempo, dinero y otros recursos si dedican algo de tiempo a actualizar el código antes. 

“Es como si quisiera ir 100 millas al este, pero en lugar de caminar por el bosque, voy a conducir 20 millas al norte hasta la autopista y luego voy a ir 100 millas al este a tres veces la velocidad que podría tener. si fuera directamente allí. Cuando las personas te presionan para que vayas directamente allí, a veces necesitas decir: ‘Espera, necesito revisar el mapa y encontrar la ruta más rápida’. La refactorización preparatoria hace eso por mí”.

Jessica Kerr (desarrolladora de software)

Preparatory-Refactoring

7. Refactorización de la interfaz de usuario

Puede realizar cambios simples en la interfaz de usuario y refactorizar el código. Por ejemplo: alinear el campo de entrada, aplicar fuente, reformular en voz activa, indicar el formato, aplicar tamaño de botón común y aumentar el contraste de color, etc.

Ultimas palabras

Debe considerar el proceso de refactorización de código como limpiar la casa ordenada. El desorden innecesario en un hogar puede crear un ambiente caótico y estresante. Lo mismo ocurre con el código escrito. Un código limpio y bien organizado siempre es fácil de cambiar, fácil de entender y fácil de mantener. No enfrentará dificultades más adelante si presta atención al proceso de refactorización del código anteriormente. 

Dos de los desarrolladores de software más influyentes, Martin Fowler y Kent Beck , han dedicado su tiempo a explicar el proceso de refactorización de código y sus técnicas. También han escrito un libro completo sobre este tema Refactoring: Improving the Design of Existing Code . Este libro describe varias técnicas de refactorización con una explicación clara de cómo trabajar en estos procesos de refactorización. Te recomendamos leer este libro si quieres profundizar en el proceso de refactorización de código.

Publicación traducida automáticamente

Artículo escrito por anuupadhyay y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *