About

Logo C#
Logo Kinect for Windows
Logo XNA

viernes, 8 de febrero de 2013

Tengo un objeto... ¿y ahora qué?

En la actualidad, el objeto al que hemos nombrado como miAmigo es bastante mediocre. De hecho, cada propiedad del objeto se instancia con un valor false, cero o nulo por defecto, dependiendo del tipo de datos de la propiedad. Será necesario modificar el rostro de este objeto, con el fin de tener alguna información útil sobre él.
Se puede modificar el objeto cambiando la información contenida en sus propiedades:

miAmigo.nombre = "Jane";
miAmigo.genero = "Mujer";
miAmigo.altura = 1.66;
miAmigo.complexion = "Delgada";
miAmigo.colorPelo = "Rubia";
miAmigo.colorOjos = "Azules";

Es importante tener en cuenta la sintaxis asociada con el cambio del estado de un objeto. La sintaxis utilizada para referirnos a la propiedad de un objeto es la siguiente:

nombreObjeto.Propiedad 

El operador punto (dot) de C#, nos permite acceder a las diferentes propiedades (podemos hablar de ellas como puertas) que tiene un objeto (podemos hablar de este como la casa). Primero debemos de especificar a la izquierda del operador punto, a que objeto (casa) nos estamos refiriendo, y posteriormente a la derecha del operador definimos a que propiedad (puerta) queremos acceder para modificarla o para saber cómo es realmente.

¿Por qué ocultar los datos que tenemos dentro de un objeto?

De una manera muy simplificada, debemos ocultar los datos almacenados dentro de nuestros objetos, por la misma razón que los reyes solían ocultar a sus hijas en la torre del castillo... para evitar que otras personas jueguen con ellas.

Encerrando las propiedades (datos) del objeto en el interior de una caja de acero, estamos restringiendo el acceso a esas propiedades obligando a todos a tener una llave adecuada (operador punto) para tener acceso a dichas propiedades. Dicho de otra manera, si encerramos los datos dentro de un objeto, lo que estamos haciendo es proteger los datos contra cambios accidentales que puedan realizarse en otras partes del programa. El proceso de ocultar datos dentro de un objeto es llamado encapsulación. La encapsulación es una de las piedras angulares de la programación orientada a objetos. Como la encapsulación es un concepto complejo, lo veremos más detalladamente próximamente, por ahora tan sólo debemos tener en cuenta que debemos (ocultar) los datos de los objetos en la mayor medida posible, y aún así hacer que los datos estén disponibles para aquellas partes del programa que lo necesitan.

jueves, 7 de febrero de 2013

¿Qué hacer después de definir una clase?

Como se mencionó anteriormente, una clase es una plantilla para un objeto. En ese sentido, una clase es como un cortador de galletas que le permite dar una forma específica a los objetos galleta. En la versión 2102, Microsoft Visual Studio trae por defecto 4000 clases distintas, esto significa que disponemos aproximadamente de 4.000 cortadores de galletas ya colgados en la pared listo para su uso. Parte de nuestro trabajo como programador es aprender las clases que ya existen. Después de todo, no hay razón para reinventar la rueda.

Por normal general, tendremos que escribir algunas clases propias, además de las proporcionadas por por Visual Studio. Esto significa que, después de escribir nuestra primera clase, dispondremos de 4.001 cortadores de galletas, con cada uno de los cuales se puede crear un objeto de ese tipo de clase. Pero ojo!!!, el hecho de que se haya definido una clase (o un cortador de galletas) no necesariamente significa que tenga un objeto (o una galleta). El hecho de que el cortador de galletas que tu madre te dio esté en el cajón de la cocina o colgado en la pared, no determina que haya galletas en la mesa.

Como se dijo antes, una clase es simplemente una plantilla para el objeto. Así como un cortador de galletas realiza formas de masa específicas para galletas, una clase se utiliza para guardar espacios de memoria utilizados para mantener los objetos de esa clase. Hasta que no realicemos el proceso de crear un objeto real, ese objeto todavía no existirá.

Un objeto también es denominado como instancia de una clase. Al acto de usar una clase para definir un objeto se le denomina instanciación.

Un objeto, por lo tanto, es algo que en realidad se puede utilizar en un programa. Así como no se puede comer un cortador de galletas, no podemos utilizar directamente una clase. Debemos utilizar la clase para instanciar un objeto de la clase en memoria, antes de que podamos utilizar este en nuestro programa.

Nombrando Objetos

Es conveniente que utilicemos un convenio para nombrar los objetos que utilicemos en nuestros programas. Se suele utilizar un prefijo para distinguir el nombre de ciertos objetos utilizando una combinación específica de letras. Por ejemplo, deberíamos usar el prefijo cls antes de los nombres de clase, txt antes de los nombres de los objetos de cuadro de texto,  btn antes de los nombres de objetos de tipo botón, y así sucesivamente. Este convenio es una modificación de la llamada notación húngara, evitando la complejidad de esta.

La razón principal de usar esta convención es que los prefijos refuerzan el tipo de objetos que se utilizan en el programa. Es decir, de un solo vistazo se puede ver que txtNombre es un objeto de tipo cuadro de texto y que es diferente de lblNombre, que es un objeto de tipo etiqueta.
Una segunda razón es la manera en la que Visual Studio maneja y nos muestra la ayuda contextual a medida que escribimos el código de nuestro programa. Por ejemplo, si tenemos tres objetos de tipo cuadro de texto que comienzan con el prefijo txt, nos será mucho más sencillo trabajar con nuestros objetos y recordar sus nombres con un simple vistazo, gracias a esta ayuda de Visual Studio. Si no establecieramos un prefijo para los objetos, todo sería mucho más complejo.

lnstanciar un objeto de una clase

Considere la siguiente declaración:

clsPersona miAmigo; 

Esta sentencia del programa dice: "Ve a la pared donde se encuentran los cortadores de galletas y busca un cortador de galletas llamado clsPersona. Cuando lo encuentres, cogelo de la pared, y guarda un trozo de memoria para este y nombra este trozo de memoria con el nombre miAmigo.

En este instante, no tenemos nada en esa dirección de memoria, por lo que su valor actual es null (nulo).

Lo que tienes en este momento es un cortador de galletas llamado miAmigo que ha tomado una dirección de memoria para hacer algo útil. Esto empieza a suceder con la siguiente declaración del programa:

miAmigo = new clsPersona();

La palabra reservada new en C#, viene a significar que estamos pidiendo suficiente espacio en memoria para almacenar un nuevo objeto de la clase clsPersona (. NET sabe la cantidad de bytes que necesita para un objeto, examinando el código de la clase.).
Si quisieramos verbalizar lo que sucede con esta declaración que acabamos de realizar, podríamos decir que ocurre lo siguiente: 
- "Oye, Windows! Soy yo ... Visual Studio. Mi programador quiere crear un nuevo objeto clsPersona. ¿Tiene 2.000 bytes de memoria libre disponible para tal objeto?.


El administrador de memoria de Windows, entonces mira en la tabla de memoria disponible y probablemente encuentre 2.000 bytes de memoria libre en algún lugar del sistema.


Supongamos que hay 2.000 bytes disponibles - en un bloque de memoria que comienza en la dirección 900.000. El administrador de memoria de Windows envía un mensaje a Visual Studio y le dice,  
-"Hey, Visual Studio! Soy yo ... el Administrador de memoria de Windows. He encontrado 2.000 bytes de memoria libre a partir de la dirección 900.000."

Visual Studio le da las gracias, y procede a reservar y ocupar ese espacio de memoria para utilizar el objeto llamado miAmigo de clsPersona, que ahora sí existe en la ubicación de memoria 900.000.  

El valor asociado a la variable miAmigo en dirección de memoria habrá cambiado de null a la dirección de memoria donde los datos asociados donde el objeto recien creado miAmigo almacena los datos.

Ahora disponemos de un objeto clsPersona al que se puede acceder a través de la variable llamada miAmigo. El propósito que tiene la variable miAmigo es decir dónde encontrar los datos asociados al objeto miAmigo.

Una vez más, el término correcto en programación es que hemos instanciado un objeto de clsPersona referenciado por la variable miAmigo. Un objeto instanciado es un objeto que podemos utilizar en nuestro programa. También debe quedar claro que miAmigo es una referencia que permite "encontrar" los datos del objeto (es decir, los valores de sus propiedades).

Estas dos sentencias que acabamo de ver:
clsPersona miAmigo; // Coge un molde específico de la pared y nombra a este miAmigo
miAmigo = new clsPersona(); // Utiliza el cortador de galletas para hacer una galleta clsPersona utlizando como referenciador miAmigo

pueden ser combinadas dentro de una sola sentencia, de la siguiente forma:

clsPersona miAmigo = new clsPersona();

miércoles, 6 de febrero de 2013

Objetos y Clases


Los objetos son unos de los conceptos principales de la OOP. Para entender este concepto bastará con que pienses en cualquier cosa real del mundo que nos rodea: una persona, una pelota, un coche, una bicicleta...

En este post se presenta un ejemplo sencillo de cómo se utilizan los objetos en una situación cotidiana.

Supongamos que somos el jefe de personal de una empresa y tenemos que contratar a una persona para ocupar un puesto importante dentro de la misma. Después de analizar cientos de curriculums, seleccionamos a una candidata a la que llamaremos para concertar una entrevista cara a cara en las oficinas de nuestra empresa. Llamaremos al teléfono de la candidata (digamos que su nombre es Jane) y charlaremos durante unos minutos con ella, para confirmar que parece ser la persona adecuada para el trabajo. Tendremos que negociar todos los procesos necesarios para que Jane pueda volar hasta nuestra ubicación, ya que Jane es de una ciudad distinta y quedaremos con ella para recogerla en el aeropuerto.


En la conversación telefónica, tanto la candidata como el reclutador tendrán que realizarse algunas preguntas mutuas, ya que nunca se han visto antes, esto servirá para que puedan reconocerse en el aeropuerto. Quizás conozcamos la foto de la candidata a través de su curriculum, pero aunque el cerebro es capaz de reconocer rostros que haya visto sólo una vez, necesitaremos algunos detalles más.
Jane puede decirnos que es de mediana estatura, con el pelo rubio, y que llevará un traje negro y un maletín de cuero marrón. Posteriormente, le tocará al recultador describirse:alto, cabello color negro y llevará una trenca color gris. A continuación, se fijará una fecha y hora para determinar la hora de llegada del vuelo, y todo estará listo para la entrevista.

Como imaginará esta situación también se puede dar entre un taxista y un turista que llega a un país para visitarlo.
En algunas ocasiones los turistas son recogidos por taxistas o chóferes elegidos por alguna empresa o alguna persona con un alto cargo. Aunque los aeropuertos siempre tienen algún taxi disponible para ello, el utilizar un servicio público para algunas personas es un sacrilegio. Sí, es lo que tiene ser rico...

Como ocurría en la escena descrita anteriormente de la candidata al puesto de trabajo, el taxista o chofer contratado particularmente, deberá conocer una descripción del turista, quizás bastará con saber su nombre e imprimirlo en una hoja.


Clases y uso de los objetos

Sin darnos cuenta, todos los días estamos utilizando los objetos en nuestras conversaciones. En primer lugar, sin pensar en ello, estamos creando implícitamente una clase persona durante la llamada telefónica. Una clase es una plantilla que se utiliza para describir un objeto. Como tal, una clase es una abstracción, o la simplificación, de algún objeto que observamos en el mundo real.
Podemos dividir
una clase en dos componentes básicos:

  • Propiedades que describen el objeto.
  • Métodos, o acciones que podemos asociar a dicho objeto.

Propiedades de la clase

Las propiedades de la clase son los datos que deseamos asociar y registrar de un objeto. Si deseamos crear un objeto de la clase persona (de aquí en adelante, clsPersona), podríamos estar interesados en algunas de las propiedades de la siguiente lista:
  • nombre
  • altura
  • colorPelo
  • colorOjos
  • complexión
  • genero
  • gafas
Aunque no es una regla oficial, muchos programadores escriben los nombres de las variables con la primera letra de cada palabra en mayúsculas y el resto en minúscula.

Antes de la conversación telefónica, la lista de propiedades para el objeto Jane de la clsPersona estaba prácticamente vacía. Tan sólo conocíamos su nombre y su género, quizás como dijimos anteriormente podríamos conocer el color de su pelo o el color de sus ojos si junto al curriculum se adjunta un foto, aunque en el primer caso es algo que puede variar en función de épocas.
En el caso del turista al no disponer de fotografía, quizás el taxista/chofer no tuviera ningún dato sobre su cliente.
Sin embargo, después de las conversaciones telefónicas, casi todas las propiedades de los objetos Jane y Turista de la clase clsPersona se habrán rellenado. Quizás lógicamente no sea conveniente pedirle a dichas personas telefónicamente que describan su complexión, pero será un dato que rellenaremos próximamente.
Gracias a nuestra descripción telefónica, Jane también habrá podido rellenar el objeto Reclutador de la clase clsPersona.

Al cambiar los valores de las propiedades de la clase, podemos cambiar el estado del objeto. El estado de un objeto viene determinado por los valores de las propiedades que se usan para describir el objeto. 

Las personas no suelen cambiar de enombre, aunque también puede llegar a suceder. De igual modo, las personas ganan y pierden peso, se tiñen el pelo, se ponen lentes de contacto de colores, cambian de ropa, y cambian de accesorios personales.
Si cualquiera de estas propiedades cambia de valor, el estado del objeto -por definición- también cambia.  

Es también evidente que el valor de las propiedades, son lo que permiten a alguien distinguir al objeto Jane del otro objeto Reclutador de la clase clsPersona.

Métodos de la clase

Al igual que existen los valores de las propiedades que definen el estado de un objeto, generalmente también hay métodos de clase que actúan sobre las propiedades. Un objeto de la clase clsPersona, hablará, moverá los brazos, caminará, cambiará de ropa, y así sucesivamente. En resumen, los métodos de clase determinan los comportamientos o acciones que el objeto puede realizar.
Los métodos de clase a menudo se utilizan para manipular los datos contenidos en el objeto.

Algunos métodos se utilizan para obtener los valores de las propiedades.Por ejemplo, saber si la persona usa gafas o no. También hay métodos que realizan acciones. Por ejemplo, mover a la persona a una determinada posición. Por último, hay métodos que realizan cálculos y pueden devolver un valor para utilizarlo posteriormente en otro método que lo necesite.

Si lo piensa con detenimiento, una propiedad de una clase puede ser vista como un sustantivo: una persona, lugar o cosa que sirve para designar un objeto. Los métodos de clase, por el contrario, a menudo se comportan como verbos, ya que denotan algún tipo de acción a realizar en las propiedades de la clase (es decir, los datos de la clase) o una acción que el objeto puede realizar.

Breve historia de la OOP


SIMULA 1 (1962) y Simula 67 (1967) fueron los dos primeros lenguajes orientados a objetos que se crearon, con la finalidad de hacer simulaciones. Sus autores fueron Ole-John Dahl y Nygaard Kristen, del Centro de Cómputo Noruego en Oslo.

Pero la OOP no tuvo un éxito inmediato y no se asentó hasta los 90 con la llegada de C++, que aunque fue un lenguaje que apareció en 1983, se usaba en aquel entonces para programar estructuradamente.

Aunque quizás el lenguaje que más hizo crecer la popularidad de la OOP fue Java. El éxito de este lenguaje y su capacidad para funcionar en todas las plataformas, hizo que la OOP se convirtiera en un una propuesta tecnológica que ha sido adoptada por una gran parte de la comunidad de programadores y que trata de resolver uno o varios problemas claramente delimitados.

C# es la respuesta de Microsoft al lenguaje Java y nace por una necesidad que tenía Microsoft, por crear un lenguaje que funcionara con todas las plataformas en las que la empresa americana tiene negocios. Estas plataformas a día de hoy serían: Windows, Xbox y Windows Phone. Anteriormente se unía a estas plataformas línea de reproductores multimedia portátiles Zune, pero Microsoft decidió suspender esta marca.