logo

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, según los requisitos, 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. Posteriormente, también cambia el código para corregir los errores y los casos extremos.



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

¿Pero qué pasa 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 reestructurarlo. Es posible que haya escrito algún 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 del código antes, pagará por los errores en su código más adelante. Así que no ignores la limpieza del código.



En un proceso de desarrollo de software, diferentes desarrolladores tienen diferentes estilos de escritura de código. Realizan cambios, mantienen el código, lo amplían y la mayoría de las veces dejan el código sin una refactorización continua. El código no refactorizado tiende a código podrido: mucho de 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, es importante la refactorización continua.

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...



Consejos:

  • Debe realizar la refactorización del código en pequeños pasos. Realice pequeños cambios en su programa, cada uno de los pequeños cambios mejora ligeramente su código y deja la aplicación en 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, se corre 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 pruebas y control de calidad 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 próximo y tendrá que refactorizarlo nuevamente.

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

Existen muchos enfoques y técnicas para refactorizar el código. Analicemos algunos populares...

1. Refactorización rojo-verde

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

Refactorización rojo-verde

  • ROJO: El primer paso comienza escribiendo la prueba roja fallida. Te detienes y compruebas lo que hay que desarrollar.
  • Verde: En el segundo paso, escribe el código más simple y consigue que el desarrollo pase la prueba ecológica.
  • Refactorizar: En el último y tercer paso, usted se concentra en mejorar y mejorar su código manteniendo su prueba verde.

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

2. Refactorización por abstracción

Esta técnica la utilizan principalmente los desarrolladores cuando es necesario realizar una gran cantidad de refactorización. Principalmente utilizamos 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 la herencia por delegación y viceversa.

Refactorización por abstracción

Pull-Up/empuje hacia abajo El método es el mejor ejemplo de este enfoque.

  • Método de dominadas: Coloca partes de código en una superclase y ayuda a eliminar la duplicación de código.
  • Método de empuje hacia abajo: Toma la parte del código de una superclase y la mueve. hacia las subclases.

Levante 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 la herencia, presione el campo hacia abajo, todos estos son 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 la reemplazará. A continuación se dan dos ejemplos comunes...

puntero de desreferencia c
  • encapsulado campo: Forzamos al código a acceder al campo con métodos getter y setter.
  • Tipo de generalización: Creamos tipos más generales para permitir compartir código, reemplazar el código de verificación de tipos con el estado, reemplazar el 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 de cambiar. En estos casos se utiliza principalmente el método de composición.

En este enfoque, utilizamos métodos optimizados para reducir la duplicación en nuestro código. Algunos ejemplos son: extraer método, extraer una variable, Temp en línea, reemplazar Temp con Consulta, 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 reemplazan 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 todas con el contenido del método. Después de eso, eliminamos el método de nuestro programa.

cómo desreferenciar un puntero en c

4. Métodos simplificadores

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

  • Simplificación de la refactorización de expresiones condicionales: Declaración condicional en programación. se vuelve más lógico y complicado con el tiempo. Necesita simplificar la lógica en su código para comprender todo el programa.
    Hay muchas formas de refactorizar el código y simplificar la lógica. Algunos de ellos son: consolidar expresiones condicionales y duplicar fragmentos condicionales, descomponer condicionales, reemplazar condicionales con polimorfismo, eliminar bandera de control, reemplazar condicionales anidados con cláusulas de protección, etc.
  • Refactorización de llamadas a métodos simplificados: En este enfoque, hacemos que las llamadas a métodos sean más simples y fáciles de entender. Trabajamos en la interacción entre clases y simplificamos las interfaces para ellas.
    Algunos 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, realizar 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 clases antiguas y 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 momento de mover las funciones entre clases?

Cuando descubre que una clase tiene tantas responsabilidades y están sucediendo 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.

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

6. Refactorización preparatoria

Es mejor utilizar este enfoque cuando note la necesidad de refactorizar mientras agrega algunas funciones nuevas en una aplicación. Básicamente, es parte de una actualización de software con un proceso de refactorización separado. Se ahorra una deuda técnica futura si nota que el código debe actualizarse durante las fases anteriores del desarrollo de funciones.

El usuario final no puede ver esos 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 creando 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 simplemente 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 Simplemente fui directamente allí. Cuando la gente te presiona para que vayas directamente allí, a veces tienes que decir: 'Espera, necesito revisar el mapa y encontrar la ruta más rápida'. La refactorización preparatoria lo hace por mí.

Jessica Kerr (Desarrollador de software)

Refactorización preparatoria

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, volver a redactar en voz activa, indicar el formato, aplicar un tamaño de botón común y aumentar el contraste de color, etc.

Ultimas palabras

Debe considerar el proceso de refactorización del código como una limpieza de la casa ordenada. El desorden innecesario en una casa 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, de entender y 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 Martín Fowler y Kent Beck han dedicado su tiempo a explicar el proceso de refactorización de código y las técnicas del mismo. También han escrito un libro completo sobre este tema. Refactorización: mejorar el diseño del código existente . Este libro describe varias técnicas de refactorización con una explicación clara de cómo trabajar en estos procesos de refactorización. Le recomendamos leer este libro si desea profundizar en el proceso de refactorización de código.