lunes, 1 de julio de 2013

Tipos de Datos Básicos en C# - Parte 2

Tabla de Contenido

0. Introducción
1. Miembros de un Tipo de Dato
2. Simetría de Tipos de Datos Predefinidos y Personalizados
3. Constructores e Instanciación
4. Miembros de Instancia vs Miembros Estáticos
5. La Palabra Clave public
6. Conclusiones
7. Palabras Clave
8. Referencias

0. Introducción

Cada lenguaje de programación compatible con la CLR cuenta con un conjunto de tipos predefinidos (Tipos Básicos en C# - Parte 1) y otros incluidos en las librerías de NET. Framework. En esta ocasión, además, manejaremos los conceptos de miembros de instancia y miembros estáticos, cuando definamos nuestros propios tipos de datos o utilicemos tipos del Framework (i.e., Console).

Para la introducción del concepto de tipos de datos personalizados recurriremos a la clase ConvertidorUnidades:

Archivo C# ConvertidorUnidades.cs [Enlace alternativo][Enlace alternativo]:

De este código fuente C# exploraremos sus miembros integrantes, como:
  • Campo miembro, 
  • Función miembro.
Desde luego también será importante que entendamos su función para el diseño e implementación de tipos de datos personalizados.

1. Miembros de un Tipo de Dato

El programador tiene la posibilidad de crear sus propios tipos de datos. Cada tipo de dato está compuesto por miembros de tipo. Estos miembros de tipo pueden ser funciones o datos. Por ejemplo, en la clase ConvertidorUnidades, el campo unidades representa un campo miembro, por otro lado, Convertir es una función miembro para esa clase. También hay que tener en cuenta que el constructor (ConvertidorUnidades) de la clase se considera una función miembro.

Los miembros del tipo ayudan a definir la estructura del tipo de dato; por lo cual, tenemos la posibilidad crear miembros (por ejemplo, campos, funciones (métodos, eventos, propiedades), entre otros) según sea necesario para modelar una entidad del mundo del problema (o dominio).

2. Simetría de Tipos de Datos Predefinidos y Personalizados

El concepto práctico de simetría [1] de tipos de datos predefinidos se entiende así en código fuente C#

int i = 42;
Console.WriteLine(i.ToString()); // invocación de ToString sobre una variable tipo int


Lo mismo ocurre con tipos de datos integrados; como es el caso de la estructura DateTime de la BCL de .NET Framework:

DateTime d = DateTime.Now;
Console.WriteLine(d.ToString()); // invocación de ToString sobre DateTime

Observe que el sistema de unificación de tipos de C# es el que permite este aspecto simétrico del lenguaje. A nivel de miembros la simetría reside en datos de instancia que guardan el estado del objeto y las funciones miembro que modifican/obtienen el estado. Lo anterior ocurre para ambos tipos (i.e. predefinidos y personalizados).

[Nota: Gracias a la aclaración del concepto de simetría [5] por Jon, a mi pregunta en StackOverflow.]

3. Constructores e Instanciación

Siempre que queramos crear datos y usarlos a partir de un tipo de dato, debemos crear una instancia con la invocación a un constructor (si es requerido, hemos de especificar datos de inicialización). Un ejemplo de este proceso se ve en:

ConvertidorUnidades piesAPulgadasConvertidor = new ConvertidorUnidades(12);
ConvertidorUnidades millasAPiesConvertidor = new ConvertidorUnidades(5820);

La creación e inicialización de un objeto de un tipo de dato, ocurre con la especificación del tipo (ConvertidorUnidades), un identificador (e.g.piesAPulgadasConvertidor), el operador de asignación (=), el operador new [3], y el constructor  del tipo de dato (para el caso, ConvertidorUnidades(int)). Existe una diferencia sutil entre la creación de objetos de tipos de datos integrados: no es necesario que usemos el operador new:

int i = 42;
double pi = 3.14159215;
char c = 'z';
bool b = true;

3.1 Acerca de Constructores

Los constructores son un tipo de método especial, debido a que a diferencia de un método de definición de comportamiento, los constructores no requieren de la especificación de un tipo de retorno. Observemos la definición del constructor ConvertidorUnidades:

public ConvertidorUnidades(int unidadesConversion) // Constructor
{
unidades = unidadesConversion;
}

Una clase puede tener el número de constructores necesarios para cumplir con el diseño del tipo de dato en cuestión. Además, los constructores pueden ser sobrescritos (este tema lo veremos con más detalle en publicaciones posteriores).

[Nota: Más acerca de constructores en [6].]

4. Miembros de Instancia vs. Miembros Estáticos

Tanto los datos miembro como las funciones miembro de una instancia se conocen como miembros de instancia. Si vemos en ConvertidorUnidades, esta clase cuenta con una función miembro llamada Convertir y un dato miembro llamado unidades. En su defecto, los miembros de una clase son miembros de instancia, como en los casos anteriores. En caso contrario, si especificamos explícitamente en la declaración la palabra clave static, el miembro es estático.

Para ejemplificar el uso de miembros estáticos, recurramos a .NET Framework. La clase Console es una clase estática y todos miembros tienen esa misma propiedad: Console.WriteLine() es un ejemplo de método estático que reside en la clase Console.

Para contrastar, utilicemos el siguiente ejemplo.


En este código cliente creamos dos instancias (objetos) del tipo de dato personalizado Panda, con lo cual podremos demostrar el uso de miembros estáticos.

Archivo C# Panda.cs [Enlace alternativo][Enlace alternativo]:

En la primera invocación al campo Panda.Poblacion, en la línea 10, el valor que se mostrará en pantalla será 1; esto debido a que por cada objeto Panda que se cree el campo se incrementará en una unidad: Poblacion = Poblacion + 1; (línea 10 en la clase Panda). En la siguiente invocación a Panda.Poblacion en pantalla aparecerá 2. Esto será ocurriendo de forma incremental cada vez que invoquemos a Panda.Poblacion.

5. La palabra Clave public

La palabra clave public [4] permite exponer miembros (datos o funciones) a clases cliente. La clase Panda tiene dos datos miembro con esta clasificación: Nombre y Poblacion. El constructor también es public.

En términos de programación orientada a objetos, los miembros públicos se encargan de encapsular los miembros privados de la clase, y en consecuencia, aislar el funcionamiento interno de la definición del tipo de dato.

6. Conclusiones

Hemos entendido el concepto de datos y funciones miembros como elementos formadores de una estructura . Hemos apreciado el factor de simetría entre tipos de datos predefinidos y personalizados. También vimos el concepto de miembros estáticos, útiles para compartir comportamiento y datos entre instancias (objetos) de un mismo tipo de dato. Para culminar, revisamos, en breve, el uso de la palabra public para encapsular el funcionamiento interno de un tipo de dato.

7. Palabras Clave

  • Constructor
  • Dominio del problema
  • Encapsular
  • Función
  • Método
  • Miembro
  • Mundo del problema
  • Programación orientada a objetos
  • Tipo de dato
  • Tipo de retorno

8. Referencias

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: Members - http://msdn.microsoft.com/en-us/library/vstudio/ms173113.aspx
[3]: new Operator - http://msdn.microsoft.com/en-us/library/fa0ab757.aspx
[4]: public - http://msdn.microsoft.com/en-us/library/ms173121(v=vs.80).aspx
[5]: What does mean “symmetry” between predefined types and custom types? - http://stackoverflow.com/questions/17374867/what-does-mean-symmetry-between-predefined-types-and-custom-types
[6]: An Intro to Constructors in C# - http://www.codeproject.com/Articles/7011/An-Intro-to-Constructors-in-C
V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.