2008-11-27 17 views
64

Necesito algunos recursos que hablan 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.¿Cómo diseñar software extensible (arquitectura de complemento)?

¿Qué me recomiendas? ¿Hay algún libro que discuta el tema?
Preferiría algo que sea breve y directo; un poco de teoría y un montón de ejemplos concretos.

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

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

ACTUALIZACIÓN

No estoy preguntando sobre programación orientada a objetos o permitir que mis clases a ser heredados. 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 su implementación.

Por ejemplo, Notepad ++ tiene una arquitectura de complemento donde 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).

+0

creo que usted encontrará que la mayoría de los entornos enchufables proporcionan clases base para usar al escribir un complemento. Su complemento de terceros personalizado derivaría de la clase base y extendería su funcionalidad de "plug-in estándar". – Kieveli

+3

Descubrirá que la naturaleza extensible de software como Firefox y Notepad ++ proviene de sus raíces de diseño OO. El mismo principio que hace que sus clases sean extensibles ayudará a que su software en general sea extensible. – orokusaki

Respuesta

24
+1

Spooky, la arquitectura del complemento que usa el enlace C# es un código que se ve exactamente como un POC que una vez escribí. Solo faltaba una cosa: un sistema de archivos vigilante para recoger nuevos módulos durante el tiempo de ejecución. Ideal para demostraciones: "Ponga el dll en este directorio y ... Voila! Una nueva opción de menú." – Guge

+1

aceptado debido a este enlace http://www.codeguru.com/cpp/misc/misc/plug-insadd-ins/article.php/c3879 que no me di cuenta al principio! – hasen

+0

Gracias. Asante. Shukria. Shukran. Tenkyu tru. Obligad. Merci. Gracias. Arigato. Xie xie. Navazish. – bugmagnet

13

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

El theory is here.

El (free!) book is there.

extensibilidad y la capacidad de escribir plug-in debe hacer frente a ciclo de vida del servicio

  • la adición/eliminación de servicio/plugin en el punto
  • la gestión de dependencias entre los servicios
  • gestión de estados de servicios (declarado, instalado, iniciado, detenido, ...)

What is OSGI for ?

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

Usted encontrará una good introduction here, en la idea central de servicio (que está relacionada con su pregunta, y que explican algunos problemas en torno a los servicios, componentes clave para la extensibilidad).

Extracto:

¿Por qué son los servicios a continuación, tan importante si tantas aplicaciones se pueden construir sin ellos? Bueno, los servicios son la mejor manera conocida de desacoplar componentes de software entre sí.

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.

+0

¿Qué es Osgi? Miré el sitio web pero no entiendo cómo se relaciona con mi pregunta. – hasen

+2

Mire este http://stackoverflow.com/questions/106222/what-does-osgi-solve –

+0

"agregar/eliminar servicio/complemento en el lugar" realmente útil solo para aplicaciones de tipo servidor que se ejecutan continuamente; otras aplicaciones pueden cargar la última versión de un complemento cuando comienzan. – Raedwald

-7

vez de volver a inventar la rueda, utilice los marcos en la mano. Eclipse y Netbeans admiten extensiones basadas en complementos. Sin embargo, tienes que trabajar en Java.

0

Pago y envío "CAB" - Microsoft Composición Aplicación Bloques de construcción Marco. Creo que también tienen una "versión web" de eso ...

0

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

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

O Smart Client - Composite UI Application Block de Microsoft

Recientemente, he mirado teniendo componentes tanto de la interfaz de usuario compuesta bloque de aplicación y el espacio de nombres System.AddIn para construir mi propia. 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 de la cabina, utilizando definitivamente el Unity Application Block

4

Intenta alcanzar dos objetivos contrapuestos:

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

Explicación: Para alentar la reutilización del código, debería 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 "finales" (y no se pueden extender). Para cumplir con este objetivo, todo debe ser público y accesible. No hay datos o métodos privados.

Cuando suelta 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étodo, métodos de eliminación, romper la API. Si haces esto, muchas personas se alejarán. Así pues, para poder evolucionar el software, los componentes no deben exponer a nada que no sea absolutamente necesario - a costa de la reutilización de código.

Ejemplo: Quería observar la posición del cursor (cursivo) en un SWT StyledText. El cursor no debe extenderse. Si lo hace, usted encontrará que el código contiene los controles como "es esta clase en el paquete de org.eclipse.swt" y una gran cantidad de métodos son privadas y final y otras cosas. Tuve que copiar unas 28 clases de SWT en mi proyecto solo para implementar esta característica porque todo está bloqueado.

SWT es un marco agradable de usar y un infierno para extender.

0

arquitectura plugin se está volviendo muy popular por su extensibilidad y flexibilidad de este modo.

Para C++, el servidor httpd de Apache en realidad está basado en un complemento, pero en su lugar se usa 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 el modelo de subprocesamiento. Es un software muy modular que alguna vez vi.

Y para Java, Eclipse definitivamente está basado en un plugin. 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 intrincado en OSGi es su característica dinámica, lo que significa que los paquetes se pueden instalar o desinstalar en tiempo de ejecución. ¡Ya no hay síndrome de parar el mundo!

1

El artículo Writing Plugin-Based Applications explica claramente las responsabilidades de las diversas partes de la arquitectura usando un ejemplo muy simple; se proporciona el código fuente (VB.Net). Me pareció muy útil para comprender los conceptos básicos.

2

así que depende de la lengua.

  • 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í se hace en C/C++.
  • En .NET, hay reflexión, que es ofrece similar (pero más amplio) a loadLibrary.También hay bibliotecas completas creadas en Reflection como Managed Extension Framework, o Mono.Addins que ya hace la mayor parte del trabajo pesado.
  • En Java, también hay Reflexión. Y está 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.

+0

"loadlibrary": no en C/C++ estándar. – Raedwald

0

Si trabajas con .Net, nuestra investigación arrojó dos enfoques: creación de scripts y composición.

Scripting

se extiende la funcionalidad de lo que sus clases se pueden hacer por la orquestación de ellos el uso de scripts. Eso significa exponer lo que se compila en su lenguaje .Net favorito en un lenguaje dinámico.

Algunas opciones que encontramos vale la pena explorar:

Composición

Si se inicia un proyecto con .Net 4 o superior, debe tener un buen aspecto en el marco de extensibilidad Gestionado (MEF). Le permite ampliar la funcionalidad de sus aplicaciones de forma complementaria.

El Marco Extensibilidad Gestionado (MEF) es una capa de composición para .NET que mejora la flexibilidad, mantenibilidad y la capacidad de prueba de grandes aplicaciones. MEF se puede utilizar para la extensión de complemento de de terceros, o puede brindar los beneficios de una arquitectura similar a un plugin flojamente acoplado a las aplicaciones normales.

Managed Add-in Framework es también una buena lectura.

3

Implementar SOLID principios en su aplicación.

1. principio de responsabilidad individual: Una clase debe tener un solo responsabilidad (es decir, sólo un cambio potencial en la especificación del software debe ser capaz de afectar a la especificación de la clase

2.Abrir principio/cerrado: entidades de software ... debe ser abierta para la extensión, pero cerrado para la modificación

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

4. principio de la segregación de interfaz: Muchas interfaces específicas para el cliente son mejores que una interfaz de uso general

5. Dependencia principio de la inversión:Uno debe depender de abstracciones. No dependerá de concreciones

preguntas

Stackoverflow:

Example of Single Responsibility Principle

Is the Open/Closed Principle a good idea?

What is the Liskov Substitution Principle?

Interface Segregation Principle- Program to an interface

What is the Dependency Inversion Principle and why is it important?

0

Como no tengo suficientes puntos de representación para dejar un comentario, lo estoy publicando como respuesta. SharpDevelop es un IDE para desarrollar aplicaciones en C#/VB.NET/Boo. Tiene una arquitectura bastante impresionante que permite extenderse de varias maneras, desde nuevos elementos de menú hasta soporte de desarrollo para lenguajes completamente nuevos.

Utiliza un poco de configuración XML para actuar como una capa de pegamento entre un núcleo del IDE y la implementación del complemento. Se encarga de localizar, cargar y versionar los complementos de fábrica. La implementación de nuevos complementos es una cuestión de 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 de csharp" por el autor (es) original (es) - Christian Holm, Mike Krüger, Bernhard Spuida de la aplicación de here. El imposible de libro parece estar disponible en ese sitio, pero he encontrado una copia que aún podría estar alrededor here

también encontraron una pregunta relacionada here

Cuestiones relacionadas