Fundamentos de POO

La mayoría de los lenguaje de programación creados en los últimos 30 años tiene algo en común, se basan en algo llamado: “Programación Orientada a Objetos”

Antes que nada, no POO (su abreviatura) no es un lenguaje, sino un paradigma.

Ok, ok, ¿Qué demonios es un paradigma?

Paradigma: Forma de Pensar. Así de fácil, POO (ó OOP en inglés, por si algún día te lo encuentras) es una forma de pensar  la programación de manera diferente a lo “tradicional”.

¿Y qué es lo tradicional para empezar?

Pues lo tradicional es la Programación Estructurada, donde en general (y digo general porque si, tienen funciones y cosas así, pero no importa ahora) tu programa es como una receta de cocina: Un conjunto de instrucciones y nada más.

poo1

Tú le dictas a la computadora que quieres que haga y lo hace, sencillo, ¿no?

Pues POO no piensa que sea la manera más fácil (y esto es debatible pero eso queda para otro post) POO piensa que es mucho más fácil si hacemos que todo sea como las cosas de la vida real, si hacemos que todo en la computadora sea como …como objetos.

POO piensa diferente, así que agarrate de tu asiento, porque te voy a mostrar una nueva forma de programar completamente diferente a lo que viste arriba:


¿Qué es POO?

Los objetos de los que hablamos no representan cosas abstractas o “raras” su objetivo es representar cosas de la vida real, como los siguientes:

Se ve fácil, ¿no es así?

Bueno, para seguir adelante tenemos que traer a la mesa dos conceptos, y con ellos lo más difícil de memorizar de toda esta lección.


Clase

Una clase es un plano, es una idea, es una descripción, es una definición.

“Describe como es algo, pero no es ese algo en si”

Podemos tener una definición formal en la que una clase es un prototipo o del que contiene una colección de datos (atributos)  un conjunto de operaciones (métodos) con esos datos que manipulan ESOS datos.

Como por ejemplo el plano de una casa:

plano.png

Plano de una casa

O un ejemplo más común de clases son como los siguientes:

clases.png

Y TODA clase define dos cosas en esencia:

  • Atributos: Estas son las características de tu objeto, son sus cualidades en sí.
  • Comportamiento: Son lo que puede hacer, su forma de comportarse.

Por ejemplo si estuviéramos haciendo una clase de una persona podemos tener algo así:

c1

Pero como a los programadores siempre nos encanta darles nombres raros a las cosas, los nombre comunes con los que se describen esto son:

c2

  • Propiedades: Estas son las características de tu objeto, son sus cualidades en sí.
  • Métodos: Son lo que puede hacer, su forma de comportarse.

Una clase define características y comportamientos comunes compartidos por un tipo de objeto. Se parece más a una plantilla cuando se crea cierto tipo de objeto.

Por ejemplo, tenemos un objeto llamado Cris, y clasificamos a Cris como un humano. No sabemos quién es Cris, pero podemos decir que tiene manos, dedos, ojos, etc. porque sabemos que es humano. Lo mismo sucede con otros objetos del mundo real. Podemos decir cuáles son esas cosas apenas sabiendo sus clases.

Otro ejemplo sería Cris es un programador y su jefe es el gerente, pero podemos decir con seguridad que Cris y su jefe son empleados (en esta frase, hay otro conocimiento sobre OOP, hablaremos de esto más adelante), porque ellos Comparten una característica común, que es su descripción del trabajo.

Pero al final de la historia la clase esta describiendo estas cosas de forma abstracta, después de todo una clase solo es una descripción de algo, te dirá que una persona por ejemplo tiene un nombre o una edad pero no te dirá una edad en especial.

Tenemos una cápsula genérica, un prototipo , del cual parten todos las cápsulas u objetos.

plantilla.png

Esta clase es un nuevo tipo de dato.

De la misma manera que no tiene un mísero sentido hacer un plano si no quieres hacer una casa, no tiene sentido hacer una clase a menos que quieras crear un objeto.


Objetos

“La cosa en si pues”

Los objetos son creados a partir de una clase, de hecho otro nombre muy común de estos son instancias, son instancias de una clase.

casa.png

Plano-Clase y Casa-Objeto

Además podemos crear más de un objeto de una misma clase.

Ejemplo:

Vamos a tomar un ejemplo más detallado de una clase:

Clase: Pokemon

Propiedades:
  nombre
  tipo
  elemento
  tamaño
  sonido

Metodos:
  ataque
  llorar

A continuación, permite crear un objeto de estas características y comportamientos:

Propiedades:
  nombre: Pikachu
  tipo: tipo de ratón pokemon
  elemento: electric
  tamaño: pequeño
  sonido: pika, pika

Metodos:
  cry: Produce un "pika, pika"
  ataque: Ataca a otro pokemon.

La programación orientada a objetos (POO) es un método de implementación en el cual los programas están organizados como colecciones cooperativas de objetos, cada uno de los cuales representa una instancia de alguna clase, y cuyas clases son todas miembros de una jerarquía de clases las cuales están unidas a través de relaciones de herencia.


Puntos Clave de POO

Podemos resumir todas las ideas de POO en los siguientes puntos:

  • Encapsulamiento: Recuerda que las clases son como una caja cerrada, todos los métodos y las variables están dentro y toda la información solo puede ser accedido por medio de sus sistemas propios, esto hace que sea de verdad como una caja cerrada, su información solo entra y sale por las formas y de la forma en que la clase quiera. Puede incluso no importante como funciona por dentro, todo lo que necesitas saber es que funciona.

pildora

  • Herencia o Jerarquía:  Esto es clave, la herencia permite que una clase pueda servir como plantilla para la creación de futuras clases, no te preocupes, explicaremos esto a detalle después.

viejo

  • Polimorfismo: Un solo nombre de una clase o método puede representar diferentes implementaciones. Al igual que un Ferrari y un Porsche. Sabemos que los 2 coches tienen motores diferentes y mecanismos diferentes, pero se que ambos son coches y se conducirlos. Eso es polimorfismo, utilizando diferentes implementaciones pero solo una interfaz.

mariposa

 

Otra de las característica en POO en si se vinculan las funciones y los datos, cosa que no exista.

 

 


Principios de POO

columna

Principios son las Columnas en las que se sustenta POO

Toda esta filosofía se puede simplificar en varias columnas, son los pilares que fundamentan este paradigma.

  • Principio de Abstracción

Modelar, este principio dice que POO busca modelar los objetos, busca atraerse y simplificar un objeto de la vida real a solo un par de atributos. En otras palabras, buscaremos transformar un objeto de la vida real en atributos (características) y sus acciones (métodos). Consiste en encontrar las partes fundamentales de un sistema para describirlas de manera simple y precisa.

cat.png

  • Principio de Jerarquía

Todo conocimiento o modulo de tu programa puede ordenarse como un árbol como por ejemplo (transporte-raíz, y las hojas sean autos, barcos, caballos), de que el que esta más abajo hereda todas las características de los de arriba.

  • Principio de Tipificación 

Todo lenguaje en POO esta tipificado, es decir tenemos diferentes TIPOS de datos.

  • Principios de Encapsulamiento

Este principio dice que todos lo atributo que se relacionan a una clase tiene que estar declarados dentro de la misma clase.

poo2

poo1.png

  • Principios de Modularidad
    • Descomposición Modular: Descompón tu programa en módulos para que sea más fácil. Llamadas clases.
    • Composición Modular: Todos estos modelos tiene que estar conectados, son partes de un todo.
    • Comprensibilidad Modular: Tiene que ser posible entender un modulo sin necesidad de conocer los demás módulos.
    • Continuidad Modular: Si realizo cambios (mejoro o corrijo errores) en un módulo no debe de importarle en nada a los demás.
    • Protección Modular: Sin importar que haga, debería ser imposible para mi afectar negativamente a un módulo desde fuera de este.

Podemos también hablar de varias reglas:

Correspondencia Directa: Que podamos ser capaces de mejorar un modulo y el programa debe de funcionar de manera normal.

Pocas Interfaces: Busca que tus clases no se relacionen a menos que sea totalmente necesario, evitando así errores al actualizar un módulo.

Pequeñas Interfaces: Busca que la relación, que la cantidad de atributos sean los menores posibles, busca una mayor independencia de cada módulo.

Interfaces Explicitas: Evita que varios módulos modifiquen un mismo atributo para evitar conflicto de escritura o lectura.

Ocultación de la Información: Solo la clase misma debería poder ser capaz de modificar sus atributos.

 

Y si…no es ni de lejos todo lo que POO pero nos dará una idea bastante exacta de esta nueva idea a de entender la programación.

homer

Ya se POO

Así que listo, regresa por donde has venido y ve a aprender ese lenguaje que tanto quieres, Java, C++ o Python.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s