La reutilización de código es una muy buena idea. No es genial .
Tengo una perspectiva extraída de unos 30 años de ingeniería de software, tratando de "reutilizar".
Comencé a investigar la "reutilización de código" como tema de investigación en los años 80, después de descubrir que había reutilizado el diseño de un sistema operativo que construí a principios de los 70, para otro sistema operativo que construí a fines de los 70.
La buena parte de la reutilización del código es la capacidad de reutilizar a veces el código preexistente honesto a dios. Pero el mundo está lleno de código; como puedes encontrar lo que buscas Esto es lo que llamo la maldición de reutilización :
Soy Santa Claus (ok Código abierto), y tengo una bolsa de mil millones de componentes de software. Puedes tener cualquiera de ellos.
Buena suerte eligiendo.
Para resolver bien el problema de reutilización:
- el usuario debe especificar de alguna manera lo que necesita (funcionalidad, rendimiento, lenguaje de destino, suposiciones del entorno, ...)
- debe haber una biblioteca de código "reutilizable" que haya sido indexada de varias maneras por estos criterios potenciales
- Debe existir algún mecanismo para seleccionar los elementos candidatos (en un billón de elementos, no puede verlos todos personalmente)
- debe haber una manera de caracterizar qué tan lejos de la especificación están los candidatos elegidos
- debe existir algún proceso regular para permitir que el usuario modifique el código reutilizable elegido (esta es la mayor contribución de OOP: puede editar un componente / objeto existente anulando sus ranuras. OOP no proporciona ninguna otra ayuda).
- todo esto debe ser claramente más barato que simplemente recodificarlo
En su mayoría, lo que se ha descubierto a lo largo de los años es que para que el código sea reutilizable, debe diseñarse para ese propósito, o contiene demasiados supuestos implícitos. Las bibliotecas de reutilización de código más exitosas en realidad han sido bastante pequeñas. Podría decirse que las bibliotecas y los marcos son código "reutilizable" y son extremadamente exitosos; Java y C # tienen éxito no porque sean muy buenos lenguajes de computadora, sino porque tienen enormes bibliotecas bien diseñadas, implementadas y documentadas disponibles. Pero la gente no mira el código fuente en las bibliotecas; simplemente llaman una API bien documentada (diseñada para ser generalmente utilizable).
Lo que la reutilización de código no ha hecho (OOP tampoco) es proporcionar una mejora de órdenes de magnitud en nuestra capacidad de codificar sistemas.
Creo que la falla clave es que cualquier tipo de reutilización de código es fundamentalmente limitada porque el código tiene demasiados supuestos incorporados . Si hace que el código sea pequeño, minimiza las suposiciones, pero el costo de construir desde cero no es muy grande y las ganancias de reutilización no son efectivas. Si haces que los fragmentos de código sean enormes, son prácticamente inútiles en un nuevo contexto. Al igual que Gulliver, están atados a la playa por un millón de cuerdas pequeñas, y simplemente no puedes permitirte cortarlas todas.
En lo que deberíamos estar trabajando es en la reutilización del conocimiento para construir código . Si podemos hacer esto, entonces podemos aplicar ese conocimiento para construir el código que necesitamos, manejando el conjunto actual de suposiciones.
Para hacer esto, todavía se necesita la misma capacidad de especificación para caracterizar los componentes de software (¡todavía tiene que decir lo que quiere!). Pero luego aplica este conocimiento de "construcción" a las especificaciones para generar el código que desea.
Como comunidad, todavía no somos muy buenos en esto. Pero la gente lo hace todo el tiempo; ¿Por qué no podemos automatizarlo? Hay mucha investigación, y esto demuestra que se puede hacer en muchas circunstancias.
Una pieza clave de la maquinaria necesaria para esto son las herramientas mecánicas para aceptar "descripciones de componentes" (estos son solo documentos formales y se pueden analizar como lenguajes de programación) y aplicarles transformaciones de programa .
Los compiladores ya hacen esto: -} Y son realmente buenos en la clase de problema que abordan.
Los modelos UML con generación de código son un intento de hacer esto. No es un muy buen intento; más o menos lo que uno dice en la mayoría de los modelos UML es "Tengo datos que se ven así". Es bastante difícil generar un programa real si se deja de lado la funcionalidad.
Estoy tratando de construir sistemas prácticos de transformación de programas, una herramienta llamada DMS . Me ha distraído bastante aplicar las transformaciones del programa no tanto a las especificaciones abstractas para generar código, sino al código heredado para limpiarlo. (¡Son el mismo problema en abstracto!). (Construir tales herramientas lleva mucho tiempo; he estado haciendo esto durante 15 años y mientras tanto tienes que comer).
Pero el DMS tiene las dos propiedades clave que describí anteriormente: la capacidad de procesar especificaciones formales arbitrarias y la capacidad de capturar "conocimiento de generación de código" como transformaciones, y aplicarlas bajo demanda. Y notablemente, generamos en algunos casos especiales, algún código bastante interesante de las especificaciones; DMS se construye en gran medida utilizándose para generar su implementación. Eso nos ha permitido al menos parte de la promesa de reutilización (conocimiento): ganancias de productividad extremadamente significativas. Tengo un equipo de aproximadamente 7 personas técnicas; probablemente hemos escrito 1-2 MSLOC de "especificaciones" para DMS, pero tenemos unos 10MSLOC de código generado.
Resumen: la reutilización del conocimiento de generación es la victoria, no la reutilización del código .