La extensibilidad es un principio de diseño de sistemas e ingeniería de software que permite el crecimiento futuro. La extensibilidad es una medida de la capacidad de ampliar un sistema y el nivel de esfuerzo necesario para implementar la extensión. Las extensiones pueden realizarse mediante la incorporación de nuevas funciones o mediante la modificación de las existentes. El principio permite realizar mejoras sin perjudicar las funciones existentes del sistema.
Un sistema extensible es aquel cuya estructura interna y flujo de datos se ven mínimamente afectados o no se ven afectados por funcionalidades nuevas o modificadas; por ejemplo, puede que no sea necesario volver a compilar o cambiar el código fuente original cuando se cambia el comportamiento de un sistema, ya sea por parte del creador o de otros programadores. [1] Debido a que los sistemas de software tienen una larga vida útil y se modificarán para incorporar nuevas características y funcionalidades adicionales que demanden los usuarios, la extensibilidad permite a los desarrolladores expandir o agregar capacidades al software y facilita la reutilización sistemática. Algunos de sus enfoques incluyen facilidades para permitir que se inserten las rutinas de programa de los usuarios y las capacidades para definir nuevos tipos de datos, así como para definir nuevas etiquetas de marcado de formato. [2]
El diseño extensible en ingeniería de software implica aceptar que no todo se puede diseñar de antemano. En su lugar, se proporciona un marco de software ligero que permite realizar cambios. Se crean pequeños comandos para evitar perder el elemento de extensibilidad, siguiendo el principio de separar los elementos de trabajo en unidades comprensibles, con el fin de evitar los problemas tradicionales del desarrollo de software, como la baja cohesión y el alto acoplamiento , y permitir un desarrollo continuo. Aceptar el cambio es esencial para el diseño extensible, en el que las adiciones serán continuas. Cada parte del sistema será funcional con cualquier cambio, y la idea del cambio a través de la adición es el centro de todo el diseño del sistema. El diseño extensible admite la repriorización frecuente y permite que la funcionalidad se implemente en pequeños pasos a pedido, que son los principios defendidos por las metodologías ágiles y el desarrollo iterativo. La extensibilidad impone menos dependencias y más claras durante el desarrollo, así como un acoplamiento reducido y abstracciones más cohesivas, además de interfaces bien definidas. [3]
La inconstancia es la base de todo software debido a fenómenos humanos, ya que el software es una "entidad en evolución" que es desarrollada y mantenida por seres humanos, lo que produce cambios continuos en el sistema en cuanto a especificaciones e implementación del software. Los componentes de un software suelen ser desarrollados e implementados por partes no relacionadas de forma independiente. Los componentes de software adaptables son necesarios, ya que es poco probable que los componentes de proveedores externos encajen en un escenario de implementación específico listo para usar, teniendo en cuenta a terceros usuarios distintos del fabricante. Muchos sistemas de software y líneas de productos de software se derivan de un sistema base, que comparte una arquitectura de software común o, a veces, grandes partes de la funcionalidad y la implementación, pero posiblemente estén equipados con diferentes componentes que requieren un sistema base extensible. [4]
La creación de sistemas de software que se puedan ampliar de forma independiente es un desafío importante. Un sistema que se pueda ampliar de forma independiente no solo permite que dos personas desarrollen extensiones del sistema de forma independiente, sino que también permite que las dos extensiones se combinen sin una comprobación de integridad global. [5]
Hay tres formas diferentes de extensibilidad de software: extensibilidad de caja blanca, extensibilidad de caja gris y extensibilidad de caja negra, que se basan en los artefactos y en la forma en que se modifican.
En esta forma de extensibilidad, un sistema de software se puede ampliar modificando el código fuente , y es la forma más flexible y menos restrictiva. Existen dos subformas de extensibilidad, la extensibilidad de caja abierta y la extensibilidad de caja de cristal, según cómo se apliquen los cambios.
Los cambios se realizan de forma invasiva en sistemas extensibles de código abierto, es decir, se piratea directamente el código fuente original. Se requiere el código fuente disponible y la licencia del código fuente que permita la modificación. La extensibilidad de código abierto es más relevante para la corrección de errores, la refactorización de código interno o la producción de la próxima versión de un producto de software.
La extensibilidad de tipo caja de vidrio (también llamada marcos impulsados por la arquitectura) permite que un sistema de software se amplíe con el código fuente disponible, pero no permite que el código se modifique. Las extensiones deben separarse del sistema original de manera que este no se vea afectado. Un ejemplo de esta forma de extensibilidad son los marcos de aplicaciones orientados a objetos que logran la extensibilidad normalmente mediante el uso de herencia y vinculación dinámica.
En la extensibilidad de caja negra (también denominada marcos basados en datos) no se utilizan detalles sobre la implementación de un sistema para implementar implementaciones o extensiones; solo se proporcionan especificaciones de interfaz . Este tipo de enfoque es más limitado que los diversos enfoques de caja blanca. Las extensiones de caja negra se logran normalmente a través de aplicaciones de configuración del sistema o el uso de lenguajes de programación específicos de la aplicación mediante la definición de interfaces de componentes.
La extensibilidad de caja gris es un compromiso entre un enfoque de caja blanca pura y uno de caja negra pura, que no depende completamente de la exposición del código fuente. Se podría proporcionar a los programadores la interfaz de especialización del sistema que enumera todas las abstracciones disponibles para su refinamiento y especificaciones sobre cómo se deben desarrollar las extensiones. [6]
La extensibilidad y la reutilización tienen muchas propiedades en común, entre ellas, el bajo acoplamiento, la modularidad y la capacidad de los elementos de alto riesgo para construirse para muchos sistemas de software diferentes, lo que está motivado por la observación de que los sistemas de software a menudo comparten elementos comunes. La reutilización junto con la extensibilidad permiten transferir una tecnología a otro proyecto con menos tiempo de desarrollo y mantenimiento, así como una mayor confiabilidad y consistencia. [7]
Los sistemas operativos modernos admiten la extensibilidad a través de controladores de dispositivos y módulos de kernel cargables . Muchas aplicaciones modernas admiten la extensibilidad a través de complementos , lenguajes de extensión , applets , etc. La tendencia de aumentar la extensibilidad afecta negativamente a la seguridad del software. [8]
CGI es uno de los principales medios por los que los servidores web proporcionan extensibilidad. Algunas personas ven los scripts CGI como "un enorme agujero de seguridad". [9]
La definición del diccionario de extensibilidad en Wikcionario