Pregunta

¿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 extensión a un sistema que está escribiendo, de modo que la funcionalidad pueda ampliarse a través de algún tipo de API de complemento en lugar de tener que modificar el código central de un sistema.

¿Estas cosas tienden a depender del idioma en el que se escribió el sistema o existe un método general para permitir esto?

¿Fue útil?

Solución

Generalmente, esto es algo que tendrás que exponer tú mismo, por lo que sí, dependerá del idioma en el que esté escrito tu sistema (aunque a menudo también es posible escribir contenedores para otros idiomas).

Si, por ejemplo, tuviera un programa escrito en C, para Windows, los complementos se escribirían para su programa como archivos DLL.En tiempo de ejecución, cargaría manualmente estas DLL y les expondría alguna interfaz.Por ejemplo, las DLL podrían exponer un gimme_the_interface() función que podría aceptar una estructura llena de punteros de función.Estos punteros de función permitirían a la DLL realizar llamadas, registrar devoluciones de llamadas, 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ía una interfaz que proporcionara funcionalidad (logrando lo mismo que la estructura, pero menos feo).Para Java, cargaría archivos de clase bajo demanda en lugar de 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.

PDSi desea ver un buen ejemplo de un sistema de complementos de C++, consulte el Foobar2000 SDK.No lo he usado desde hace bastante tiempo, pero solía estar muy bien hecho.Supongo que todavía lo es.

Otros consejos

He usado API basadas en eventos para complementos en el pasado.Puede insertar enlaces para complementos enviando eventos y brindando acceso al estado de la aplicación.

Por ejemplo, si estuviera escribiendo una aplicación de blog, es posible que desee generar 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 al complemento para que lo modifique según sea necesario.

Estoy tentado a indicarte el libro Design Patterns para esta pregunta genérica :p

En serio, creo que la respuesta es no.No puedes escribir código extensible de forma predeterminada, será difícil de escribir/extender y tremendamente 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 partes de su sistema que pueden ampliarse significativamente y admitir una API adecuada para estos casos (p. ej.complementos de soporte de idiomas en un editor).Usaría los patrones relevantes, pero la implementación específica depende de su elección de plataforma/idioma.

En mi opinión, también ayuda el uso de un lenguaje dinámico: permite modificar el código central en tiempo de ejecución (cuando sea absolutamente necesario).Aprecié que la extensibilidad de Mozilla funcione de esa manera al escribir extensiones de Firefox.

Creo que hay dos aspectos de tu pregunta:

El diseño del sistema que será 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 la plataforma/lenguaje y pueden verse como un "procedimiento general".

Ahora, su implementación depende del lenguaje y la plataforma (por ejemplo, en C/C++ tienes la biblioteca dinámica, etc.)

Se han desarrollado varios 'marcos' para brindarle un entorno de programación que le brinde capacidad de conexión/extensibilidad, pero como mencionan otras personas, no se vuelva loco haciendo que todo sea conectable.

En el mundo Java una buena especificación a tener en cuenta 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/)

  1. Descubra qué requisitos mínimos desea imponer a un escritor de complementos.Luego, cree una o más interfaces que el escritor debe implementar para que su código sepa cuándo y dónde ejecutarlo.

  2. Cree una API que el escritor pueda usar para acceder a algunas de las funciones de su código.

También podría crear una clase base que el escritor deba heredar.Esto facilitará el cableado de la API.Luego use algún tipo de reflexión para escanear un directorio y cargue las clases que encuentre que coincidan con sus requisitos.

Algunas personas también crean un lenguaje de programación para su sistema o implementan un intérprete para un subconjunto de un lenguaje existente.Esta también es una posible ruta a seguir.

La conclusión es:Cuando consigas que se cargue el código, sólo tu imaginación debería poder detenerte.
Buena suerte.

Si está utilizando un lenguaje compilado como C o C++, puede ser una buena idea buscar compatibilidad con complementos a través de lenguajes de secuencias de comandos.Tanto Python como Lua son lenguajes excelentes que se utilizan para crear scripts en una gran cantidad de aplicaciones (Civ4 y Blender usan Python, Supreme Commander usa Lua, etc.).

Si está utilizando C++, consulte la biblioteca boost de Python.De lo contrario, Python viene 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 es posible que no haya buscado lo suficiente.De cualquier manera, puedes 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top