ART: Programación Orientada a Objetos con Escenario del Mundo Real


Normalmente se hacen consultas sobre escenarios reales para explicar la Programación Orientada a Objetos y en muchas ocasiones no se encuentran respuestas. Esta es la razón por la que escribo este artículo. Este artículo es de principal interés para todos quienes conociendo los conceptos teóricos de la Programación Orientada a Objetos(POO) pero no son capaces de vincular el mundo real con el mundo de la programación.

La Programación Orientada a Objetos es básicamente considerado como una metodología de diseño para la creación de una aplicación que no es rígida.

En POO toda lógica está escrita para hacer nuestro trabajo, pero esto esta hecho basado en entidades el cual lo denominamos como objetos. La POO nos permite descomponer nuestro problema en pequeñas unidades de trabajo los cuales son accedidos por los objetos. Construimos funciones dentro de estos objetos. Existen cuatro pilares(características) principales de la POO.
  • Abstracción
  • Encapsulación
  • Herencia
  • Polimorfismo
Si todas estas características se cumplen en nuestra programación, entonces podemos decir que estamos perfectamente aplicando la Programación Orientada a Objetos. 
Vamos a considerar un ejemplo para explicar cada pilar, el mismo que al final hará que entiendas y sigas la Programación Orientada a Objetos. Antes necesitamos conocer algunas cosas.
Cuando tomamos un Mobile(Teléfono Celular) como un objeto, su funcionalidad básica para la cual fue inventada es llamar y recibir una llamada y mensaje. Pero ahora miles de característica y modelos han sido agregados y la cuenta todavia se incrementa.

En el siguiente diagrama, cada marca(Samsung, Nokia, IPhone) tienen sus propias lista de características con funcionalidades básicas de marcar y recibir una llamada y un mensaje.

Cuando hablamos de la POO, como la palabra indica este hablaría acerca de un objeto(Objeto del mundo real).

Objeto

Cualquier entidad del mundo real que puede tener algunas característica o puede realizar algunos trabajos es llamado como Objeto. Un objeto es también llamado como una instancia es decir una copia de la entidad en el lenguaje de programación. Si consideramos el ejemplo de arriba, una compañía de fabricación de mobiles, fabrica lotes de cada modelo que en realidad son instancias. Estos objetos son diferenciados unos de otros a través de una identidad u otra característica a esto se le dá un nombre único.

Mobile mbl1=new Mobile();
Mobile mbl2=new Mobile();


Clase

Una clase es un plantilla, el mismo que describe a un objeto. Lo llamamos como un proyecto original de cómo los objetos deberían ser representados. Principalmente una Clase debería consistir de un nombre, atributo y métodos. Considerando el ejemplo de arriba, un Mobile puede ser una clase la misma que tiene atributos como Tipo de Perfil, Número, Procesador, etc. Y operaciones como marcar, recibirMensaje y enviarMensaje. 

Existen algunos principios de la POO que necesitan ser mirados mientras se crean cualquier clase. Este principio es llamado como SOLID, donde cada letra tiene alguna especificación. No voy a profundizar mucho en esto, en una sola línea aclararemos algunos puntos.

SRP(the Single Responsability Principle).-
Una Clase debería tener solo una responsabilidad.
OCP(The Open Closed Principle).-
Se debería ser capaz de extender el comportamiento de una clase, sin modificar este(herencia).
LSP(The Liskov Substitution Principle).-
Las clases derivadas deben ser sustituibles en sus clases bases(Polimorfismo).
ISP(The Interface Segregation Principle).-
Hacer una interfaz bien específica en lugar de una interfaz enorme. Los que implementan la interfaz no pueden ser obligados a implementar una interfaz que no utiliza.
DIP(The Dependency Inversion Principle).-
Dependerá de las abstracciones y no de la concreciones(Abstracción).
Ahora esta clase es representada como sigue.




Abstracción
La abstracción dice, solo mostrar detalles relevantes y el resto ocultarlos. Este es el pilar más importante de la POO ya que nos esta proporcionando las técnicas para ocultar los detalles irrelevantes del usuario. Si se considera un ejemplo de cualquier Mobile como Nokia, Samsung o IPhone.

Alguna características de los Mobiles.
  • Marcar un numero, llama a otros métodos internamente el cual concatena los numeros y muestra en la pantalla, pero todo lo que esta haciendo nosotros no lo conocemos.
  • Haciendo click en el botón verde enviando la señal para llamar el Mobile de la persona pero no nos damos cuenta de como lo esta haciendo.
Esto es llamado abstracción en donde crea métodos que toman algunos parametros y retornan algun resultado despues de alguna logica de ejecución sin conocer lo que esta escrito en el método.



Encapsulación

La encapsulación es definido como el proceso de encerrar uno o más detalles de la clase del mundo exterior a través de derechos de acceso. Dice cuanto acceso se debe dar a los detalles particulares. Ambos abstracción y encapsulación trabajan de la mano porque la abstracción dice que detalles serán hechos visible y la encapsulación provee el nivel de derecho de acceso adecuado del detalle, es decir este implementa el nivel deseado de la abstracción.
hablando acerca de Bluetooth es cual usualmente tienen nuestros mobile. Cuando lo encendemos somos capaces de conectar a otro mobile, pero no somos capaces de acceder a otras características del otro mobile como marcar un número, acceder al bandeja de correo,etc. Esto se debe,a que la función de Bluetooth se da un cierto nivel de abstracción.
Otro punto es cuando el mobile A se conecta con el mobile B a través de Bluetooth mientras en mobile B ya esta conectado al mobile C, entonces el mobile A no puede conectarse a través del mobile B y C. Esto es porque existe una restricción de accesibilidad. Esto es manejado por el especificador de acceso como public, private, protected y internal.



Polimorfismo

El polimorfismo puede ser definido como la capacidad de hacer la misma operación pero con diferentes tipos de entradas. Más precisamente lo decimos como “muchas forma de una sola entidad”. esto juega un rol vital en el concepto de la POO.
Vamos a decir el Mobile Samsung tiene 5MP de camara disponible, es decir este tiene una funcionalidad CameraClick(). Ahora mismo el mobile tiene modo Panorama disponible en la camara, esta funcionalidad debería ser el mismo con modo. Este tipo se dice que es polimorfismo estático o polimorfismo en tiempo de ejecución. Ver el siguiente ejemplo.



El polimorfismo en tiempo de compilación el compilador conoce cuál método sobrecargado es el que va a llamar.
El compilador verifica el tipo y número de parámetros pasados al método y decide cuál método llamar y este dará un error si no hay métodos que coincidan con la firma del método y del método que es llamado en tiempo de ejecución.
Otro punto en el que en EnviarMensaje tenia la intención de enviar un mensaje a una sola persona a la vez, pero supongamos que Nokia habría dado provisión para enviar mensajes a la vez a un grupo, es decir redefiniendo la funcionalidad para enviar mensaje a un grupo. Este tipo se llama polimorfismo dinámico o polimorfismo en tiempo de ejecución.

Para sobreescribir necesitamos asignar el método a sobreescribir como virtual y su nueva aplicación debe ser decorado con la palabra clave override. 




Herencia

Capacidad de extender la funcionalidad de la entidad base en una nueva entidad que pertenece al mismo grupo. Esto nos ayudará a reusar la funcionalidad el cual es definido con anticipación.
Considerando el ejemplo de arriba el mismo que muestra que es herencia. La funcionalidad básica del Mobile es enviar mensaje, marcar y recibir llamada. Así que las marcas de mobiles es el uso de esta funcionalidad básica mediante la ampliación de la funcionalidad de la clase Mobile y añadiendo sus propias características nuevas a sus respectivas marcas.

Hay 4 principales tipos de herencia:
  1. Herencia de único nivel
  2. Herencia de multi nivel
  3. Herencia jerárquica
  4. Herencia híbrida

Herencia de único nivel

En una herencia de único nivel, hay una única clase base y una única clase derivada es decir, las características de una clase base Mobile es extendida por la marca Samsung.


Herencia Multinivel
En una herencia de varios niveles, hay más que una solo nivel de derivación, es decir después de las características de la clase base que son extendidos por la marca Samsung. Ahora la marca Samsung ha fabricado su nuevo modelo agregando nuevas características o Sistema Operativo Avanzado como Android OS. Desde la generalización, entrar en más especificaciones. 



Herencia Jerárquica
En este tipo de herencia, múltiples clases derivadas serán extendidas de la clase base, esto es similar a la herencia de un solo nivel pero ahora junto con Samsung, Nokia también está tomando parte en la herencia.


Herencia Híbrida
Herencia Simple, múltiple y jerárquica todos juntos construyen una herencia híbrida.






Interface
Herencia múltiple donde la clase derivada se extenderá de múltiples clases bases.

Samsung usará la función de multiples telefonos(Mobile y Telephone). Esto crearía una confusión para el entendimiento del compilador para entender qué función debe ser llamada cuando cualquier evento en el teléfono dispara como Marcar() donde marcar esta disponible en ambos telefonos(Mobile y Telephone). Para evitar esta confusión C# vino con el concepto de interfaz que es diferente de la herencia múltiple en realidad.

Si tomamos una interfaz que es similar a una clase pero sin aplicación y solo declaración de propiedades, métodos delegados y eventos. La interfaz en realidad refuerza la clase para tener un modelo de contrato para proveer la implementación a los miembros de la interfaz.

Entonces ¿Cuál es el uso de la interfaz cuando no tiene ninguna implementación? la respuesta es que son útiles para tener contratos ya hechos, solo tenemos que implementar la funcionalidad en ese contrato.

Quiero decir , Marcar() podría permanecer en caso de Mobile y Telephone. No sería justo si le damos un nombre diferente cuando su tarea es llamar a la persona.

La interfaz es definido con la palabra clave “interface”. todas las propiedades y métodos con la interfaz deberían ser implementados si esto ha sido usado. esta es la regla de la interfaz.




Conclusión

Siguiendo el principio anterior y teniendo en cuenta los cuatro pilares de la POO, llevaría a desarrollar un buen programa y su vinculación con el escenario del mundo real le hará pensar mas profundamente. Espero que el artículo haya sido de tu completa satisfacción, y no te olvides de compartir tus comentarios, y sabes que compartir es valioso sin importar lo que pase.

TUT: Aprender ASP .NET MVC Paso a Paso en 7 dias(Día 4)

Contenido
¿Cuál es la Agenda?
  • Lab 15: JSON, MVC y JQuery
  • Lab 16: Gestión de Sesiones en MVC(ViewData, ViewBag, TempData y Variables Sesión)
  • Lab 17: Controles Asíncronos
  • ¿Que hay para el quinto día?

¿Cuál es la Agenda?
Este artículo es la continuación de Aprender paso a paso en 7 días y puedes revisarlo en los link siguientes:
Lab 15: JSON, MVC y JQuery
En caso seas nuevo en JSON por favor lee esto antes empezar con este laboratorio, Acerca de JSON.
En este laboratorio vamos a exponer un simple objeto “Customer” de MVC en formato JSON y consumimos el mismo usando Jquery.

Para este laboratorio por favor asegurarse que el proyecto el nombre del proyecto se MvcCuartoDia y crearse use la plantilla de proyecto básico esto es necesario para incluir las librerías Jquery en el proyecto MVC.


Paso 1: Crear un simple modelo Customer
El primer paso es crear una simple clase modelo “Customer” en el proyecto.

Paso 2: Exponer el objeto “Customer” como JSON
Ahora agregamos un controlador “Customer”, para exponer el objeto customer en formato JSON necesitamos usar “JsonResult” como se muestra en el siguiente código.


Por favor, ejecute el controlador con la acción JSON anterior para comprobar que el resultado JSON se muestra correctamente. Si estas usando Chrome el resultado se muestra en el navegador, si este es Internet Explorer este descargara un archivo.

Paso 3: Consumiendo el controlador JSON en Jquery
En caso seas nuevo en Jquery, por favor leer esto ¿Que es Jquery?

El siguiente paso es consumir los datos JSON usando una vista MVC. Asi que adelante Añadimos una vista con el nombre AprenderJquery.cshtml

Lo primero es agregar la referencia a la libreria Jquery en la parte superior de la pagina. en caso no encuentras jquery en el proyecto esto significa que no has creado el proyecto usando la plantilla basica o sino puedes instalarlo de forma manual usando la Consola de Administracion de paquetes de Visual Studio, esto lo explico al detalle en el artículo cargar vistas parciales en ASP.NET MVC usando Jquery Ajax o tambien usando CDN como lo explico es este tips de CDN.

Usando sintaxis html

Usando sintaxis razor

Puedes entonces hacer una llamada al controlador que esta exponiendo en formato JSON usando el método “getJson” como se muestra más abajo. Este toma tres parámetros:

El primer parámetro en “getJson” es el URL MVC JSON con el formato de estructura controller/action.

El segundo parámetro es la data a ser pasada. Por ahora esto es nulo como estamos más interesados en obtener datos JSON en lugar de publicar los datos.

El ultimo parametro es el método de devolución de llamada “Display” el cual será invocado cada vez que obtengamos datos JSON del controlador. La función ”Display” también está disponible en el siguiente código. Estoy asignando una alerta con la propiedad name. puedes ver como solamente tipeo data.CustomerCode, no convierto los datos JSON estos son automáticamente convertidos a objetos javascript.


El código completo en la vista MVC lo mostramos abajo. Se creado un simple botón HTML y dentro el evento click en donde se está llamando al método javascript “getJson” el mismo que hace una llamada al controlador JSON y muestra la data JSON en una alerta javascript.


La vista anterior es invocado usando el método “MostrarJson” del controlador Customer creado anteriormente.


Paso 4: Ejecutar la aplicación y ver el dato
Después de haber hecho todos los pasos es hora de ejecutar el proyecto(Ctrl+F5) y digitar en la url http://localhost:50360/Customer/mostrarJson para ver la belleza JSON en ejecución.


Lab 16: Gestión de Sesion en MVC (ViewData, ViewBag, TempData y variables sesión)
La meta principal en MVC es crear aplicaciones web y aplicaciones web usando el protocolo HTTP. Cuando envías una solicitud a la aplicación MVC se atiende la solicitud y se olvida de la solicitud. La próxima vez que el mismo usuario envía la solicitud MVC lo trata como una completa nueva solicitud.

Ahora piensa en la siguiente situación:
  • El usuario final envía la solicitud al sitio MVC
  • MVC envía una pagina de logueo
  • El usuario ingresa detalles adecuados y envía los datos a la aplicación MVC.
  • MVC valida el usuario y enviar la página inicial del sitio. La aplicación MVC ahora se olvida todo lo relacionado con el usuario ya que es apátrida.
  • El usuario hace clic en uno de los link de la página inicial. Esto es enviado a la aplicación MVC y porque la aplicación MVC se ha olvidados de todo lo relacionado con el usuario, le envía una página de inicio de sesión para la autenticación de nuevo… el usuario se sentirá extraño..

Este resumen necesitamos tener algunos tipos de mecanismos el cual nos ayudara a recordar estados entre la solicitud y la respuesta de MVC.

Hay 3 maneras de mantener estados en MVC y estas maneras puede ser usado dependiendo de que capa a qué capa se navegas.

Temp Data: Ayuda a mantener los datos sobre las redirecciones para una única solicitud y respuesta. Ahora la redirección puede ser de controlador a controlador o de controlador a vista.

View Data: Ayuda a mantener datos cuando se mueve de controlador a la vista.


View Bag: Este es un contenedor dinámico alrededor de vista de datos. Cuando usamos el tipo “viewbag” la conversión no es requerido. Utiliza una clave dinámica interna.




Variables sesión: Usando variables sesión podemos mantener datos hasta cerrar el navegador. Demostraremos los fundamentos anteriores con una demostración.

Paso 1: Crear dos controladores “Default1” y “Default2”.
Agregar dos controladores Default1 y Default2.



Paso 2: Establecer Sesion, tempdata, viewdata y viewbag
En el controlador “Default1” dentro del método “Index” asignamos valores a sesión, tempdata, viewdata y viewbag como se muestra en el siguiente código. Una vez que hemos asignado los valores hacemos una redirección a la acción “AlgunaOtraAccion” el cual pertenece al controlador “Default2”.



Paso 3: Leer valores sesión, tempdata, viewdata y viewbag
En el controlador “Default2” capturamos para leer valores asignados en el controlador “Default1”. Una vez que los valores son leídos invocamos a la vista llamada “VistaDatos”.

Por favor note que se esta asignando “ViewData” y “ViewBag” antes de redireccionar a la vista.


La vista “VistaDatos” solo muestra los datos presentados en “TempData”, “Viewdata”, “ViewBag” y “Session”.

Vamo a habilitar un punto de depuración en las acciones de ambos controladores y vamos a ir al controlador Defualt1 y a su método Index http://localhost:50360/default1/index . En esta acción las sesión, tempdata, viewdata y viewbag son cargadas. Debajo podemos ver como se muestran los datos.



Ahora de aquí vamos a redireccionar al controlador “Default2” acción “AlgunaOtraAccion”.

En el controlador podemos ver que obtenemos las variables “TempData” y “Session” pero no “ViewData y “ViewBag”(Ver str3 y str4 con asignados null). En otras palabras “ViewData” y “ViewBag” no hacen persistencia de datos en redirección mientras “TempData” y “Session” si lo hacen.

Cuando la vista se invoca podemos ver todos los datos. En otras palabras los datos “ViewData” y “ViewBag” persistieron del controlador a la vista. Y también los datos “TempData” y “Session” persistieron.

Ahora cuando la vista vista invocada he agregado un HiperlInk “Hazme Click” el cual invoca a la acción “Index” del controlador “Default1”. Esto es para simular una nueva solicitud.


Cuando se hace click en el hipenvinculo. Todas las otras variables se apagan, solo la variable “Session” persiste.Lo podemos ver en la figura siguiente. Esto significa que las variables “Session” pueden persistir entre solicitudes.



Debajo está una tabla resumen que muestra los diferentes mecanismo de persistencia.



Lab 17: Controler Asíncronos
Las aplicaciones MVC al final del día son aplicaciones web los cuales son hospedados dentro de IIS. Ahora cuando cualquier solicitud llega al controlador MVC este genera un hilo del hilo pool y sirve a esta petición. En otras palabras el servidor Web IIS mantiene un grupo de hilos en lugar de crear hilos a partir de cero una y otra vez para obtener beneficios de rendimientos.

Vamos asumir que un servidor web ha creado un pool de hilos de tamaño 2. Ahora esto es solo una suposición porque un pool de tamaño 2 es muy hipotético. Pero para hacer cosas simples consideramos que los pool de hilos son de tamaño 2.

Vamos a decir primero que la solicitud llega al sitio, IIS tira un objeto de pool de hilo ya realizado y empieza a servir la petición. Mientras tanto vamo a decir llega la segunda solicitud en lo que de nuevo el IIS se tira un hilo del pool de hilo y empieza a servir la segunda petición. 

Ahora lo divertido empieza cuando llega la tercera solicitud. El servidor IIS no tiene más objetos de hilos en el pool como ya ya han sido servidos a “request1” y “request2”. Asi que el servidor solo mueve la tercera solicitud a un modo de espera o el servidor puede enviar un mensaje ”503 ocupado” para el cliente.

Esta situación es denominado como “Thread Starvation”. Las situación Thread Starvation se pueden superar al hacer la solicitud “Asincrona”. Así que la petición llega e inmediatamente la solicitud se procesa de manera “Asincrona” y soltando el hilo que sirva la solicitud inmediatamente.

Así que para evitar esto podemos lograr lo mismo, haciendo nuestros controladores “Asincronos”.

Ahora vamos a entender paso a paso como implementar controladores asíncronos en MVC.

Paso 1: Heredar de la clase AsyncController
Considerando la siguiente clase controlador “HeavyController” el cual tiene una acción “AlgunMetodoHeavy” y esta acción espera 20 segundos. Así que vamos a entender cómo podemos hacer este simple controlador Asynch.


Así que el primer paso es heredar de la clase “AsyncController”.


Paso 2: Marcar métodos con el anexo Async
El siguiente paso es añadir la palabra Async después de los métodos. Asi como podemos observar “AlgunMetodoHeavy” ha sido cambiado a “AlgunMetodoHeavyAsync”.

La lógica de código de Heavy es decir “Thread.Sleep()” is movido a un metodo diferente y este método es invocado usando la tarea de la librería paralela de “AlgunMetodoHeavyAsync”.

Cada vez que una “Task” o un “Thread” es iniciado nosotros incrementamos el contador de OutstandingOperations pero usando “AsyncManager” y cada vez que una tarea multi-threaded es completada decrementamos el contador.


Paso 3: Crear el método completado
Ahora una vez todas las tareas multi-threaded completadas y el OutstandingOperations esta cero necesitamos retornar la vista. Asi para el mismo necesitamos crear un metodo ActionResult con la palabra Completed anexada. Este método se llama cuando todas OutstandinOperations son cero.



Paso 4: Asegurarse de crear la vista “AlgunMetodoHeavy.cshtml”
También asegurarse de agregar la vista “AlgunMetodoHeavy” con el siguiente texto dentro.


Paso 5: Ejecutar y disfrutar
Ahora digitar en el navegador “http://localhost:50360/heavy/AlgunMetodoHeavy” y ver la salida. 


TIP: ¿Qué es Jquery?


¿Qué es Jquery?
Jquery es una librería javascript reutilizable el cual simplifica la codificación javascript.

Así que en lugar de escribir largos códigos como se muestra:


Usando Jquery el código javascript de arriba, es ahora simplificado como este que se muestra:

¿Como usar estas librerías Jquery?
Nenesitamos descargar el archivo Jquery.js de http://jquery.com e incluir en nuestras propias paginas web. Los archivos Jquery son llamados con el numero de versión como “jquery-1.8.1.js” donde 1.8.1 es la versión del archivo JS. En la parte superior de su página necesitas incluir la referencia como se indica en el siguiente código:

TIP: Acerca de JSON


¿Qué es JSON?
JSON significa JavaScript Object Notation. JSON es un lenguaje ligero, independiente del formato de intercambio de datos.

¿Como JSON formatea ?
El formato de JSON es como se muestra en el código de abajo. Este empieza con una simple llave de apertura, seguido con valores separados por comas y finalmente termina con una llave 
La parte buena de JSON simplemente se traduce a objetos javascript. Por ejemplo en la siguiente imagen puedes ver como la variable persona ha sido transformado en un objeto persona las propiedades “FirtName” y “LastName”.

TIP: Actualizar tablas relacionadas en T-SQL

En Sql Server tuve la necesidad de hacer una actualización en tablas relacionadas tipo maestro - detalle. Me di con la sorpresa que no se podía ya que me tiraba un error de dependencia Foreign key y no me permitía actualizar el campo de relación en ninguna de las dos tablas.

Así que averiguando por ahí encontré la solución lo primero que hay que realizar es asegurarse que en la relación está habilitado la la actualización y eliminación en cascada y para realizar esto correr el siguiente script.

Ahora si solo actualizamos la tabla cabecera y la tabla detalle automáticamente se actualizará.

TIP: CDN o link para algunos componentes web


Los CDN(content Distribuitor Networking), son servicios de alojamiento que brindan algunos empresas con el fin de brindar los componentes en linea, hacer uso de algún CDN hace más rápida y eficiente la carga de nuestras páginas web, y puede suceder que algun otro desarrollador este usando la misma CDN que nosotros y este cargado en la cache lo cual no seria necesario volver a cargar el CDN.

Por ejemplo:

JQUERY
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

AngularJS
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>

La empresa Google tiene alojado los principales componentes en sus servidores:
https://developers.google.com/speed/libraries/devguide