martes, 15 de diciembre de 2009

Curso de Programación C #: Clases, Objetos, Encapsulacion

Clases
Lo primero que nos viene a la mente cuando leemos esto es ¿Qué es una clase? e inmediatamente después de eso nos preguntamos ¿Para qué sirve una clase?, bueno una definición de clase sería que es una representación abstracta de un objeto, pero esto nos deja con bastantes interrogantes, veamoslo en español, je, je, je, un objeto puede ser cualquier cosa, por ejemplo una casa, la clase es la reprentación abstracta del objeto, en este caso serian los planos de la casa, en ellos la casa se ve representada por completo, ya que en el plano podemos ver que tendrá la casa, donde lo tendrá, como estará hecho, más sin embargo no podemos sentarnos en las escaleras del plano de la casa porque la casa aún no existe, la clase es solo el plano del que después podremos construir el objeto, más sin embargo una clase por si sola no nos es de utilidad en lo absoluto hasta que la convertimos en un objeto, es decir no podemos habitar el plano de una casa, necesitamos construirla es decir construir el objeto, a dicho proceso de construcciòn se le llama instancia. Ejemplo:
class Casa
{
decimal Altura;
decimal Ancho;
decimal Profundidad;
string Color;
void Entrar();
void Salir();
}
Ahora tenemos un ejemplo mas formal de lo que sería una clase, en este ejemplo declaramos una clase llamada Casa, una Casa en la vida real tiene diversas caracteristicas o "Atributos", la clase guarda dentro de si tanto los atributos de la Casa como la forma en que se comportara, dicho comportamiento define como reaccionara ante otras clases. Una vez que se ha definido la clase Casa TODA clase que heredase de ella tendria todas las caracteristicas de nuestra Casa original.
Objetos
Un objeto es la consolidación de una clase, retomando el ejemplo de la casa, deciamos que los planos de la Casa serian la Clase casa, es decir la representación abstracta del objeto miCasa, pero para que podamos utilizar la clase Casa necesitamos instanciarla, la instancia es el proceso de construir la Casa. Ejemplo:
class Casa
{
decimal Altura;
decimal Ancho;
decimal Profundidad;
string Color;
void Entrar();
void Salir();
}
Tomando como Base la Clase Casa ahora lo que haremos sera declarar miCasa del tipo Casa. Ejemplo: Casa miCasa = new Casa();
Quiza sea un poco dificil de captar al principio, pero en realidad es de lo mas sencillo, miren toda clase es un tipo de datos es decir, en el mundo real existen numeros no decimales menores a cierto tamaño, bueno en C# se creo una clase llamada int para representarlos de manera abstracta, es por esto que cada que declaramos un entero declaramos:
int miNumero = 0;
tipo nombre valor
Pero porque usamos new y los (), bueno, porque en el caso de los enteros(int) simplemente contienen un dato y no hacen nada mas son simples contenedores, sin embargo las clases que a nosotros nos interesan y que son las que estaremos creando deben actuar de distintas maneras, ya sea leyendo bases de datos, actualizando paginas web, realizando operaciones matematicas, etc., es por esto que se utiliza el operador new, eso nos permite mandarle datos a la clase que hemos creado, supongamos que nuestra clase Casa acepta 3 parametros, Nombre del dueño, Precio y Si esta a la venta o no, bueno pues en ese caso podriamos inicializar nuestra casa asi:
Casa miCasa = new Casa("Jorge","$1,408,506","SI");
Estos parametros de entrada provocan que el objeto "reaccione" realizando una serie de acciones, como por ejemplo, publicar la casa en un sitio web de venta de casas, es un ejemplo sencillo, pero que nos da una idea de como reaccionan los objetos. Una caracteristica de los objetos es que presentan siempre 3 caracteristicas: Identidad, Comportamiento y Estado.
+ Identidad: Nos permite distinguir a un objeto de los demás obejtos en la misma clase, por ejemplo imaginemos que tenemos una casa igual que la de nuestro vecino, como en los conjuntos habitacionales donde todas las casas son iguales en ese caso el Número de casa es lo que nos distingue, porque aunque tuvieran el mismo color, los mismos arreglos al frente, etc., 2 casas no pueden tener el mismo numero.
+ Comportamiento: Esto hace utiles a los objetos, ya que los objetos existen para hacer algo, si los objetos no hicieran nada no tendría chiste crearlos, el comportamiento hace accesible a un objeto, asi mismo los objetos que vienen de una misma clase comparten el mismo comportamiento, por ejemplo, una Casa es una Casa porque se puede habitar, un Carro es un Carro porque se puede manejar, etc.
+ Estado: Tiene que ver con el funcionamiento interno de una clase, dicho funcionamiento interno es el que le permite proporcionar su comportamiento. Un objeto bien diseñado mantiene inaccesible su estado, esto es porque a uno no le interesa como le hace un objeto para hacer lo que hace, a uno simplemente le interesa que lo haga.
Para diseñar objetos es importantisimo tomar en cuenta lo siguiente:
+ Decidir lo que es importante y lo que no, es decir, enfocarse en lo que es importante y depender sólo de ello.
+ Ignorar lo que no es importante y no depender de ello, basandonos en el principio de Dependencia mínima
+ Utilizar la Encapsulación para aplicar la Abstracción.
Es fácil quedar abrumado ante la inmensa cantidad de atributos y comportamientos que puede tener un objeto es por ello que es de vital importancia concentrarse tan solo en aquello que es importante, si en los planos se incluyeran detalles de donde pondrá la lavadora, la t.v., donde encadenará al perro, donde estará el clavo para sujetar su reloj, etc., sería increiblemente tedioso y abrumador el representarlo, es por esto que solo se debe uno concentrar en los detalles que REALMENTE importan, a eso se le llama abstracción. La abstracción es una técnica que nos permite quitarle a un objeto todos aquellos comportamientos que son innecesarios hasta que el objeto solo tiene dentro de si aquellos comportamientos que son esenciales para su funcionamiento, una buena abstracción elimina todos los detalles poco importantes y le permite enfocarse y concentrarse SOLO en los detalles importantes. Debemos recordar que un objeto deberá siempre aplicar el concepto de Dependencia mínima por motivos de encapsulación la dependencia mínima permite que las cosas complejas sean simples, esto se logra al ocultar los aspectos no esenciales de una clase, estos aspectos una vez ocultados, no se pueden ver ni utilizar.

Encapsulación
+ Combinar datos y métodos en una entidad única
+ Controlar el acceso a los datos y los métodos
- Público Accesible desde fuera
- Privado Accesible solo desde adentro
Pero ¿Porqué es útil encapsular?, sencillo, la encapsulación minimiza el impacto, es decir si algún día nos vemos en la necesidad de actualizar algunas clases de nuestro programa, entre menos dependamos de una clase menos impacto tendrá el hecho de que se cambie, así mismo nos permité esconder los detalles de implementación de nuestro programa, lo que aumenta su resistencia a ataques, esto debido a que al declarar metodos y/o variables como privadas las ocultamos y dejan de ser visibles para las demas clases.

Creación de una Clase Sencilla
class Persona
{
public int Edad;
public string Nombre;
private string Direccion;
}
Lo que hacemos es declarar dos variables publicas que pueden ser accedidas sin problemas desde el exterior y una variable privada que solo puede ser utilizada por miembros de la clase, ahora para utilizar nuestra clase persona necesitamos crear una persona:
Persona Alejandro = new Persona(); //Acabo de nacer, ¿como ven?, je, je, je
Alejandro.Edad = 22;
Alejandro.Nombre = "Alejandro Domingo Velazquez Cruz";
Recordemos que cada objeto se trata por separado, es decir por referencia, lo cambios que realicemos a cualquier otra persona que creemos no afectaran a Alejandro, por ejemplo:
Persona Carmen = new Persona();
Carmen.Edad = 21;
Carmen.Nombre = "María del Carmen Lopez Villegas";
Alejandro.Nombre sigue siendo Alejandro Domingo Velazquez Cruz y Carmen.Nombre es María del Carmen Lopez Villegas y los cambios que realicemos a cualquiera de ellos no afectan al otro en lo absoluto. Ahora veamos si nosotros pusieramos algo así:
Alejandro.Direccion = "Norte 5";
El compilador marcaría error, ya que esa variable solo puede ser accedida desde adentro de la clase, ya sea por medio de algún método público o declarando un atributo público para permitir el acceso a ese dato, es decir, nosotros sabemos que existe la variable porque nosotros hemos hecho la clase, pero sin embargo no se puede acceder a esa variable, ni siquiera sabiendo que existe, a esto se le llama ocultamiento, ya que la variable queda "oculta" a las demás clases, podemos ocultar tanto variables como métodos e inclusive se pueden ocultar clases. Por último hemos aprendido a crear objetos, pero y ¿Comó destruirlos?, bueno C# hace uso de la recuperación automatica de memoría gracias a su Recolector de Basura, lo más que podemos hacer es marcar un objeto para indicar que ya puede ser recolectado, esto generalmente no es necesario, ya que el Recolector de Basura detecta cuando un objeto ya no está siendo utilizado porque no ahi ningún otro objeto que tenga su dirección, pero eso lo veremos después.

No hay comentarios:

Publicar un comentario