2008-08-11 10 views
15

¿Existe un procedimiento general para programar la capacidad de extensibilidad en su código?Sugerencias para agregar capacidad de complemento?

Me pregunto cuál es el procedimiento general para agregar capacidad de extensión al sistema que está escribiendo para que la funcionalidad se pueda extender mediante 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?

Respuesta

3

Esto generalmente es algo que tendrá que exponerse, así que sí, dependerá del idioma en 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, los complementos se escribirán 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 estuviera en C++, usaría el sistema DLL, excepto que probablemente pasaría un puntero de objeto en lugar de una estructura y el objeto implementar una interfaz que proporcionó 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, para que pueda inicializar los complementos, y para que los complementos puedan interactuar con usted.

P.S. Si desea ver un buen ejemplo de un sistema de complemento de C++, consulte el foobar2000 SDK. No lo he usado en bastante tiempo, pero solía estar muy bien hecho. Supongo que todavía lo es.

+0

Sí, tenía miedo de que sería una respuesta como esta. Aún así, la ventaja es que significa que usted tiene el control total sobre lo que los complementos pueden hacer, supongo. – kaybenleroll

1
  1. Averigüe qué requisitos mínimos desea poner en un plugin writer. 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.

  2. Crea una API que el escritor puede usar para acceder a parte de la funcionalidad de tu código.

También podría hacer 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 línea inferior es: Cuando obtiene el código para cargar, solo su imaginación debería poder detenerlo.
Buena suerte.

4

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 plantear un evento justo antes de guardar una nueva publicación en la base de datos, y proporcionar el HTML de la publicación al complemento para modificarlo según sea necesario.

2

Estoy tentado de señalar que el libro Patrones de diseño para esta pregunta genérica: p

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, utilizó 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 se pueden extender significativamente y admitir una API adecuada para estos casos (por ejemplo, complementos de compatibilidad 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 utilizar 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.

1

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.

2

creo que hay dos aspectos a su pregunta:

El diseño del sistema para que sea extensible (los patrones de diseño, la 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 aplicación es lenguaje y dependend plataforma (por ejemplo en C/C++ que tiene el material librería dinámica, etc.)

Varios han sido desarrollados 'marcos' para darle un entorno de programación que ofrece capacidad de conexión/extensibilidad, pero como mencionan otras personas, no se enloquezca haciendo que todo se pueda conectar.

En el mundo Java una buena especificación para buscar es OSGi (http://en.wikipedia.org/wiki/OSGi) con varias implementaciones, el mejor en mi humilde opinión es Equinox (http://www.eclipse.org/equinox/)

Cuestiones relacionadas