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.