plugins - Sugerencias para agregar capacidad de complemento
extensibility (6)
Averigüe qué requisitos mínimos desea poner en un escritor de complementos. Luego haga una o más interfaces que el escritor debe implementar para que su código sepa cuándo y dónde ejecutar el código.
Cree una API que el escritor pueda usar para acceder a algunas de las funciones de su código.
También puede crear una clase base que el escritor debe heredar. Esto facilitará el cableado de la API. Luego, utilice algún tipo de reflejo para escanear un directorio y cargue las clases que encuentre que coincidan con sus requisitos.
Algunas personas también crean un lenguaje de scripting para su sistema o implementan un intérprete para un subconjunto de un idioma existente. Esta es también una posible ruta a seguir.
La conclusión es: cuando obtienes el código para cargar, solo tu imaginación debería poder detenerte.
Buena suerte.
¿Existe un procedimiento general para programar la capacidad de extensibilidad en su código?
Me pregunto cuál es el procedimiento general para agregar capacidad de tipo de extensión a un sistema que está escribiendo para que la funcionalidad se pueda extender a través de algún tipo de API de complemento en lugar de tener que modificar el código central de un sistema.
¿Tales cosas tienden a depender del idioma en que se escribió el sistema, o hay un método general para permitir esto?
Creo que hay dos aspectos en su pregunta:
El diseño del sistema es extensible (los patrones de diseño, inversión de control y otros aspectos arquitectónicos) ( http://www.martinfowler.com/articles/injection.html ). Y, al menos para mí, sí, estos patrones / técnicas son independientes de plataforma / lenguaje y pueden verse como un "procedimiento general".
Ahora, su implementación depende del idioma y de la plataforma (por ejemplo, en C / C ++ tienes las cosas de la biblioteca dinámica, etc.)
Se han desarrollado varios ''frameworks'' para proporcionarle un entorno de programación que le proporciona capacidad de conexión / extensibilidad pero, como mencionan otras personas, no se enloquezca y todo se pueda conectar.
En el mundo de Java, una buena especificación para buscar es OSGi ( http://en.wikipedia.org/wiki/OSGi ) con varias implementaciones, la mejor en mi humilde opinión es Equinox ( http://www.eclipse.org/equinox/ )
En general, esto es algo que tendrá que exponerse, así que sí, dependerá del idioma en el que esté escrito su sistema (aunque a menudo también es posible escribir envoltorios para otros idiomas).
Si, por ejemplo, tiene un programa escrito en C, para Windows, se escribirán complementos para su programa como archivos DLL. En tiempo de ejecución, cargará manualmente estas DLL y expondrá alguna interfaz a ellas. Por ejemplo, las DLL pueden exponer una función gimme_the_interface()
que podría aceptar una estructura llena de indicadores de función. Estos punteros de función permitirían que el DLL realice llamadas, registre retrollamadas, etc.
Si estuvieras en C ++, usarías el sistema DLL, excepto que probablemente pasarías un puntero de objeto en lugar de una estructura, y el objeto implementaría una interfaz que proporcionaría funcionalidad (logrando lo mismo que la estructura, pero menos fea). Para Java, cargaría archivos de clase bajo demanda en lugar de archivos DLL, pero la idea básica sería la misma.
En todos los casos, deberá definir una interfaz estándar entre su código y los complementos, de modo que pueda inicializar los complementos, para que los complementos puedan interactuar con usted.
PD: si desea ver un buen ejemplo de un sistema de complemento de C ++, consulte el SDK de foobar2000 . No lo he usado en bastante tiempo, pero solía estar muy bien hecho. Supongo que todavía lo es.
He utilizado API basadas en eventos para complementos en el pasado. Puede insertar ganchos para complementos enviando eventos y proporcionando acceso al estado de la aplicación.
Por ejemplo, si estaba escribiendo una aplicación de blogging, es posible que desee crear un evento justo antes de que se guarde una nueva publicación en la base de datos, y proporcionar el HTML de la publicación para que el complemento se modifique según sea necesario.
Si está utilizando un lenguaje compilado como C o C ++, puede ser una buena idea consultar el soporte de complementos a través de los lenguajes de scripting. Tanto Python como Lua son excelentes idiomas que se utilizan para crear secuencias de comandos para un gran número de aplicaciones (Civ4 y Blender usan Python, Supreme Commander usa Lua, etc.).
Si está utilizando C ++, consulte la biblioteca de boost python. De lo contrario, Python se envía con encabezados que se pueden usar en C, y hace un trabajo bastante bueno al documentar la API de C / python. La documentación parecía menos completa para Lua, pero puede que no haya estado buscando lo suficiente. De cualquier manera, puede ofrecer una plataforma de scripting bastante sólida sin una gran cantidad de trabajo. Todavía no es trivial, pero te proporciona una muy buena base para trabajar.
Tengo la tentación de señalarte el libro Design Patterns para esta pregunta genérica: p
En serio, creo que la respuesta es no. No se puede escribir código extensible por defecto, será difícil de escribir / extender y terriblemente ineficiente (Mozilla comenzó con la idea de ser muy extensible, usó XPCOM en todas partes, y ahora se dieron cuenta de que era un error y comenzaron a eliminarlo donde no tiene sentido).
lo que tiene sentido es identificar las piezas de su sistema que pueden ampliarse significativamente y admitir una API adecuada para estos casos (por ejemplo, complementos de soporte de idiomas en un editor). Utilizaría los patrones relevantes, pero la implementación específica depende de su elección de plataforma / idioma.
IMO, también ayuda a usar un lenguaje dinámico: hace posible modificar el código central en tiempo de ejecución (cuando es absolutamente necesario). Aprecio que la extensibilidad de Mozilla funcione de esa manera al escribir extensiones de Firefox.