Pregunta

Necesito algunos recursos que hablen sobre cómo diseñar su software para que sea extensible, es decir, para que otras personas puedan escribir complementos / complementos que le agreguen funcionalidad.

¿Qué me recomiendan? ¿Hay libros por ahí que discutan el tema?
Preferiría algo corto y al grano; un poco de teoría y un montón de ejemplos concretos.

No estoy apuntando a un idioma específico, quiero poder entender la idea central para poder implementarla en cualquier idioma.

Y por la misma razón, prefiero no hacerlo usando un marco que otro construyó (a menos que el marco no sea de muy alto nivel, es decir, no oculte demasiado ), en Por el momento solo quiero educarme sobre el tema y experimentar con varias formas de implementarlo. Además, un marco generalmente asume el conocimiento del usuario sobre el tema.

UPDATE

No estoy preguntando sobre OOP o permitiendo que mis clases sean heredadas. Estoy hablando de diseñar una aplicación que se implementará en un sistema, de modo que pueda ser extendida por complementos de terceros DESPUÉS de que se haya implementado.

Por ejemplo, Notepad ++ tiene una arquitectura de complemento en la que puede colocar un archivo .dll en la carpeta de complementos, y agrega funcionalidad a la aplicación que no estaba allí, como la selección de colores o la inserción de fragmentos, o muchas otras cosas (una amplia gama de funcionalidades).

Otros consejos

OSGI es un buen ejemplo práctico de un marco técnico que le permite hacer lo que busca.

La teoría está aquí .

El (¡gratis!) está allí .

La extensibilidad y la capacidad de escribir complementos deben ocuparse del ciclo de vida del servicio

  • agregar / eliminar servicio / complemento en el acto
  • gestión de dependencias entre servicios
  • gestionar estados de servicios (declarado, instalado, iniciado, detenido, ...)

¿Para qué sirve OSGI?

  

Una de las funciones principales de un módulo es como unidad de implementación ... algo que podemos construir o descargar e instalar para ampliar la funcionalidad de nuestra aplicación.

Encontrará una buena introducción aquí , sobre la noción central de service (que está relacionado con su pregunta y que explica algunos problemas en torno a los servicios, componente clave para la extensibilidad).

Extracto:

  

¿Por qué los servicios son tan importantes si se pueden construir tantas aplicaciones sin ellos? Bueno, los servicios son la forma más conocida de desacoplar los componentes de software unos de otros.

     

Uno de los aspectos más importantes de los servicios es que minimizan significativamente los problemas de carga de clases porque funcionan con instancias de objetos, no con nombres de clase. Instancias creadas por el proveedor, no por el consumidor. La reducción de la complejidad es bastante sorprendente

     

Los servicios no solo minimizan la configuración, sino que también reducen significativamente la cantidad de paquetes compartidos.

Intenta alcanzar dos objetivos competitivos:

  1. Los componentes de su software deben exponer mucho de sí mismos, para que puedan reutilizarse
  2. Los componentes de su software deben exponer muy poco de sí mismos, para que puedan reutilizarse

Explicación: para fomentar la reutilización del código, debe poder extender las clases existentes y llamar a sus métodos. Esto no es posible cuando los métodos se declaran "privados" y las clases son " final " (y no se puede extender). Para cumplir con este objetivo, todo debe ser público y accesible. Sin datos ni métodos privados.

Cuando lance la segunda versión de su software, encontrará que muchas de las ideas de la versión 1 eran completamente erróneas. Necesita cambiar muchas interfaces o su código, nombres de métodos, eliminar métodos, romper la API. Si haces esto, muchas personas se alejarán. Entonces, para poder evolucionar su software, los componentes no deben exponer nada que no sea absolutamente necesario, a costa de la reutilización del código.

Ejemplo: quería observar la posición del cursor (cursor) en un SWT StyledText. El cursor no debe extenderse. Si lo hace, encontrará que el código contiene comprobaciones como "es esta clase en el paquete org.eclipse.swt". y muchos métodos son privados y finales y demás. Tuve que copiar alrededor de 28 clases de SWT en mi proyecto solo para implementar esta función porque todo está bloqueado.

SWT es un buen marco para usar y un infierno para extender.

Implemente los principios SOLID en su aplicación.

1. Principio de responsabilidad única: una clase debería tener una sola responsabilidad (es decir, solo un cambio potencial en la especificación del software debería poder afectar la especificación de la clase

2.Principio abierto / cerrado: entidades de software & # 8230; debe estar abierto para extensión, pero cerrado para modificación

3. Principio de sustitución de Liskov: los objetos en un programa deben ser reemplazables con instancias de sus subtipos sin alterar la corrección de ese programa

4. Principio de segregación de interfaz: muchas interfaces específicas del cliente son mejores que una interfaz de propósito general

5. Principio de inversión de dependencia: Uno debe depender de abstracciones . No dependa de concreciones

Preguntas de Stackoverflow:

Ejemplo de principio de responsabilidad única

¿Es el principio abierto / cerrado una buena idea?

¿Cuál es el principio de sustitución de Liskov?

Principio de segregación de interfaz: programa en una interfaz

¿Cuál es el principio de inversión de dependencia y ¿Por qué es importante?

Por supuesto, está el famoso Principio Abierto Cerrado: http://en.wikipedia.org / wiki / Open / closed_principle

Bueno, depende del idioma.

  • En C / C ++, estoy bastante seguro de que hay una función loadlibrary que le permite abrir una biblioteca en tiempo de ejecución e invocar sus funciones exportadas. Por lo general, así es como se hace en C / C ++.
  • En .NET, existe Reflection, que ofrece ofertas similares (pero más amplias) a loadlibrary. También hay bibliotecas enteras creadas en Reflection como Managed Extension Framework o Mono.Addins que ya hace la mayor parte del trabajo pesado por usted.
  • En Java, también hay Reflexión. Y existe el JPF (Java Plugin Framework) que se usa en cosas como Eclipse IIRC.

Dependiendo del idioma que use, podría recomendar algunos tutoriales / libros. Espero que esto haya sido útil.

El artículo Escribir aplicaciones basadas en complementos explica claramente responsabilidades de las diversas partes de la arquitectura usando un ejemplo muy simple; se proporciona el código fuente (VB.Net). Me resultó muy útil para comprender los conceptos básicos.

Pago y envío " CAB " - El Marco de bloques de creación de aplicaciones de composición de Microsoft . Creo que tienen una " versión web " de eso también ...

Acabo de comenzar a desarrollar una aplicación de cliente inteligente. Estas son dos opciones que estoy considerando.

Uso del espacio de nombres System.AddIn de Microsoft. Parece muy prometedor, sin embargo, puede ser un poco complejo para nuestra solución final.

O el Smart Client - Bloque de aplicaciones compuestas de UI de Microsoft

Recientemente, he buscado tomar componentes tanto el Bloque de aplicaciones de IU compuesto como el espacio de nombres System.AddIn para construir el mío. Como el código fuente está disponible para el CAB, es fácil de extender. Creo que nuestra solución final será una versión ligera del CAB, que definitivamente utilizará el Bloque de aplicaciones de Unity

La arquitectura de complementos se está volviendo muy popular por su extensibilidad y, por lo tanto, por su flexibilidad.

Para c ++, el servidor httpd de Apache se basa realmente en complementos, pero en su lugar se utiliza un concepto de módulo. La mayoría de las características de Apache se implementan como módulos, como caché, reescritura, equilibrio de carga e incluso modelo de subprocesos. Es un software muy modular que he visto.

Y para Java, Eclipse está definitivamente basado en complementos. El núcleo de Eclipse es un sistema de módulo OSGI que gestiona paquetes, otro concepto para el complemento. Bundle puede proporcionar puntos de extensión en los que podemos construir módulos con menos esfuerzo. Lo más complejo de OSGI es su característica dinámica, lo que significa que los paquetes se pueden instalar o desinstalar en tiempo de ejecución. ¡No más síndrome del mundo!

Si trabaja con .Net, nuestra investigación arrojó dos enfoques: scripting y composición.

Scripting

Extiende la funcionalidad de lo que pueden hacer sus clases al orquestarlas usando scripts. Eso significa exponer lo que se compila en su idioma .Net favorito en un lenguaje dinámico.

Algunas opciones que encontramos vale la pena explorar:

Composición

Si comienza un proyecto con .Net 4 o superior, debe echar un buen vistazo al Marco de Extensibilidad Administrada (MEF). Le permite ampliar la funcionalidad de sus aplicaciones en forma de complemento.

  

El Marco de Extensibilidad Administrada (MEF) es una capa de composición para   .NET que mejora la flexibilidad, mantenibilidad y comprobabilidad de   Grandes aplicaciones. MEF se puede usar para complementos de terceros   extensibilidad, o puede traer los beneficios de un acoplamiento débil   arquitectura tipo plugin para aplicaciones normales.

Marco de complemento administrado también es una buena lectura.

Como no tengo suficientes puntos de representación para dejar un comentario, publico esto como respuesta. SharpDevelop es un IDE para desarrollar aplicaciones en C # / VB.NET / Boo. Tiene una arquitectura bastante impresionante que se puede ampliar de varias maneras, desde nuevos elementos de menú hasta soporte de desarrollo para idiomas completamente nuevos.

Utiliza un poco de configuración XML para actuar como una capa de unión entre un núcleo del IDE y la implementación del complemento. Maneja la localización, carga y control de versiones de complementos listos para usar. Implementar nuevos complementos es simplemente copiar en el nuevo archivo de configuración xml y los ensamblados necesarios (DLL) y reiniciar la aplicación. Puede leer más sobre esto en el libro "Disección de una aplicación csharp" por el autor (es) original - Christian Holm, Mike Kr & # 252; ger, Bernhard Spuida de la aplicación de aquí . El libro no parece estar disponible en ese sitio, pero encontré una copia que todavía podría estar aquí

También encontré una pregunta relacionada aquí

En lugar de reinventar la rueda, use los marcos en la mano. Eclipse y Netbeans admiten extensiones basadas en complementos. Sin embargo, debes trabajar en Java.

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