Extendiendo C#, COMPUMAT 2007

Post on 05-Dec-2014

161 views 1 download

description

A C# library to include AOP features in a .NET application using code generation.

Transcript of Extendiendo C#, COMPUMAT 2007

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