stringtranslate.com

Código de refactorización

En programación de computadoras y diseño de software , la refactorización de código es el proceso de reestructurar el código de computadora existente (cambiando la factorización) sin cambiar su comportamiento externo. La refactorización tiene como objetivo mejorar el diseño, la estructura y/o la implementación del software (sus atributos no funcionales ), preservando al mismo tiempo su funcionalidad . Las ventajas potenciales de la refactorización pueden incluir una mejor legibilidad del código y una complejidad reducida ; Estos pueden mejorar la capacidad de mantenimiento del código fuente y crear una arquitectura interna o un modelo de objetos más simple, más limpio o más expresivo para mejorar la extensibilidad . Otro objetivo potencial de la refactorización es mejorar el rendimiento; Los ingenieros de software se enfrentan al desafío constante de escribir programas que funcionen más rápido o utilicen menos memoria.

Normalmente, la refactorización aplica una serie de microrrefactorizaciones básicas estandarizadas , cada una de las cuales es (normalmente) un pequeño cambio en el código fuente de un programa de computadora que preserva el comportamiento del software o al menos no modifica su conformidad con los requisitos funcionales. Muchos entornos de desarrollo brindan soporte automatizado para realizar los aspectos mecánicos de estas refactorizaciones básicas. Si se hace bien, la refactorización de código puede ayudar a los desarrolladores de software a descubrir y corregir errores o vulnerabilidades ocultos o inactivos en el sistema al simplificar la lógica subyacente y eliminar niveles innecesarios de complejidad. Si se hace mal, puede no cumplir con el requisito de que no se cambie la funcionalidad externa y, por lo tanto, puede introducir nuevos errores.

Al mejorar continuamente el diseño del código, hacemos que trabajar con él sea cada vez más fácil. Esto contrasta marcadamente con lo que suele suceder: poca refactorización y mucha atención prestada para agregar nuevas funciones de manera oportuna. Si adquiere el hábito higiénico de refactorizar continuamente, descubrirá que es más fácil ampliar y mantener el código.

—  Joshua Kerievsky, Refactorización de patrones [1]

Motivación

La refactorización suele estar motivada al notar un olor a código . [2] Por ejemplo, el método en cuestión puede ser muy largo o puede ser casi un duplicado de otro método cercano. Una vez reconocidos, estos problemas pueden abordarse refactorizando el código fuente o transformándolo en una nueva forma que se comporte igual que antes pero que ya no "huele".

Para una rutina larga, se pueden extraer una o más subrutinas más pequeñas; o para rutinas duplicadas, la duplicación se puede eliminar y reemplazar con una función compartida. No realizar la refactorización puede resultar en la acumulación de deuda técnica ; por otro lado, la refactorización es uno de los principales medios para pagar la deuda técnica. [3]

Beneficios

Hay dos categorías generales de beneficios para la actividad de refactorización.

  1. Mantenibilidad . Es más fácil corregir errores porque el código fuente es fácil de leer y la intención de su autor es fácil de comprender. [4] Esto podría lograrse reduciendo grandes rutinas monolíticas a un conjunto de métodos individualmente concisos, bien nombrados y de un solo propósito. Esto podría lograrse moviendo un método a una clase más apropiada o eliminando comentarios engañosos.
  2. Extensibilidad . Es más fácil ampliar las capacidades de la aplicación si utiliza patrones de diseño reconocibles y proporciona cierta flexibilidad que antes no existía. [1]

La ingeniería de rendimiento puede eliminar ineficiencias en los programas, conocidas como exceso de software, que surgen de estrategias tradicionales de desarrollo de software que apuntan a minimizar el tiempo de desarrollo de una aplicación en lugar del tiempo que lleva ejecutarse. La ingeniería de rendimiento también puede adaptar el software al hardware en el que se ejecuta, por ejemplo, para aprovechar procesadores paralelos y unidades vectoriales. [5]

Desafíos

La refactorización requiere extraer la estructura del sistema de software, los modelos de datos y las dependencias dentro de la aplicación para recuperar el conocimiento de un sistema de software existente. [6] La rotación de equipos implica un conocimiento faltante o inexacto del estado actual de un sistema y sobre las decisiones de diseño tomadas por los desarrolladores salientes. Es posible que otras actividades de refactorización de código requieran un esfuerzo adicional para recuperar este conocimiento. [7] Las actividades de refactorización generan modificaciones arquitectónicas que deterioran la arquitectura estructural de un sistema de software. Este deterioro afecta a propiedades arquitectónicas como la mantenibilidad y la comprensibilidad, lo que puede conducir a un redesarrollo completo de los sistemas de software.[8]

Las actividades de refactorización de código están protegidas con inteligencia de software cuando se utilizan herramientas y técnicas que proporcionan datos sobre algoritmos y secuencias de ejecución de código. [9] Proporcionar un formato comprensible para el estado interno de la estructura del sistema de software, los modelos de datos y las dependencias entre componentes es un elemento crítico para formar una comprensión de alto nivel y luego vistas refinadas de lo que se debe modificar y cómo. [10]

Pruebas

Se deben configurar pruebas unitarias automáticas antes de refactorizar para garantizar que las rutinas sigan comportándose como se espera. [11] Las pruebas unitarias pueden aportar estabilidad incluso a refactorizaciones grandes cuando se realizan con una única confirmación atómica . Una estrategia común para permitir refactorizaciones atómicas y seguras que abarquen múltiples proyectos es almacenar todos los proyectos en un único repositorio , conocido como monorepo . [12]

Con las pruebas unitarias implementadas, la refactorización es entonces un ciclo iterativo en el que se realiza una pequeña transformación del programa , se prueba para garantizar que sea correcto y se realiza otra pequeña transformación. Si en algún momento una prueba falla, el último pequeño cambio se deshace y se repite de otra manera. A través de muchos pequeños pasos, el programa avanza desde donde estaba hasta donde desea que esté. Para que este proceso tan iterativo sea práctico, las pruebas deben ejecutarse muy rápidamente, o el programador tendría que dedicar una gran fracción de su tiempo a esperar a que finalicen las pruebas. Los defensores de la programación extrema y otros desarrollos de software ágiles describen esta actividad como una parte integral del ciclo de desarrollo de software .

Técnicas

A continuación se muestran algunos ejemplos de microrefactorizaciones; Es posible que algunos de estos solo se apliquen a ciertos idiomas o tipos de idiomas. Puede encontrar una lista más larga en el libro de refactorización de Martin Fowler [2] [ página necesaria ] y en el sitio web. [13] Muchos entornos de desarrollo brindan soporte automatizado para estas microrefactorizaciones. Por ejemplo, un programador podría hacer clic en el nombre de una variable y luego seleccionar la refactorización "Encapsular campo" desde un menú contextual . Luego, el IDE solicitará detalles adicionales, normalmente con valores predeterminados razonables y una vista previa de los cambios en el código. Después de la confirmación por parte del programador, realizaría los cambios requeridos en todo el código.

Refactorización de hardware

Si bien el término refactorización originalmente se refería exclusivamente a la refactorización de código de software, en los últimos años también se ha refactorizado código escrito en lenguajes de descripción de hardware . El término refactorización de hardware se utiliza como término abreviado para refactorización de código en lenguajes de descripción de hardware. Dado que la mayoría de los ingenieros de hardware no consideran que los lenguajes de descripción de hardware sean lenguajes de programación , [19] la refactorización de hardware debe considerarse un campo separado de la refactorización de código tradicional.

Zeng y Huss propusieron la refactorización automatizada de descripciones de hardware analógico (en VHDL-AMS ). [20] En su enfoque, la refactorización preserva el comportamiento simulado de un diseño de hardware. La medida no funcional que mejora es que el código refactorizado puede procesarse mediante herramientas de síntesis estándar, mientras que el código original no. Mike Keating, miembro de Synopsys , también ha investigado la refactorización de lenguajes de descripción de hardware digital, aunque sea manual . [21] [22] Su objetivo es hacer que los sistemas complejos sean más fáciles de entender, lo que aumenta la productividad de los diseñadores.

Historia

El primer uso conocido del término "refactorización" en la literatura publicada fue en un artículo de septiembre de 1990 de William Opdyke y Ralph Johnson . [23] Doctorado de Griswold. tesis, [24] Doctorado de Opdyke. tesis, [25] publicada en 1992, también utilizó este término. [26] Aunque la refactorización de código se ha realizado de manera informal durante décadas, el Ph.D. de 1991 de William Griswold. Esta disertación [24] es uno de los primeros trabajos académicos importantes sobre la refactorización de programas funcionales y procedimentales, seguida por la disertación de William Opdyke de 1992 [25] sobre la refactorización de programas orientados a objetos, [26] aunque toda la teoría y la maquinaria se han desarrollado desde hace mucho tiempo. han estado disponibles como sistemas de transformación de programas . Todos estos recursos proporcionan un catálogo de métodos comunes para la refactorización; Un método de refactorización tiene una descripción de cómo aplicar el método e indicadores de cuándo se debe (o no se debe) aplicar el método.

El libro de Martin Fowler Refactoring: Improving the Design of Existing Code es la referencia canónica. [¿ según quién? ]

Los términos "factorizar" y "factorizar" se han utilizado de esta manera en la comunidad Forth desde al menos principios de los años 1980. El capítulo seis del libro de Leo Brodie Thinking Forth (1984) [27] está dedicado al tema.

En programación extrema, la técnica de refactorización del método de extracción tiene esencialmente el mismo significado que factorizar Forth; dividir una "palabra" (o función ) en funciones más pequeñas y más fáciles de mantener.

Las refactorizaciones también se pueden reconstruir [28] post hoc para producir descripciones concisas de cambios de software complejos registrados en repositorios de software como CVS o SVN.

Refactorización de código automatizada

Muchos editores de software e IDE tienen soporte de refactorización automatizada. Aquí hay una lista de algunos de estos editores, o los llamados navegadores de refactorización .

Ver también

Referencias

  1. ^ ab Kerievsky, Joshua (2004). Refactorización de patrones . Addison Wesley.
  2. ^ ab Fowler, Martín (1999). Refactorización. Mejora del diseño del código existente. Addison-Wesley. págs. 63 y siguientes. ISBN 978-0-201-48567-7.
  3. ^ Suryanarayana, Girish (noviembre de 2014). "Refactorización para olores de diseño de software ". Morgan Kaufman. pag. 258.ISBN _ 978-0128013977.
  4. ^ Martín, Robert (2009). Código limpio . Prentice Hall.
  5. ^ Leiserson, Charles E.; Thompson, Neil C.; Emer, Joel S.; Kuszmaul, Bradley C.; Lampson, mayordomo W.; Sánchez, Daniel; Schardl, Tao B. (2020). "Hay mucho espacio en la cima: ¿Qué impulsará el rendimiento de la computadora después de la ley de Moore?". Ciencia . 368 (6495): eam9744. doi : 10.1126/ciencia.aam9744 . PMID  32499413.
  6. ^ Haendler, Thorsten; Neumann, Gustav (2019). "Un marco para la evaluación y formación de competencias en refactorización de software". Actas de la XI Conferencia Internacional Conjunta sobre Descubrimiento del Conocimiento, Ingeniería del Conocimiento y Gestión del Conocimiento . págs. 307–316. doi : 10.5220/0008350803070316 . ISBN 978-989-758-382-7. S2CID  204754665.
  7. ^ Nassif, Matthieu; Robillard, Martín P. (noviembre de 2017). "Revisando la pérdida de conocimientos inducida por la facturación en proyectos de software". Conferencia internacional IEEE 2017 sobre mantenimiento y evolución de software (ICSME) . págs. 261-272. doi :10.1109/ICSME.2017.64. ISBN 978-1-5386-0992-7. S2CID  13147063.
  8. ^ van Gurp, Jilles; Bosch, enero (marzo de 2002). "Erosión del diseño: problemas y causas". Revista de Sistemas y Software . 61 (2): 105-119. doi :10.1016/S0164-1212(01)00152-2.
  9. ^ Hassan, Ahmed E.; Xie, Tao (noviembre de 2010). "Inteligencia de software: el futuro de la minería de datos de ingeniería de software". En actas del taller FSE/SDP sobre el futuro de la investigación en ingeniería de software (FoSER '10) : 161–166. doi :10.1145/1882362.1882397. S2CID  3485526.
  10. ^ Novais, Renato; Santos, José Amancio; Mendonça, Manoel (2017). "Evaluación experimental de la combinación de múltiples estrategias de visualización para el análisis de la evolución del software". Revista de Sistemas y Software . 128 : 56–71. doi :10.1016/j.jss.2017.03.006.
  11. ^ Fowler, Martín (1999). Refactorización: mejorar el diseño del código existente. Lectura, MA: Addison-Wesley. ISBN 978-0201485677. OCLC  41017370.
  12. ^ Inteligente, John Ferguson (2008). Herramientas eléctricas de Java. "O'Reilly Media, Inc.". pag. 301.ISBN _ 9781491954546. Consultado el 26 de julio de 2018 .
  13. ^ ab (sin embargo, estos son solo sobre programación orientada a objetos). Técnicas de refactorización en el sitio web de refactorización de Fowler
  14. ^ Ferrante, Juana; Ottenstein, Karl J.; Warren, Joe D. (julio de 1987). "El gráfico de dependencia del programa y su uso en optimización". Transacciones ACM sobre lenguajes y sistemas de programación . ACM. 9 (3): 319–349. doi : 10.1145/24039.24041 . S2CID  505075.
  15. ^ Donglin, Linag; Harrold, MJ (noviembre de 2008). "Cortar objetos utilizando gráficos de dependencia del sistema". Actas. Conferencia internacional sobre mantenimiento de software (Cat. No. 98CB36272) . IEEE. págs. 319–349. doi :10.1109/ICSM.1998.738527. ISBN 978-0-8186-8779-2. S2CID  18160599.
  16. ^ "Reemplazar el código de verificación de tipo con Estado/Estrategia".
  17. ^ "Reemplazar condicional con polimorfismo".
  18. ^ Bruntink, Magiel y col. "Una evaluación de técnicas de detección de clones para preocupaciones transversales". Mantenimiento de software, 2004. Actas. 20ª Conferencia Internacional IEEE sobre. IEEE, 2004.
  19. ^ Lenguajes de descripción de hardware #HDL y lenguajes de programación
  20. ^ Kaiping Zeng, Sorin A. Huss, "Refinamientos de la arquitectura mediante la refactorización de código de modelos VHDL-AMS de comportamiento". ISCAS 2006
  21. ^ M. Keating: "Complejidad, abstracción y los desafíos del diseño de sistemas complejos", en el tutorial de DAC'08 [1] Archivado el 28 de marzo de 2016 en Wayback Machine "Reducir la brecha de verificación: C ++ a RTL para un diseño práctico"
  22. ^ M. Keating, P. Bricaud: Manual de metodología de reutilización para diseños de sistemas en un chip , Kluwer Academic Publishers, 1999.
  23. ^ Opdyke, William F .; Johnson, Ralph E. (septiembre de 1990). "Refactorización: una ayuda en el diseño de marcos de aplicaciones y sistemas orientados a objetos en evolución". Actas del Simposio sobre programación orientada a objetos con énfasis en aplicaciones prácticas (SOOPPA) . ACM.
  24. ^ ab Griswold, William G (julio de 1991). Reestructuración de programas como ayuda al mantenimiento del software (PDF) (tesis doctoral). Universidad de Washington . Consultado el 24 de diciembre de 2011 .
  25. ^ ab Opdyke, William F (junio de 1992). Refactorización de marcos orientados a objetos (tesis doctoral). Universidad de Illinois en Urbana-Champaign. Archivado desde el original el 16 de diciembre de 2019 . Consultado el 12 de febrero de 2008 .{{cite thesis}}: Mantenimiento CS1: bot: estado de la URL original desconocido ( enlace )
  26. ^ ab "Martin Fowler", MF Bliki: EtymologyOfRefactoring"".
  27. ^ Brodie, Leo (2004). Pensando en el futuro. Prensa de hoja de parra, adelante interés. págs. 171-196. ISBN 0-9764587-0-5. Archivado desde el original el 16 de diciembre de 2005 . Consultado el 3 de mayo de 2020 .
  28. ^ Sokolov, Andriy. "¿Qué es la refactorización de código?".
  29. ^ "Novedades de Xcode 9".
  30. ^ "Refactorización en Qt Creator".

Otras lecturas

enlaces externos