Documentos de Académico
Documentos de Profesional
Documentos de Cultura
en la plataforma .NET
León E. Welicki,
Fernando Cano García
Universidad Pontificia de Salamanca, campus de Madrid
Departamento de Lenguajes, Sistemas informáticos e Ingeniería del Software
España, Madrid, Majadahona, c/Sorolla 4, 28220
1. Introducción
La idea de abstracción del lenguaje de programación no es nueva. Es algo que se ha
intentado a lo largo de los años con las distintas tecnologías basadas en objetos y
componentes. Dentro del mundo COM (Component Object Model), un cliente COM
escrito en Visual Basic podía invocar a otro escrito en Visual C++. Esta relación no
estaba restringida sólo a estos dos entornos: cualquier componente que
implementase la especificación COM (un conjunto determinado de interfases)
podría interactuar con otro similar. Esto se hace también extensible al mundo
DCOM, donde el lenguaje no era el punto determinante sino la implementación de
una especificación en forma de un conjunto determinado de interfaces (en breve,
profundizaremos sobre este punto).
2. Arquitectura de .NET
A continuación, intentaremos explicar en un párrafo, en forma resumida, los
conceptos principales de la arquitectura de .NET en lo concerniente a la compilación
multilenguaje, a efectos de establecer las bases para nuestro posterior análisis.
Herramienta de
desarrollo, como Compilador just-in-
Visual Studio .NET. time (JIT)
En el framework .NET, todos los lenguajes son primera clase. Esto significa que
cualquier tarea puede ser realizada con cualquier lenguaje, lo cual limita la elección
del mismo a preferencias sintácticas (y podría decirse que políticas, ya que la mayor
parte de los samples están en C#, y así también ciertas herramientas, como por
ejemplo NDoc).
3. Programación Multilenguaje
Según Bertrand Meyer, “la habilidad para mezclar lenguajes ofrece grandes
promesas para el futuro de los lenguajes de programación”. La programación
multilenguajes, como está planteada en .NET, presenta un amplio conjunto de
beneficios a la ingeniería del software, pero también trae consigo otro conjunto de
amenazas. A continuación, exploraremos estos dos puntos.
3.1 Beneficios
3.1.1 Integración de aplicaciones legadas (Legacy)
Existen casos donde la sintaxis es muy similar, incluso ciertos elementos se podrían
automatizar de una manera muy sencilla. La diferencia radica principalmente en la
utilización de objetos del framework en lugar de APIs específicas del sistema
operativo.
Aprovechar lo mejor de cada lenguaje para el desarrollo del software es también una
idea atrayente: COBOL para modelar procesos batch, C++ para calculo numérico o
funciones no manejadas, Visual Basic para acceso a BBDD, Eiffel para situaciones
donde precisemos utilizar herencia múltiple, et...
Las bases de los lenguajes OO son siempre las mismas: los conceptos de clase,
interfaz, método, atributo, permanecen invariables a lo largo de los distintos
entornos
4. Patrones de Diseño
En esta sección definiremos brevemente el concepto de patrones y como encajan en
la estrategia de arquitectura de Microsoft (para más información sobre estos temas,
ver [1], [13] y [14]). Finalmente, explicaremos por qué los patrones de diseño son
una gran opción para el desarrollo multilenguaje.
4.1 Definición
Además de estás charlas específicas, los patrones estuvieron presentes en todos los
modelos de diseño y esquemas de arquitectura expuestos. Se puede encontrar en las
presentaciones declaraciones de principios como las que se muestran a continuación:
• Leverage Enterprise Design Patterns ([15], sección de conclusiones])
• Use pattern-layered interaction ([15], sección de conclusiones])
• Los patrones de diseño simplifican las interacciones entre clases ([16],
sección de conclusiones])
• Pueden hacer a las aplicaciones de software más escalables y fáciles de
cambiar ([16], sección de conclusiones])
5.1 Escenario
Para guardar los datos en nuestra hipotética agenda basada en base de datos,
necesitamos actualizar múltiples repositorios. La realización de esta actualización es
realizada por varias clases diferentes. Para poder encajar la actualización a nuestra
Estrategia, utilizaremos otro patrón llamado Fachada (Façade). Según el GoF, este
patrón “proporciona una interface unificada para un conjunto de interfaces de un
subsistema. Define una interface de alto nivel que hace que el subsistema sea más
fácil de usar” ([1]). De esta manera, definiremos una fachada para almacenar los
distintos datos en la base de datos.
Hemos elegido a UML como lenguaje de notación para especificar nuestro diseño,
debido a su expresividad, versatilidad y a su gran aceptación dentro del mundo de la
ingeniería del software orientado a objetos.
Creemos que es indispensable contar con una herramienta que nos permita
representar el diseño de la aplicación en forma visual, a efectos de establecer una
clara comunicación entre los participantes del equipo de desarrollo.
Para poder expresar mejor el diseño, hemos empleado los valores etiquetados de
UML para extender el modelo de clases de UML e indicar cómo participa una clase
en un patrón (que rol cumple de acuerdo a las especificaciones del GoF) y en qué
lenguaje será implementada.
Esto nos permite visualizar en forma sencilla cual es el rol de cada clase en el diseño
general de la aplicación y tener una visión panorámica de la distribución de
lenguajes en toda la aplicación, convergiendo en mayor control sobre el diseño e
implantación del proyecto.
Extensión Significado
{Patron=valor} Patrón identificado de la especificación de GoF.
{Rol=valor} Cuál es el rol que cumple la clase dentro del patrón, de
acuerdo con las especificaciones del GoF.
El valor puede ser un vector de elementos, como en el
caso de la clase cSQLPerson que tiene los roles de
Façade en el patrón Façade y Estrategia Concreta en el
patrón Estrategy
{Lenguaje=valor} Indica en que lenguaje se implementa la clase, en este
caso C# y VB .NET
Nota importante: este código ha sido creado a efectos de ilustrar la situación, pero
no cumple las normas de calidad de código de producción real. Una mejora
importante seria incluir en ambos casos control de error o un manejo más inteligente
del estado de la conexión.
Para poder proveer una clase única donde implementar la estrategia, utilizaremos el
patrón façade (Fachada), el cual tiene los siguientes participantes:
• Fachada (cSqlPerson)
- sabe qué clases del subsistema son las responsables ante una
petición.
- delega las peticiones de los clientes en los objetos apropiados del
subsistema.
• Clases del subsistema (cPersonData, cPersonMail, cPersonPhone)
- implementan la funcionalidad del subsistema.
- realizan las labores encomendadas por el objeto Fachada.
- no conocen a la fachada: es decir, no tienen navegabilidad hacia
ella.
5.7 Combinando los patrones para la persistencia de datos a Sql Server
La persistencia de datos en repositorios XML será desarrollada con C#, sin tener una
base previa. Para implementar esta funcionalidad, utilizaremos los objetos del
espacio de nombres (namespace) System.Xml.
6. Generalización
El esquema presentado en las secciones anteriores tiene amplia aplicación en varias
áreas de la ingeniería del software orientado a objetos: aplicaciones distribuidas,
aplicaciones orientadas a objetos y aplicaciones en n-capas, por citar algunas.
El uso de patrones para combinar múltiples lenguajes no está sólo restringido a los
lenguajes por defecto de Visual Studio .NET (C#, VB.NET y C++.NET): es una
técnica que se puede hacer extensiva a cualquier lenguaje que pueda utilizarse
dentro de la plataforma .NET. Así, podemos integrar nuestro código con bloques
escritos en COBOL (utilizando el compilador de COBOL .NET desarrolado por
Fujitsu [3]), Eiffel (utilizando Eiffel# o el compilador de Eiffel desarrollado para
.NET), Fortran, Pyton, Perl o cualquier lenguaje que tenga un compilador que
genere código que el CLR pueda ejecutar (actualmente, hay mas XXX lenguajes
compatibles).
7. Conclusiones
El diseño debe ser el centro de desarrollo del proyecto. En el reside toda la
información necesaria para mantener, ampliar o reutilizar las funcionalidades de una
aplicación. El uso de reglas, técnicas y experiencias anteriores de diseño nos
permitirá obtener mejores resultados.
Por lo tanto, los Patrones de Diseño son de gran ayuda para implementar
aplicaciones multilenguaje en forma eficiente y ordenada, contrarrestando los altos
niveles de entropía inherentes a ese tipo de aplicaciones.
Referencias
1. Gamma, Erich, Helm, Richard, Johnson, Ralph & John Vlissides: Design
Patterns: Elements of Reusable Object-Oriented Software, Addison Wesley,
1995
2. Platt, David: Introducción Microsoft .NET, Microsoft Press, 2001
3. Appleman, Dan: Moving to VB.NET, APress, 2001
4. Appleman, Dan: ActiveX Component Development Guide, Apress, 1997
5. Gunnerson, Eric: C# programmers guide, 2001
6. Meyer, Bertrand: Polyglot Programming [en línea] <
http://www.sdmagazine.com >
7. Meyer, Bertrand: Achieving Interoperability [en línea] <
http://www.sdmagazine.com >
8. Cole, Thomas: Jump from ADO to ADO.NET [en línea] <
http://www.vbwm.com/articles/2002/tcole/adonet1/printable_article.asp >
9. Jacobson, Ivar: Object-Oriented Software Engineering: a use case driven
approach, ACM Press, 1991
10. Appleman, Dan: ActiveX Component Development Guide, APress, 1998
11. Fujitsu: COBOL for Microsoft .NET Framework [en línea] <
http://www.adtools.com/info/whitepaper/net.html >
12. Mono Project [en línea]
13. Microsoft Architecture Center [en línea] <
http://msdn.microsoft.com/architecture >
14. Microsoft Patterns and Practices [en línea ] <
http://msdn.microsoft.com/patterns >
15. Sehmi, Arvindra & Carraro, Gianpaolo: Architecting for Interoperability
Framework, Proceedings from the Microsoft EMEA Tour 2003, Madrid
16. Sehmi, Arvindra: Pattern Layering: secret sauce of great applications,
Proceedings from the Microsoft EMEA Tour 2003, Madrid
17. OMG <en línea> http://www.omg.org
18. NUnit <en línea> http://www.nunit.org