En el desarrollo de software (y en la programación informática en general), la reutilización de código , también llamada reutilización de software , es el uso de software existente , o conocimiento de software, para construir nuevo software, [1] [2] : 7 siguiendo los principios de reutilización .
La reutilización de código se puede lograr de diferentes maneras dependiendo de la complejidad del lenguaje de programación elegido y varía desde enfoques de nivel inferior como copiar y pegar código (por ejemplo, a través de fragmentos ), [3] funciones simples ( procedimientos o subrutinas ) o un conjunto de objetos o funciones organizados en módulos (por ejemplo, bibliotecas ) [4] [2] : 7 o espacios de nombres personalizados , y paquetes , marcos o suites de software en niveles superiores.
La reutilización de código implica dependencias que pueden dificultar el mantenimiento del código . [ cita requerida ] Al menos un estudio encontró que la reutilización de código a nivel de clase reduce la deuda técnica . [5]
La reutilización de código ad hoc se ha practicado desde los primeros días de la programación . Los programadores siempre han reutilizado secciones de código, plantillas, funciones y procedimientos. Sin embargo, la reutilización de software como un área de estudio reconocida en ingeniería de software data de 1968, cuando Douglas McIlroy de Bell Laboratories propuso basar la industria del software en componentes reutilizables.
La reutilización de código tiene como objetivo ahorrar tiempo y recursos y reducir la redundancia aprovechando los activos que ya se han creado de alguna forma dentro del proceso de desarrollo del producto de software. [6] La idea clave de la reutilización es que partes de un programa informático escrito en un momento dado pueden o deben usarse en la construcción de otros programas escritos en un momento posterior.
La reutilización de código puede implicar la creación de una versión mantenida por separado de los activos reutilizables. Si bien el código es el recurso más común seleccionado para la reutilización, otros activos generados durante el ciclo de desarrollo pueden ofrecer oportunidades de reutilización: componentes de software, suites de pruebas, diseños, documentación, etc. [7]
La biblioteca de software es un buen ejemplo de reutilización de código. Los programadores pueden decidir crear abstracciones internas para que se puedan reutilizar ciertas partes de su programa, o pueden crear bibliotecas personalizadas para su propio uso. Algunas características que hacen que el software sea más fácilmente reutilizable son la modularidad , el acoplamiento flexible , la alta cohesión , el ocultamiento de información y la separación de intereses .
Para que un código recién escrito utilice un fragmento de código existente, se debe definir algún tipo de interfaz o medio de comunicación. Estos suelen incluir una "llamada" o el uso de una subrutina , un objeto , una clase o un prototipo . En las organizaciones, estas prácticas se formalizan y estandarizan mediante la ingeniería de dominio , también conocida como ingeniería de línea de productos de software .
La práctica general de utilizar una versión anterior de un programa existente como punto de partida para la próxima versión también es una forma de reutilización de código.
Algunas de las denominadas "reutilizaciones" de código implican simplemente copiar parte o la totalidad del código de un programa existente en uno nuevo. Si bien las organizaciones pueden obtener beneficios en cuanto al tiempo de comercialización de un nuevo producto con este enfoque, posteriormente pueden verse afectadas por muchos de los mismos problemas de duplicación de código que causa la programación de copiar y pegar .
Muchos investigadores han trabajado para hacer que la reutilización sea más rápida, más sencilla, más sistemática y una parte integral del proceso normal de programación. Estos son algunos de los principales objetivos detrás de la invención de la programación orientada a objetos , que se convirtió en una de las formas más comunes de reutilización formalizada. Una invención algo posterior es la programación genérica .
Otro método más novedoso es el uso de " generadores " de software, programas que pueden crear nuevos programas de un tipo determinado, basándose en un conjunto de parámetros que el usuario elija. Los campos de estudio de estos sistemas son la programación generativa y la metaprogramación .
En cuanto a la motivación y los factores impulsores, la reutilización puede ser:
La reutilización se puede clasificar además:
En cuanto a la forma o estructura de la reutilización, el código puede ser: [9]
La reutilización de bifurcaciones suele desaconsejarse porque es una forma de duplicación de código, que requiere que cada error se corrija en cada copia y las mejoras realizadas al código reutilizado deben fusionarse manualmente en cada copia o se vuelven obsoletas. Sin embargo, la reutilización de bifurcaciones puede tener beneficios como el aislamiento, la flexibilidad para cambiar el código reutilizado, un empaquetado, una implementación y una gestión de versiones más sencillos. [9]
La reutilización sistemática de software es una estrategia para aumentar la productividad y mejorar la calidad de la industria del software. Aunque su concepto es simple, en la práctica es difícil implementarla con éxito. Una razón que se esgrime para ello es que la reutilización de software depende del contexto en el que se implementa. Algunos problemas que deben abordarse en relación con la reutilización sistemática de software son: [10]
Un ejemplo muy común de reutilización de código es la técnica de utilizar una biblioteca de software . Muchas operaciones comunes, como convertir información entre diferentes formatos conocidos, acceder a almacenamiento externo, interactuar con programas externos o manipular información (números, palabras, nombres, ubicaciones, fechas, etc.) de formas comunes, son necesarias para muchos programas diferentes. Los autores de nuevos programas pueden utilizar el código de una biblioteca de software para realizar estas tareas, en lugar de "reinventar la rueda", escribiendo código completamente nuevo directamente en un programa para realizar una operación. Las implementaciones de bibliotecas a menudo tienen la ventaja de estar bien probadas y cubrir casos inusuales o arcanos. Las desventajas incluyen la incapacidad de ajustar detalles que pueden afectar el rendimiento o el resultado deseado, y el tiempo y el costo de adquirir, aprender y configurar la biblioteca. [11]
Un patrón de diseño es una solución general a un problema recurrente. Los patrones de diseño son más conceptuales que tangibles y pueden modificarse para adaptarse a una necesidad específica. Sin embargo, las clases abstractas y las interfaces pueden reutilizarse para implementar determinados patrones.
Los desarrolladores generalmente reutilizan grandes piezas de software a través de aplicaciones y marcos de terceros, aunque los marcos suelen ser específicos del dominio y aplicables solo a familias de aplicaciones [ cita requerida ] .
En la programación funcional, se pueden utilizar funciones de orden superior en muchos casos en los que antes se utilizaban patrones o marcos de diseño.
La retrocomputación abarca la reutilización de código, simplemente porque los programas retro se ejecutan en computadoras más antiguas o en emuladores de ellas.
En seguridad informática, la reutilización de código se emplea como método de explotación de software. [12] Cuando un atacante no puede ingresar código directamente para modificar el flujo de control de un programa, por ejemplo en presencia de defensas de inyección de código como W^X , puede redirigir el flujo de control a secuencias de código existentes en la memoria.
Algunos ejemplos de ataques de reutilización de código son el ataque de retorno a libc , la programación orientada al retorno y la programación orientada al salto. [12] [13]
Un componente, en una medida orientada a objetos, representa un conjunto de clases colaborativas (o solo una clase) y sus interfaces. Las interfaces son responsables de permitir el reemplazo de componentes. Los componentes reutilizables también se pueden aislar y sincronizar entre repositorios SCM utilizando tecnologías de administración de código fuente de componentes (CSCM). [ cita requerida ]
El concepto de "reutilización de código" también puede abarcar aplicaciones de ingeniería fuera del software. Por ejemplo, el modelado paramétrico en el diseño asistido por computadora permite crear diseños reutilizables. La estandarización da como resultado la creación de piezas interoperables que luego pueden reutilizarse en muchos contextos. [ cita requerida ]
La reutilización de código genera dependencia del componente que se reutiliza. Rob Pike opinó que "un poco de copia es mejor que un poco de dependencia". Cuando se unió a Google , la empresa estaba poniendo mucho énfasis en la reutilización de código. Cree que la base de código de Google aún sufre los resultados de esa política anterior en términos de velocidad de compilación y capacidad de mantenimiento. [14]
El código reutilizable requiere generalmente un mayor esfuerzo de escritura y diseño. Fred Brooks analiza el costo significativamente más alto asociado con ese esfuerzo en sus ensayos "The Tar Pit" y " No Silver Bullet ". La falacia es que el esfuerzo se suele dedicar sin una comprensión cuidadosa de los mecanismos a través de los cuales se recuperará ese costo. La justificación a menudo proviene de establecer paralelos incorrectos con las piezas reutilizables en un proceso de fabricación física. Incorrecto porque escribir código es análogo al diseño de un solo producto en lugar de la producción de múltiples unidades.