You are on page 1of 70

Pontificia Universidad Catlica Madre y Maestra Vicerrectora Acadmica Facultad Ciencias de las Ingenieras Ingeniera en Sistemas y Computacin - ISC

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones clusula try:
Una declaracin try especifica que su bloque de cdigo est sujeto a un cdigo manejo de errores o de limpieza. Un bloque try debe estar seguido ya sea por un bloque catch, un bloque finally o ambos. El bloque catch se ejecuta cuando un error ocurre en el bloque try. El bloque finally se ejecuta luego que la ejecucin sale del bloque try (o si est presente, del bloque catch), para ejecutar cdigo de limpieza, sin importar si ha ocurrido o no un error.

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones clusula try:
Un bloque catch tiene acceso a un objeto Exception que contiene informacin sobre el error. Se utiliza el bloque catch para compensar el error o relanzar la excepcin (como es el caso en que se quiere registrar el error y dejar que ste sea manejado en un nivel superior).

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones clusula try:
Un bloque finally aade determinismo a la aplicacin, al siempre ejecutarse sin importar lo que pase. Es muy utilizado para ejecutar tareas de limpieza como son cerrar conexiones de red.

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones:

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de excepciones clusula try:

Una clusula try tiene el siguiente esquema:

try { // Dentro de este cdigo se puede lanzar alguna excepcin. } catch(ExceptionA ex) { // Manejamos la excepcin de tipo ExceptionA. } catch(ExceptionB ex) { // ManejamOs la excepcin de tipo ExceptionB. } finally { // Cdigo de limpieza. }

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de excepciones clusula try:

En este ejemplo manejamos la excepcin que se lanza al dividir por cero. Este ejemplo es slo para ilustrar; lo ideal es filtrar x antes de llamar Calc.

class Prueba { static int Calc(int x) { return 10 / x; } static void Main() { try { int y = Calc(0); // Esto lanza una excepcin! Console.WriteLine(y); } catch(DivideByZeroException ex) { Console.WriteLine(x no puede ser cero.); } Console.WriteLine(Programa terminado.); } }

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones clusula catch:
Una declaracin catch especifica qu tipo de excepcin se manejar, el cual debe ser System.Exception o una clase derivada.
Manejando System.Exception agarra todo tipo de errores. Por otro lado, se pueden manejar tipos de excepciones especficos para tener mayor control del tipo de error que ha surgido. Se pueden manejar mltiples tipos de excepciones con mltiples declaraciones catch.

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de excepciones clusula catch:

Las excepciones son relativamente costosas de tratar porque toman cientos de ciclos del reloj del procesador. Estos ejemplos son slo para

class Prueba { static int Calc(int x) { return 10 / x; } static void Main(string[] args) { try { byte b = byte.Parse(args[0]); Console.WriteLine(b); } catch(IndexOutOfRangeException ex) { Console.WriteLine(Debe especificar un valor.); } catch(FormatException ex) { Console.WriteLine(Esto no es un nmero.); } catch(OverflowException ex) { Console.WriteLine(Ha especificado algo ms grande que un byte.); } } }

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones clusula catch:
Slo una clusula catch se ejecuta cuando hay un error. Es bueno utilizar las excepciones ms especficas primero.
Si no se necesita tener acceso a las propiedades de una excepcin, se puede omitir el nombre de la variable: catch(StackOverflowException) // Sin variable.

Tambin se puede omitir el tipo de dato y el nombre de la variable para capturar todas las excepciones: catch{ }

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones clusula finally:
Un bloque finally siempre se ejecuta, sin importar si se ha lanzado o no una excepcin. Tpicamente se utiliza para cdigo de limpieza.
Un bloque finally se ejecuta cuando: Un bloque catch termina. El control de flujo abandona el try (ya sea por un return, o un goto). Un bloque try termina.

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de excepciones clusula finally:

El archivo se cierra sin importar si (1) el bloque try termina correctamente, (2) si el control sale temprano porque el archivo estaba vaco (EndOfStream) o (3) se lanza una excepcin IOException mientras se lee el archivo.

static void LeerArchivo() { StreamReader reader = null; // En el namespace System.IO try { reader = File.OpenText(archivo.txt); if(reader.EndOfStream) return; Console.WriteLine(reader.ReadToEnd()); } finally { if (reader != null) reader.Dispose(); } }

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones clusula using:
Muchas clases encapsulan recursos no manejados, como es el caso de los archivos, grficos o conexiones de bases de datos. Estas clases implementan System.IDisposable, el cual define un nico mtodo sin parmetros llamado Dispose() para limpiar estos recursos. Es una forma de llamar el mtodo Dispose() como si estuviera dentro de un bloque finally().

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de excepciones clusula using:

El bloque enumerado como (1) es equivalente al bloque enumerado como (2).

(1) using (StreamReader reader = File.OpenText(file.txt)) { ... }

(2) StreamReader reader = File.OpenText(file.txt); try { ... } finally { if(reader != null) ((Idisposable)reader).Dispose(); }

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de excepciones lanzando excepciones: class Prueba

Las excepciones pueden ser lanzadas tanto en tiempo de ejecucin como en el cdigo. En este ejemplo, Mostrar_Info lanza una excepcin System.Argument NullException

{ static void Mostrar_Info(string Nombre) { if(Nombre == null) throw new ArgumentNullException(Nombre); Console.WriteLine(Nombre); } static void Main() { try{ Mostrar_Info(null); } catch(ArgumentNullException ex) { Console.WriteLine(Excepcin manejada.); } } }

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de excepciones lanzando excepciones: using System.Net;

Las excepciones se pueden volver a lanzar una vez capturadas, ya sea slo para registrar dicho error, para lanzar una ms especfica o porque las cosas se salieron de control, como se muestra en este

string s = null; using (WebClient wc = new WebClient()) { try{s = wc.DownloadString(http://www.albahari.com/nutshell/); } catch (WebException ex) { // Antes, podramos registrar el error. if(ex.Status == WebExceptionStatus.NameResolutionFailure) Console.WriteLine(Nombre de dominio invlido.); else throw; // Otro tipo de WebException. Relanzamos. } }

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones Propiedades Clave:
Las propiedades ms importantes de System.Exception son: StackTrace: Es un String que representa todos los mtodos que son llamados desde el origen de la excepcin al bloque catch. Message: Un String con una descripcin del error. InnerException: La excepcin interna (si alguna) que caus la excepcin actual. Esta, a su vez, puede contener otro InnerException.

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones Tipos Comunes de Excepciones:
System.ArgumentException: Se lanza cuando una funcin es llamada con un argumento errneo. System.ArgumentNullException: Es una subclase de ArgumentException que se lanza cuando el argumento de una funcin es (inesperadamente) nulo. System.ArgumentOutOfRangeException: Subclase de ArgumentException que es lanzada cuando un argumento numrico es muy pequeo o muy grande (Ej.: Si se enva un valor negativo a una funcin que slo admite positivos).

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Excepciones Tipos Comunes de Excepciones:
System.InvalidOperationException: Lanzado cuando el estado de un objeto es invlido para un mtodo poder ejecutarse. Ej.: Leer un archivo que no ha sido abierto, o leer el siguiente elemento de una lista que ha sido modificada.

System.NotSupportedException: Indica que una funcionalidad no es soportada. Ej.: Al llamar el mtodo Add de una lista marcada como slo lectura (IsReadOnly = true).
System.NotImplementedException: Indica que una funcin no ha sido implementada.

System.ObjectDisposedException: Lanzada cuando el objeto del cual se le llama una funcin ha sido liberado de su instancia.

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Streams Arquitectura:

Stream Adapter

Decorator Streams

Un BackingStore hace referencia a mecanismos para acceso persistente a datos. Los DecoratorStreams son parecidos en funcionamiento a los BackingStore Streams, pero convierte la data en alguna manera. Los StreamAdapters permiten manejar a un nivel ms alto (texto, XML, float, int) lo que se maneja a travs de los BackingStore Streams.

Backing store streams

StreamReader (texto) StreamWriter (texto) BinaryReader (int, float, ) BinaryWriter (int, float, ) XmlReader (XML) XmlWriter (XML)

DeflateStream GZipStream CryptoStream BufferedStream

FileStream IsolatedStorageStream MemoryStream NetworkStream

TCNICAS EN LA APLICACIN DE LA POO


Manejo de Streams Utilizando Streams: La clase abstracta Stream es la clase base para todos los Streams. Define mtodos y propiedades para tres tipos fundamentales de operaciones: lectura, escritura y bsqueda, as como para tareas administrativas como cerrar, hacer flush y configurar timeouts.

Categora Lectura Escritura

Miembros

public abstract bool CanRead { get; } public abstract int Read(byte[] buffer, int offset, int count) public virtual int ReadByte(); public abstract bool CanWrite { get; } public abstract void Write (byte[] buffer, int offset, int count); public virtual void WriteByte (byte value);

Bsqueda

public abstract bool CanSeek { get; } public abstract long Position { get; set; } public abstract void SetLength (long value); public abstract long Length { get; } public abstract long Seek (long offset, SeekOrigin origin);
public virtual void Close(); public void Dispose(); public abstract void Flush(); public virtual bool CanTimeout { get; } public virtual int ReadTimeout { get; set; } public virtual int WriteTimeout { get; set; } public static readonly Stream Null; // Null stream. public static Stream Synchronized (Stream stream);

Cierre/Flus h Timeouts Otros

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de Streams:

En este ejemplo se utiliza un FileStream para leer, escribir y realizar desplazamiento (bsqueda) en un archivo de texto.

using System; using System.IO; class Program { // Crear un archivo llamado prueba.txt. using (Stream s = new FileStream(prueba.txt, FileMode.Create)) { Console.WriteLine(s.CanRead); // True Console.WriteLine(s.CanWrite); // True Console.WriteLine(s.CanSeek); // True s.WriteByte(101); s.WriteByte(102); byte[] bloque = {1, 2, 3, 4, 5}; s.Write(bloque, 0, bloque.Length); // Graba 5 bytes // CDIGO PARA DESPLAZARNOS Y LEER. } }

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de manejo de Streams:

En este ejemplo se utiliza un FileStream para leer, escribir y realizar desplazamiento (bsqueda) en un archivo de texto.

Console.WriteLine(s.Length); // 7 Console.WriteLine(s.Position); // 7 s.Position = 0; // Nos movemos al inicio. Console.WriteLine(s.ReadByte()); // 101 Console.WriteLine(s.ReadByte()); // 102 // Volvemos a leer desde el Stream al arreglo: Console.WriteLine(s.Read(bloque, 0, bloque.Length)); /* Si la lnea anterior retorn 5, estaremos al final del archivo, por lo que volver a leer nos retorna 0*/ Console.WriteLine(s.Read(bloque, 0, block.Length));

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Funciones Annimas - Concepto:
Una funcin annima es una funcin definida y posiblemente invocada sin la necesidad de un identificador o nombre. Se emplean para ser enviadas como argumento a otra funcin.
Tienen la particularidad de que son vistas como funciones anidadas, porque permiten acceso a variables de la funcin contenedora.

TCNICAS EN LA APLICACIN DE LA POO


Funciones Annimas - Concepto:
Las funciones annimas han sido implementadas en lenguajes de programacin como Lisp (en el 1958), JavaScript, C#, C++, Ruby y PHP.
Algunos lenguajes de programacin orientados a objetos soportan clases annimas (un concepto muy similar) pero sin funciones annimas, como es el caso de Java.

Implementadas en lenguajes como ActionScript, Delphi, Groovy, Haskell, Matlab, Objective-C, Perl, Smalltalk, Visual Basic .Net

TCNICAS EN LA APLICACIN DE LA POO


Funciones Annimas - Aplicaciones:
Las funciones annimas pueden contener funcionalidad que no necesita ser nombrada posiblemente debido a su uso temporal.
Algunas aplicaciones pueden ser: Para ordenar un conjunto de elementos. Para retornar un valor que depende de alguna lgica. Para transformar una funcin que necesita mltiples argumentos en una con menos argumentos (currying). Filtrar, iterar, acumular, entre otros.

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de Funciones Annimas:

Una expresin lambda puede ser asignada a un tipo delegado de la siguiente forma:

delegate int del(int i); static void Main(string[] args) { del miDelegado = x => x * x; int j = miDelegado(5); // j = 25 }

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda:
Una expresin lambda es una funcin annima que puede contener expresiones e instrucciones y puede ser utilizada para crear delegados.
Para utilizar el operador lambda =>, a la izquierda del operador se indican los parmetros de entrada (si alguno) y a su derecha la expresin o bloque de instruccin.

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de Expresiones Lambda:

Una expresin lambda puede ser asignada a un tipo delegado de la siguiente forma:

delegate int del(int i); static void Main(string[] args) { del miDelegado = x => x * x; int j = miDelegado(5); // j = 25 }

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda:
Las expresiones lambda tienen el mismo orden de precedencia que los operadores de asignacin.
Son muy utilizadas en consultas de tipo LINQ como argumentos a mtodos operadores de consulta, como es el caso del Where.

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda:
Al utilizar el operador Where en una coleccin (como se utiliza en LINQ-toObjects y en LINQ-to-XML) el parmetro es un delegado de tipo System.Func<T, TResult>, sin embargo, se utiliza una expresin lambda para crear dicho delegado.
Una expresin lambda tiene la siguiente sintaxis: (parmetros de entrada) => expresin Los parntesis son opcionales si se tiene un solo parmetro.

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda:
Ejemplo de una sencilla expresin lambda con dos parmetros:
(x, y) => x == y A veces resulta difcil identificar de forma implcita los tipos de datos, por lo que es posible especificarlos: (int x, string s) => s.Length > x

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda Bloque de Instrucciones:

Cuando es un bloque con mltiples sentencias, stas se agrupan entre llaves:

delegate void DelegadoPrueba(string s); DelegadoPrueba miDelegado = n => { string s = n + + Mundo; Console.WriteLine(s); } miDelegado(Hola );

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda Bloque de Instrucciones:

El siguiente ejemplo muestra cmo hacer un bloque de instrucciones lambda que genera un nmero aleatorio y lo imprime por pantalla:

delegate int sinParametros(); private static void BloqueLambda() { sinParametros aleat = () => { int random = new Random().Next(); Console.WriteLine("Random number generated - {0}", random); return random; }; Console.WriteLine(aleat()); }

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda Operadores de Consulta Estndard:
Muchos operadores de consulta estndar reciben un argumento de la familia de delegados genricos Func<T, TResult>, los cuales utilizan parmetros para definir el nmero y tipo de parmetros de entrada y el tipo de retorno.

Estos delegados son muy comunes a la hora de encasillar expresiones definidas por el usuario que nos interesa que sean aplicadas a cada elemento dentro de una coleccin de datos.

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda:
En el siguiente ejemplo, el delegado podra ser instanciado con Func<int, bool> miFuncion, donde int sera el parmetro de entrada y bool el de retorno (el tipo de retorno siempre se indica al final):
public delegate TResult Func<TArg0, Tresult>(TArg0 arg0) El siguiente delegado Func, al ser invocado, retornar true o false para indicar que la entrada es igual a 5: Func<int, bool> miFuncion = x => x ==5; Bool resul = miFuncion(4); // Retorna falso.

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda Ejemplos de Consulta Estndard:

Varios ejemplos de consultas estndard: (No confunda la expresin lamda => con el operador de comparacin >=)

int[] numeros = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; int impares = numeros.Count(n => n % 2 == 1);

var primerosNumerosMenoresQue6 = numeros.TakeWhile(n => n < 6);


var primerosNumerosInferiores = numeros.TakeWhile((n, index) => n >= index);

TCNICAS EN LA APLICACIN DE LA POO


Expresiones Lambda Ejemplos de Consulta Estndard:
Mejorando la simplicidad del cdigo.
int[] unoADiez = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var numerosPares = unoADiez.Where(n => n % 2 == 0); foreach (int i in numerosPares) Console.Write("{0} ", i); // Salida: "2 4 6 8 10 "

En el ejemplo, se extraen los nmeros pares de una coleccin. Debido a que la expresin lambda retorna un booleano, se le considera actuar como un predicado, el cual es usado para comparar cada elemento del arreglo y filtrar slo aquellos verdaderos.

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Delegados:
Un delegado es un tipo que define una firma de mtodo. Al crear instancias de un delegado, puede asociar su instancia con cualquier mtodo mediante una firma compatible. Puede invocar (o llamar) al mtodo a travs de la instancia de delegado.
Los delegados se utilizan para pasar mtodos como argumentos a otros mtodos. Los controladores de eventos no son ms que mtodos que se invocan a travs de delegados. Cualquier mtodo de cualquier clase accesible que coincida con la firma del delegado, la cual est compuesta por los parmetros y el tipo de valor devuelto, puede asignarse al delegado. El mtodo puede ser un mtodo esttico o un mtodo de instancia. Esto permite el cambio mediante programacin de las llamadas a mtodos y la incorporacin de nuevo cdigo en las clases existentes. Si conoce la firma del delegado, puede asignar su propio mtodo.

TCNICAS EN LA APLICACIN DE LA POO


Ejemplos simples de herencia - Delegado:

En el siguiente ejemplo se muestra la declaracin de un delegado:

public delegate void SampleDelegate(string str); class SampleClass { // Mtodo que concuerda el SampleDelegate static void sampleMethod(string message) { // Aqu va el cdigo } // Mtodo que instancia el delegado. void SampleDelegate() { SampleDelegate sd = sampleMethod; sd("Sample string"); } }

TCNICAS EN LA APLICACIN DE LA POO


Delegados - Caractersticas:
Los delegados tienen las propiedades siguientes: Son similares a los punteros a funcin de C++, pero poseen seguridad de tipos.

Permiten pasar los mtodos como parmetros.


Pueden utilizarse para definir mtodos de devolucin de llamada. Pueden encadenarse; por ejemplo, se pueden llamar a varios mtodos en un solo evento.

TCNICAS EN LA APLICACIN DE LA POO


Delegados:
Un delegado enlaza dinmicamente un mtodo invocador al mtodo destino. Hay dos aspectos a tomar en cuenta a la hora de trabajar con delegados: su tipo y su instancia.
El tipo define el protocolo a seguir entre el invocador y el mtodo destino, especificando una lista de tipos de parmetros y un tipo de retorno.

TCNICAS EN LA APLICACIN DE LA POO


Delegados:
La instancia es un objeto que hace referencia a uno o ms mtodos destino que corresponden a su respectivo protocolo.
Una instancia acta literalmente como un delegado del mtodo invocador: el invocador ejecuta al delegado quien a su vez ejecuta el mtodo destino.

La declaracin de un delegado es precedida de la palabra delegate; por lo dems es similar a la declaracin de un mtodo abstracto. delegate int Transformar(int x);

TCNICAS EN LA APLICACIN DE LA POO


Delegados:

Para crear una instancia de un delegado se puede asignar el mtodo a la variable del delegado:

delegate int Transformar(int x); class Prueba { static void Main() { Transformar t = Cuadrado; // Crea la instancia. int result = t(3); // Invoca al delegado. Console.WriteLine(result); // 9 } static int Cuadrado(int x) { return x * x; } }

TCNICAS EN LA APLICACIN DE LA POO


Delegados:
Tcnicamente, al igualar el objeto del delegado a Cuadrado sin corchetes ni argumentos, estamos especificando un grupo de mtodos. C# se encarga de seleccionar el mtodo adecuado si ste ha sido sobrecargado, partiendo del prototipo del delegado.
Un delegado es similar a un callback.

TCNICAS EN LA APLICACIN DE LA POO


Delegados:

Esta tcnica es til para crear mtodos plugin. En este ejemplo, el mtodo que se ejecutar se especifica dinmicamente.

public delegate int Transformar(int x); class Util { public static void Realizar_Transf(int[] valores, Transformar t) { for(int i = 0; i < valores.Length; i++) valores[i] = t(valores[i]); } } class Prueba { static void Main() { int[] vals = { 1, 2, 3}; Util.Realizar_Transf(vals, Cuadrado); // Dinmicamente! foreach(int i in vals) Console.Write(i + ); // 1 4 9 } static int Cuadrado(int x) { return x * x; } }

TCNICAS EN LA APLICACIN DE LA POO

Delegados Multicast:
Todas las instancias de delegados tienen capacidad de multicast. Esto significa que una instancia de un delegado puede llamar ms de un mtodo. Se inicializa usando los operadores + y +=. AlgunDelegado d = AlgunMetodo1; d += AlgunMetodo2; Al invocar a d estaremos llamando, entonces, a ambos mtodos en el mismo orden en que fueron aadidos. Tambin se puede usar y -= para el efecto inverso. Se permite usar estos operadores an si el valor del delegado es null. Si el mtodo retorna algn valor, ste es retornado al mtodo invocador. En el caso de Multicast, se retorna el valor del ltimo mtodo; los retornos de los dems mtodos son ignorados.

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de Delegados Multicast:

Suponga que desea crear una rutina que tarda mucho tiempo. Podra enviar eventualmente informacin a algn mtodo que se encargue de dar retroalimentacin al usuario sobre el progreso utilizando un delegado.

public delegate void Reportar_Progreso(int porcientoCompletado); class Util{ public static void Trabajo_Duro(Reportar_Progreso p){ for(int i = 0; i < 10; i++) { p(i * 10); // Invocar al delegado. System.Threading.Thread.Sleep(100); // Simular trabajo. } } } class Prueba{ static void Main(){ Reportar_Progreso p = Mostrar_Progreso; p += Escribir_Progreso_en_Disco; Util.Trabajo_Duro(p); } static void Mostrar_Progreso(int porcientoCompletado){ Console.WriteLine(porcientoCompletado); } static void Escribir_Progreso_en_Disco(int porcientoCompletado){ System.IO.File.WriteAllText(progreso.txt, porcientoCompletado.ToString()); } }

TCNICAS EN LA APLICACIN DE LA POO


Delegados Genricos:

Un tipo delegado puede contener parmetros de tipo genrico. Con esta definicin, es posible escribir un mtodo utilitario ms generalizado para el delegado Transformar que trabaje con cualquier tipo:

public delegate T Transformar<T> (T arg); class Util{ public static void Transformar<T> (T[] valores, Transformar<T> t{ for(int i = 0; i < valores.Length; i++) valores[i] = t(valores[i]); } } class Prueba{ static void Main(){ int[] valores = { 1, 2, 3 }; Util.Transformar(valores, Cuadrado); // Mtodo plugin foreach(int i in valores) Console.Write( i + ); // 1 4 9 } static int Cuadrado (int x) { return x * x; } }

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Eventos:
Al utilizar delegados hay dos roles que emergentemente aparecen: invocador y suscriptor (broadcaster y subscriber).
El invocador es un tipo que contiene un campo de un delegado. El invocador decide cundo invocar, utilizando el delegado. Los suscriptores son los recipientes destinos del mtodo. Un suscriptor decide cundo empezar y terminar de escuchar, llamando += y -= en el delegado del invocador.

TCNICAS EN LA APLICACIN DE LA POO


Eventos:
Los eventos son una caracterstica que formaliza este patrn. Un evento es un constructor que expone slo la parte del delegado requeridos por el modelo invocador/suscriptor. El principal propsito de los eventos es prevenir a los suscriptores intervenir entre ellos mismos.

TCNICAS EN LA APLICACIN DE LA POO


Eventos:
La manera ms fcil de declarar un evento es aadiendo la palabra clave event frente a un campo delegado: public class Invocador { public event Reportar_Progreso Progreso; }
El cdigo dentro de la clase Invocador tiene acceso total a la variable Progreso y puede tratarlo como un delegado. El cdigo fuera de la clase Invocador slo puede realizar operaciones += y -= en el evento Progreso.

TCNICAS EN LA APLICACIN DE LA POO


Ejemplo de Eventos:

Considere el siguiente ejemplo. La clase Almacen desencadena su evento Precio_Cambia do cada vez que su propiedad Precio cambia.

Public delegate void Precio_CambiadoHandler(decimal Precio_Anterior, decimal Precio_Nuevo); public class Almacen{ string _lstr_simbolo; decimal _ldec_precio; public Almacen(string Simbolo) { this._lstr_simbolo = Simbolo; } public event Precio_CambiadoHandler Precio_Cambiado; public decimal Precio{ get{ return _ldec_precio; } set{ if(_ldec_precio == value) return; if(Precio_Cambiado != null) Precio_Cambiado(_ldec_precio, value); _ldec_precio = value; } } }

TCNICAS EN LA APLICACIN DE LA POO


Eventos:
Si en el ejemplo anterior removemos la palabra event para que Precio_Cambiado se convierta en un delegado ordinario, tendramos el mismo resultado. Sin embargo, Almacen sera mucho menos robusto, porque los suscriptores podran hacer las siguientes acciones para interferir entre ellos:
Reemplazar otros suscriptores al reasignar Precio_Cambiado (en vez de utilizar el operador +=). Quitar a todos los suscriptores (al asignar Precio_Cambiado a null). Invocar a otros suscriptores al invocar al delegado.

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Bases de Datos:
En Visual C#, se puede emplear la tecnologa ADO.NET a travs del namespace System.Data para realizar acciones avanzadas como:
Gestionar la seguridad del acceso a B.D. Relacionar tipos de datos entre B.D. y el Framework .NET Incorporar DataSet, DataTables y DataViews.

Utilizar LINQ para relacionarlo con DataSets.


Conectarse a cualquier B.D. para obtener y modificar datos. Implementar el Entity Framework (EF). Configurar Data Services para aplicaciones tipo servicio. Trabajar con caractersticas especficas de SQL Server y Oracle.

TCNICAS EN LA APLICACIN DE LA POO


Bases de Datos:
LINQ to SQL es una tecnologa que se puede emplear para simplificar de manera robusta la conexin con bases de datos relacionales.
Por otro lado, es posible relacionar los controles de aplicaciones Windows Forms con datos mediante el DataGridView. Otros controles (textbox, listbox, entre otros) pueden relacionarse con cualquier tipo de coleccin mediante una caracterstica llamada Data Binding, de manera que al actualizar un dato en un control que ya est relacionado estos cambios tambin se vern en otros controles.

TCNICAS EN LA APLICACIN DE LA POO


Aplicaciones que usan Bases de Datos:
Hoy en da, la mayora de IDEs ya ofrecen formas sencillas para configurar una aplicacin que utiliza bases de datos. Esto va desde la conexin a la B.D. hasta la creacin de objetos tipo coleccin que alojarn dichos datos, la preparacin de los controles para que se enlacen con dicha coleccin, y la lgica de actualizacin de los cambios que sufran las colecciones de vuelta a la B.D.

TCNICAS EN LA APLICACIN DE LA POO


Ciclo de Datos en Aplicaciones:

Conectando a la B.D. Salvando los datos de Vuelta en la B.D. Preparando la Aplicacin para Recibir Datos

Validando los Datos

Obteniendo los Datos en Colecciones

Editando los Datos en la Aplicacin

Mostrando los Datos en la Vista del Usuario

TCNICAS EN LA APLICACIN DE LA POO


Conectando a la B.D.:
Para realizar la conexin de doble va normalmente se implementan comportamientos en la capa de modelo de datos de la aplicacin.
Se pueden utilizar TableAdapter para enlazar DataSets (o cualquier otro tipo de coleccin) con la B.D. Se pueden utilizar ObjectContext para enlazar entidades en el EF con la B.D. Se pueden utilizar libreras propias del DBMS para ejecutar sentencias o procedimientos especficos.

TCNICAS EN LA APLICACIN DE LA POO


Conexin usando System.Data.SqlClient :

Este es un bloque de cdigo que realiza una conexin directa con una B.D. para ejecutar un procedimiento almacenado.

List<Computadora> _resp = new List<Computadora>(); try { SqlConnection ConexionDB = new SqlConnection(ConfigurationManager.ConnectionStrings["conexionDB"].C onnectionString); ConexionDB.Open(); SqlDataReader dr; comandoDB = new SqlCommand(); comandoDB.CommandType = CommandType.StoredProcedure; comandoDB.CommandText = "ObtenerComputadoras"; comandoDB.Parameters.Add(new SqlParameter("@id", id)); comandoDB.Parameters.Add(new SqlParameter("@vendida", vendida)); comandoDB.Connection = ConexionDB; dr = comandoDB.ExecuteReader(); while (dr.Read()) { _resp.Add(new Computadora(dr)); } } catch { ; } finally { ConexionDB.Close(); }

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Agenda:

TCNICAS EN LA APLICACIN DE LA POO


Agenda: