Casi cualquier software que "quiera" extenderse a lo largo del tiempo, por múltiples contribuyentes que no están estrechamente vinculados o coordinados, puede beneficiarse de una arquitectura de plug-in de algún tipo. Ejemplos comunes son sistemas operativos, herramientas CAD y GIS, herramientas de dibujo y manipulación de imágenes, editores de texto y procesadores de texto, IDEs, navegadores web, sistemas de gestión de contenido web y lenguaje y marcos de programación. Los complementos son la base de los sistemas extensibles.
Las arquitecturas de complementos suelen utilizar la escritura de pato . El arquitecto define un conjunto común de métodos (por ejemplo open
, close
, play
, stop
, seek
, etc.), que cada plugin entonces implementos (ya sea totalmente o en parte). Algunos métodos son obligatorios, mientras que otros pueden ser opcionales o útiles solo en casos específicos.
Cuando el programa principal se ejecuta inicialmente, verifica ./plugins
la existencia de complementos en una o más "áreas de complementos" (como directorios conocidos ). Los encontrados se cargan en el programa.
A menudo, deben existir complementos en el momento en que se ejecuta el programa principal. El núcleo de Unix y el servidor web Apache suelen funcionar de esta manera; deben reiniciarse para "ver" y usar nuevos complementos. Sin embargo, los complementos pueden ser más dinámicos; aquí el programa principal verifica periódicamente los complementos recién agregados o modificados (por ejemplo, comparando una plugins-last-loaded
marca de tiempo almacenada con la marca de tiempo "última modificación" para un directorio de complementos). El programa principal luego (re) cargaría complementos, ya sea todos, en el caso simple / ingenuo, o solo los nuevos / modificados, si es más sofisticado.
A menudo existe un requisito de "registro", ya que cada complemento no solo es código, sino que también incluye algunos metadatos que comunican cómo se integra el complemento en el conjunto. Un complemento de reproductor de música, por ejemplo, podría ser necesario para indicar qué tipo (s) de archivos puede reproducir, qué arquitectura (s) de procesador puede ejecutar, qué recursos necesita (por ejemplo, cuánta memoria necesita ser asignada) y otros atributos necesarios para que el programa principal decida qué complemento usar para reproducir qué archivo.
Los mecanismos para el registro de complementos, la carga y la interacción con el programa principal son bastante específicos del lenguaje y el marco. Debido a que hay mucha "orquestación" en curso, con algunas funciones manejadas por el programa principal y otras por sus complementos (de los cuales podría haber bastantes), configurar un programa para la extensibilidad requiere cuidado y consideración, y una vista arquitectónica del programa como "un sistema" en lugar de "una sola pieza de código".
La mayoría de los proyectos a gran escala ya habrán elegido un marco de plugin, o diseñado uno propio. También hay una serie de marcos de plugins genéricos diseñados para simplificar la conversión de su programa en un sistema extensible.
(Respuesta a la pregunta 1) Si bien los complementos pueden usar la funcionalidad de los demás, normalmente lo harían a través de los métodos / API predefinidos que el arquitecto presentó. El uso de este tipo de "escritura de pato" ayuda a evitar la súper interdependencia, y significa que no está necesariamente claro si una característica determinada es proporcionada por un código "central" o un complemento. De hecho, habiendo adoptado una estrategia de complemento, muchos desarrolladores implementan incluso funciones "centrales" como complementos, solo los que se incluyen con el programa principal. Si bien tener enredos espaguetis de complementos no es ideal, no es raro ver algunos complementos que requieren la existencia de otros complementos.
(Respuesta a la pregunta 2) Como arquitecto, lo principal que ofrece complementos es una arquitectura, por ejemplo, un conjunto de métodos a través de los cuales se configuran, registran e invocan, y un diseño y conjunto de requisitos en los que los complementos operarán . El programa principal, mientras se ejecuta, generalmente expone muchas, si no todas, sus estructuras de datos internos y métodos a complementos. Esto es obviamente una exposición de seguridad. Se pueden usar varias técnicas de sandboxing (y se utilizan cada vez más), pero la mayoría de las veces, los complementos son códigos "confiables", que funcionan como si fueran parte del programa principal.
Para más lectura: