sábado, 11 de mayo de 2013

Programación Orientada a Objeto en .NET

Todo .NET Framework está basado en clases (u objetos). A diferencia de las versiones anteriores de Visual Basic, la versión .NET de este lenguaje basa su funcionamiento casi exclusivamente en las clases contenidas en .NET Framework, además casi sin ningún tipo de limitación.  La programación orientada a objetos puede describirse como el conjunto de disciplinas que desarrollan y modelizan software que facilitan la construcción de sistemas complejos a partir de componentes.
El atractivo intuitivo de la orientación a objetos es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible. Estos conceptos y herramientas orientados a objetos son tecnologías que permiten que los problemas del mundo real sean expresados de modo fácil y natural.
Las técnicas orientadas a objetos proporcionan mejoras y metodologías para construir sistemas de software complejos a partir de unidades de software modularizado y reutilizable. Se necesita un nuevo enfoque para construir software en la actualidad. Este nuevo enfoque debe ser capaz de manipular tanto sistemas grandes como pequeños y debe crear sistemas fiables que sean flexibles, mantenibles y capaces de evolucionar para cumplir las necesidades del cambio.
La programación orientada a objetos trata de cubrir las necesidades de los usuarios finales, así como las propias de los desarrolladores de productos software. Estas tareas se realizan mediante la modelización del mundo real. El soporte fundamental es el modelo objeto.

Pilares en la Programación Orientada a Objetos 

Todos los lenguajes basados en objetos, deben cumplir estos tres requisitos:
  • Herencia 
  • Encapsulación 
  • Polimorfismo

Herencia


Esta es la característica más importante de la POO. Según la propia documentación de Visual Studio .NET:

"La herencia permite crear nuevas clases a partir de clases existentes. La herencia puede simplificar el diseño de la aplicación proporcionando una estructura de relaciones entre las distintas clases. También admite la reutilización de código porque sólo se debe codificar el comportamiento de clases nuevas o distintas.".
Una relación de herencia es una relación en la que un tipo (el tipo derivado) se deriva de otro (el tipo base), de tal forma que el espacio de declaración del tipo derivado contiene implícitamente todos los miembros de tipo no constructor del tipo base.

Encapsulación

“La encapsulación es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las clases proporcionan una de las formas más comunes de encapsular elementos."
Cuando usamos las clases, éstas tienen una serie de características (los datos que manipula) así como una serie de comportamientos (las acciones a realizar con esos datos). La encapsulación es esa capacidad de la clase de ocultarnos sus interioridades para que sólo veamos lo que tenemos que ver, sin tener que preocuparnos de cómo está codificada para que haga lo que hace... simplemente nos debe importar que lo hace.

Polimorfismo

"El polimorfismo se refiere a la posibilidad de definir múltiples clases con funcionalidad diferente, pero con métodos o propiedades denominados de forma idéntica, que pueden utilizarse de manera intercambiable mediante código cliente en tiempo de ejecución."
Dicho de otra manera, puede tener múltiples clases que se pueden utilizar de forma intercambiable, si bien cada clase implementa las mismas propiedades o los mismos métodos de maneras diferentes. 
El polimorfismo es importante en la programación orientada a objetos puesto que permite usar elementos que tienen el mismo nombre, independientemente del tipo de objeto que se esté utilizando en ese momento.

Manejo de clases y objetos


Una clase es simplemente una representación de un tipo de objeto. Una clase define las características de un objeto, incluyendo las propiedades que definen los tipos de datos que ese objeto puede contener y los métodos que describen el comportamiento del objeto. Estas características determinan la manera en que otros objetos pueden acceder y trabajar con los datos que se incluyen en el objeto.
Un objeto es una unidad de software que contiene una colección de métodos y datos relacionados. Un objeto es una instancia específica de una clase, e incluye las características de esa clase.
Las abstracciones de datos (atributos) que describen la clase están encerradas por una “muralla” de abstracciones procedimentales (llamadas operaciones, métodos y eventos) capaces de manipular los datos de alguna manera. La única forma de alcanzar los atributos (y operar sobre ellos) es ir a través de alguno de los métodos que forman la muralla. Por lo tanto, la clase encapsula datos (dentro de la muralla) y el proceso que manipula los datos (los métodos que componen la muralla). Esto posibilita la ocultación de información y reduce el impacto de efectos colaterales asociados a cambios.

Atributos

Los atributos están asociados a clases y objetos, y describen la clase o el objeto de alguna manera. Las entidades de la vida real están a menudo descritas con palabras que indican características estables. La mayoría de los objetos físicos tienen características tales como forma, peso, color y tipo de material. Las personas tienen características como fecha de nacimiento, padres, nombre y color de los ojos.

Propiedades

Las propiedades son métodos que permiten acceder o recuperar los valores de los atributos y se implementan mediante los procedimientos Get y Set.

Operaciones y Métodos

Un objeto encapsula datos (representados como una colección de atributos) y algoritmos que procesan estos datos. Estos algoritmos son llamados operaciones o métodos y pueden ser vistos como módulos en un sentido convencional. Los métodos se definen como procedimientos o funciones.

Eventos

Los eventos son el medio a través del cual interactúan los objetos. Un evento estimula la ocurrencia de cierto comportamiento en el objeto receptor. El comportamiento se realiza cuando se ejecuta un método.
Un evento dentro de un objeto emisor genera un mensaje de la forma:
destino.operación (parámetros)
Donde destino define al objeto receptor el cual es estimulado por el mensaje, operación se refiere al método que recibe el mensaje y parámetros proporciona información requerida para el éxito de la operación.
Los eventos proporcionan una visión interna del comportamiento de objetos individuales, y del sistema Orientado a Objetos como un todo.

Constructor

Para inicializar los atributos los nuevos objetos se controla utilizando constructores.
Un constructor es un método que permite inicializar los atributos de una clase. Este método se ejecuta al momento de instanciar la clase. 
Podemos sobrecargar constructores del mismo modo que se sobrecarga cualquier otro método de una clase.

Arquitectura .NET Framework 4.0

La nueva tecnología de Microsoft ofrece soluciones a los problemas de programación actuales, como son la administración de código o la programación para Internet. Para aprovechar al máximo las características de
.Net es necesario entender la arquitectura básica en la que esta implementada esta tecnología y así beneficiarse de todas las características que ofrece esta nueva plataforma.

¿Que es el Framework de .NET?


El Framework de .Net es una infraestructura sobre la que se reúne todo un conjunto de lenguajes y servicios que simplifican enormemente el desarrollo de aplicaciones. Mediante esta herramienta se ofrece un entorno de ejecución altamente distribuido, que permite crear aplicaciones robustas y escalables.
Los principales componentes de este entorno son:
  • Lenguajes de compilación 
  • Biblioteca de clases de .Net 
  • CLR (Common Language Runtime)
image
Actualmente, el Framework de .Net es una plataforma no incluida en los diferentes sistemas operativos distribuidos por Microsoft, por lo que es necesaria su instalación previa a la ejecución de programas creados mediante .Net. El Framework se puede descargar gratuitamente desde la web oficial de Microsoft (ver link de descarga en los recursos del final). 
.Net Framework soporta múltiples lenguajes de programación y aunque cada
lenguaje tiene sus características propias, es posible desarrollar cualquier tipo de aplicación con cualquiera de estos lenguajes. Existen más de 30 lenguajes adaptados a .Net, desde los más conocidos como C# (C Sharp), Visual Basic o C++ hasta otros lenguajes menos conocidos como Perl o Cobol.

Common Language Runtime (CLR)

El CLR es el verdadero núcleo del Framework de .Net, ya que es el entorno de ejecución en el que se cargan las aplicaciones desarrolladas en los distintos lenguajes, ampliando el conjunto de servicios que ofrece el sistema operativo estándar Win32.
La herramienta de desarrollo compila el código fuente de cualquiera de los lenguajes soportados por .Net en un mismo código, denominado código intermedio (MSIL, Microsoft Intermediate Lenguaje). Para generar dicho código el compilador se basa en el Common Language Specification (CLS) que determina las reglas necesarias para crear código MSIL compatible con el CLR.
De esta forma, indistintamente de la herramienta de desarrollo utilizada y del lenguaje elegido, el código generado es siempre el mismo, ya que el MSIL es el único lenguaje que entiende directamente el CLR. Este código es transparente al desarrollo de la aplicación ya que lo genera automáticamente el compilador.
Sin embargo, el código generado en MSIL no es código máquina y por tanto no puede ejecutarse directamente. Se necesita un segundo paso en el que una herramienta denominada compilador JIT (Just-In-Time) genera el código máquina real que se ejecuta en la plataforma que tenga la computadora.
De esta forma se consigue con .Net cierta independencia de la plataforma, ya que cada plataforma puede tener su compilador JIT y crear su propio código máquina a partir del código MSIL. La compilación JIT la realiza el CLR a medida que se invocan los métodos en el programa y, el código ejecutable obtenido, se almacena en la memoria caché de la computadora, siendo recompilado sólo cuando se produce algún cambio en el código fuente.