Upload
jose-almaguer
View
177
Download
1
Embed Size (px)
DESCRIPTION
A C# library to include AOP features in a .NET application using code generation.
Citation preview
EXTENDIENDO C# EXTENDIENDO C# MEDIANTE ATRIBUTOS Y MEDIANTE ATRIBUTOS Y GENERACION DE GENERACION DE
CODIGOCODIGO
EXTENDIENDO C# EXTENDIENDO C# MEDIANTE ATRIBUTOS Y MEDIANTE ATRIBUTOS Y GENERACION DE GENERACION DE
CODIGOCODIGO
Autor: Lic. JosAutor: Lic. José Albert Cruz é Albert Cruz AlmaguerAlmaguerGrupo de Investigación de Programación Avanzada (GIPA)Grupo de Investigación de Programación Avanzada (GIPA)Universidad de las Ciencias InformáticasUniversidad de las Ciencias InformáticasNoviembre del 2007 Noviembre del 2007
GIPA, Universidad de las Ciencias Informáticas
ContenidosContenidos
Implementación
Programación por Contratos
Reutilización de interfaces
Introducción
Conclusiones
GIPA, Universidad de las Ciencias Informáticas
IntroducciónIntroducción
Plataforma .NET/C#:Plataforma .NET/C#: Capacidades reflexivasCapacidades reflexivas Atributos (metadatos)Atributos (metadatos) Compiladores gratis: acceso a Compiladores gratis: acceso a
ellos mediante APIs ellos mediante APIs ((System.CodeDomSystem.CodeDom))
GIPA, Universidad de las Ciencias Informáticas
IntroducciónIntroducción
Potencialidades Potencialidades (Metaprogramación)(Metaprogramación) Reutilización de componentesReutilización de componentes Corrección de programas Corrección de programas
GIPA, Universidad de las Ciencias Informáticas
Reutilización de Reutilización de interfacesinterfaces
Asignación estática de tipos:Asignación estática de tipos: IComparable IComparable referencereference;;
Fijada en compilaciónFijada en compilación
Asignación dinámica:Asignación dinámica: obj obj = 55= 55
Los tipos están asociados a los Los tipos están asociados a los objetos, no a las variables.objetos, no a las variables.
GIPA, Universidad de las Ciencias Informáticas
Reutilización de Reutilización de interfacesinterfaces
Conformidad estructural (Conformidad estructural (structural structural conformanceconformance):): obj.DoAction(parameter)obj.DoAction(parameter)
Conformidad por nombre Conformidad por nombre ((conformance by nameconformance by name) ) :: Type p;Type p; p.Method() // Method existe en p.Method() // Method existe en
TypeType
GIPA, Universidad de las Ciencias Informáticas
Reutilización de Reutilización de interfacesinterfaces
No se puede lograr que el fragmento:No se puede lograr que el fragmento:Image img = new Bitmap("icono.ico");Image img = new Bitmap("icono.ico");obj.Image = img;obj.Image = img;
que manipule mediante que manipule mediante objobj un objeto un objeto Label o ButtonLabel o Button
objobj tiene que pertenecer a un tipo que tiene que pertenecer a un tipo que posea la propiedad posea la propiedad ImageImage
Tanto la clase Label como la clase Tanto la clase Label como la clase Button poseen la propiedadButton poseen la propiedad ImageImage
GIPA, Universidad de las Ciencias Informáticas
Reutilización de Reutilización de interfacesinterfacesSolución, hSolución, hacer que los objetos acer que los objetos
implementen la interfaz:implementen la interfaz: public interface IImageContainer {public interface IImageContainer { Image Image { set; get; Image Image { set; get; }}}}
GIPA, Universidad de las Ciencias Informáticas
Reutilización de Reutilización de interfacesinterfacesIImageContainer obj;IImageContainer obj;obj= obj=
Runtime.Create<IImageContainer>(lRuntime.Create<IImageContainer>(label);abel);
obj.Image = img;obj.Image = img;• a partir del objeto label obtenemos a partir del objeto label obtenemos mediante reflection su interface ymediante reflection su interface y
• generamos un objeto proxy del generamos un objeto proxy del
mismo que implemente la interfaz mismo que implemente la interfaz IImageContainer.IImageContainer.
GIPA, Universidad de las Ciencias Informáticas
Programación por Programación por ContratosContratos
[Invariant("menor: cant > -1")] public class Pila { private int[] values; private int cant;
[Require("Prec1: !Llena")] [Ensure("Post1: !Vacia")] public void Poner(int val) { values[cant++] = val; }
GIPA, Universidad de las Ciencias Informáticas
Programación por Programación por ContratosContratos
Pila pila = new Pila();IPila pilaContract;pilaContract = Runtime.Create<IPila>(pila);
Precondiciones: __Invariant(); if (!((!Llena))) throw new Exception("Require \"Prec1\" don't fulfilled.");
GIPA, Universidad de las Ciencias Informáticas
Programación por Programación por ContratosContratosPostcondiciones:
if (!((!Vacia))) throw new Exception("Ensure \"Post1\" don't fulfilled."); __Invariant();
Invariantes:
private void __Invariant() { if (!((cant > -1))) throw new Exception("Invariant \"menor\" don't fulfilled.");}
GIPA, Universidad de las Ciencias Informáticas
ImplementaciónImplementación
ReflectionReflectionAtributosAtributosServicios del compilador de C# de Servicios del compilador de C# de MicrosoftMicrosoftMotor de plantillas StringTemplateMotor de plantillas StringTemplate
GIPA, Universidad de las Ciencias Informáticas
ConclusionesConclusiones
Librería que implementa conceptos Librería que implementa conceptos del DPC.del DPC.Permite manejar objetos que posean Permite manejar objetos que posean una determinada interface una determinada interface