POO (Programación Orientada a Objetos)
Definición
http://es.wikipedia.org/wiki/Programación_orientada_a_objetos
Creo que mejor define el termino wikipedia antes que yo, pero lo que si quiero es seguir propagando el término y acercarlos más a este modo de programación que en .net es la base de todo. El grupo de objetos que el Framework.NET brinda es muy variado y no deja margen a limitaciones, y el único límite que existe es el que uno mismo se ponga al frente.
Entre abstracción, encapsulamiento, ocultación, polimorfismo, herencia y recolección de basura la programación orientada a objetos brinda un ambiente de trabajo a mi punto de vista entretenido, preciso, organizado, fácil de mantener, fácil de usar, fácil de entender y lo más importante es crear proyectos con un equipo de trabajo grande permitiendo una organización y distribución muy buena.
En esta primera entrega escribiré sobre los eventos de una clase tanto en el uso de ellos como la adaptación de eventos a una clase mostrando escenarios.
EVENTOS
Trataré en este y todos los demás artículos de poder definir las cosas de una manera que sea fácil de entender. En el caso de los eventos de una clase la mejor manera de definirlo a mi modo, aclaro a mi modo es la siguiente:
"Un evento es un canal paralelo a cualquier proceso donde puedes comunicar desde la clase cualquier suceso importante"
Pongamos un ejemplo:
Tienes una clase simple que representa una persona, esta clase tiene propiedades como nombre, apellido, edad y país de residencia.Tu agregas un evento para representar un canal que comunique si la edad de la persona cambia y si el país cambia. Imaginate que tienes un monton de personas sin saber ni estar pendiente si se mudó. Pero como ya le tienes el evento que nos comunicará eso abierto solo quedará esperar.
Una clase que defina una persona se vería de forma simple sin evento adaptado así:
001public class Persona
002{
003 public string Nombre { get; set; }
004 public string Apellido { get; set; }
005
006 private int _edad = 0;
007 private string _residencia = "";
008
009 public int Edad
010 {
011 get { return this._edad; }
012 set { this._edad = value; }
013 }
014
015 public string Residencia
016 {
017 get { return this._residencia; }
018 set { this._residencia = value; }
019 }
020}
Para el evento usaré el INotifyPropertyChanged definido en System.ComponentModel, es un delegado y un EventArg ya definido en el Framework. También aclaró que en el nuevo framework 3.5 el INotifyPropertyChanged en conjunto con el ObservableCollection hacen maravillas en los DataGridView, pero eso es otro tema que merece un artículo propio.
Veamos como queda la clase implementando el INotifyPropertyChanged:
001public class Persona : INotifyPropertyChanged
002{
003 public string Nombre { get; set; }
004 public string Apellido { get; set; }
005
006 private int _edad = 0;
007 private string _residencia = "";
008
009 public int Edad
010 {
011 get { return this._edad; }
012 set
013 {
014 this._edad = value;
015 OnPropertyChanged("Edad");
016 }
017 }
018
019 public string Residencia
020 {
021 get { return this._residencia; }
022 set
023 {
024 this._residencia = value;
025 OnPropertyChanged("Residencia");
026 }
027 }
028
029 public event PropertyChangedEventHandler PropertyChanged;
030
031 private void OnPropertyChanged(string Name)
032 {
033 if (this.PropertyChanged != null)
034 {
035 this.PropertyChanged(this, new PropertyChangedEventArgs(Name));
036 }
037 }
038}
Ahora esta todo en su lugar y se pueden fijar que primero se define el evento PropertyChanged y luego creo un método privado que es el que uso como intermediario para activar el evento validando que el evento no sea null porque si es null significa que nadie que este usando la clase Persona esta esperando que el evento comunique algo. Si el evento PropertyChange es null y uno lo utiliza entonces inevitablemente dara error.
Ahora veamos en un programa consola como registrarnos al evento para que nos comunique si la edad ó la residencia de alguno de las personas que defina cambia, esto quedaría de la siguiente manera y los invito a probar el ejemplo para que sientan que bueno es usar eventos.
001class Program
002{
003 static void Main(string[] args)
004 {
005 // Agregar a las Personas
006 List Personas = new List();
007
008 for (int i = 1; i < 21; i++)
009 {
010 Persona p = new Persona();
011 p.Nombre = "Persona" + i.ToString();
012 p.Apellido = "dotnetPanama";
013 p.Residencia = "Panamá";
014 p.Edad = i;
015
016 // Agregar Evento
017 p.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged);
018
019 Personas.Add(p);
020 }
021
022 // Editar a cualquier persona de la lista
023 Personas[11].Edad = 54;
024 Personas[5].Residencia = "Colombia";
025
026 Console.Read();
027 }
028
029 private static void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
030 {
031 Persona p = (Persona)sender;
032 Console.WriteLine("Propiedad que cambio: {0}", e.PropertyName);
033 Console.WriteLine("{0} {1}", p.Nombre, p.Apellido);
034 Console.WriteLine("Edad: {0}", p.Edad);
035 Console.WriteLine("Residencia: {0}", p.Residencia);
036 Console.WriteLine("");
037 }
038}
Ahy muchas otras cosas que espero tengan clara y de las cuales no hablo en este artículo ni un poquito asumiendo que ya lo saben, cosas como son Interfaces, Delegados, Propiedades de una clase y Métodos de una clase. Si algunos de estos terminos no los tienen claro solo me avisan dejando su comentario que yo escribiré un artículo sobre eso para que no quede nada sin entender.
Lo que quiero es que todo lo entiendan a profundidad sin dejar ningun termino sin conocer bien. El conocer todas los elementos que nos brinda la programación orientada a objetos nos da una gran ventaja en el desarrollo y uso de las librerias que nos brinda el framework de microsoft.
Bueno me despido por el momento y espero haber brindado un granito de arena al conocimiento y no enrredado más los términos. El archivo que aparece a continuación POO-EVNTOS.txt contieneel código que solo copias y pegas en un Program.cs de un proyecto de consola.
POO-EVENTOS.txt (2,38 kb)
Tags: poo programación c# dotnet event class