Qué es la programacion orientada a objetos

Anuncio
Qué es la programacion orientada a objetos
La programación Orientada a objetos (POO) es una forma especial de programar,
más cercana a como expresaríamos las cosas en la vida real que otros tipos de
programación.
Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para
escribir nuestros programas en términos de objetos, propiedades, métodos y otras
cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base
que permita soltarnos un poco con este tipo de programación.
Motivación
Durante años, los programadores se han dedicado a construir aplicaciones muy
parecidas que resolvían una y otra vez los mismos problemas. Para conseguir que
los esfuerzos de los programadores puedan ser utilizados por otras personas se
creó la POO. Que es una serie de normas de realizar las cosas de manera que otras
personas puedan utilizarlas y adelantar su trabajo, de manera que consigamos que
el código se pueda reutilizar.
La POO no es difícil, pero es una manera especial de pensar, a veces subjetiva de
quien la programa, de manera que la forma de hacer las cosas puede ser diferente
según el programador. Aunque podamos hacer los programas de formas distintas,
no todas ellas son correctas, lo difícil no es programar orientado a objetos sino
programar bien. Programar bien es importante porque así nos podemos aprovechar
de todas las ventajas de la POO.
Cómo se piensa en objetos
Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real.
Por ejemplo vamos a pensar en un coche para tratar de modelizarlo en un esquema
de POO. Diríamos que el coche es el elemento principal que tiene una serie de
características, como podrían ser el color, el modelo o la marca. Además tiene una
serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o
aparcar.
Pues en un esquema POO el coche sería el objeto, las propiedades serían las
características como el color o el modelo y los métodos serían las funcionalidades
asociadas como ponerse en marcha o parar.
Por poner otro ejemplo vamos a ver cómo modelizaríamos en un esquema POO una
fracción, es decir, esa estructura matemática que tiene un numerador y un
denominador que divide al numerador, por ejemplo 3/2.
La fracción será el objeto y tendrá dos propiedades, el numerador y el
denominador. Luego podría tener varios métodos como simplificarse, sumarse con
otra fracción o número, restarse con otra fracción, etc.
Estos objetos se podrán utilizar en los programas, por ejemplo en un programa de
matemáticas harás uso de objetos fracción y en un programa que gestione un taller
de coches utilizarás objetos coche. Los programas Orientados a objetos utilizan
muchos objetos para realizar las acciones que se desean realizar y ellos mismos
también son objetos. Es decir, el taller de coches será un objeto que utilizará
objetos coche, herramienta, mecánico, recambios, etc.
Clases en POO
Las clases son declaraciones de objetos, también se podrían definir como
abstracciones de objetos. Esto quiere decir que la definición de un objeto es la
clase. Cuando programamos un objeto y definimos sus características y
funcionalidades en realidad lo que estamos haciendo es programar una clase. En los
ejemplos anteriores en realidad hablábamos de las clases coche o fracción porque
sólo estuvimos definiendo, aunque por encima, sus formas.
Propiedades en clases
Las propiedades o atributos son las características de los objetos. Cuando definimos
una propiedad normalmente especificamos su nombre y su tipo. Nos podemos
hacer a la idea de que las propiedades son algo así como variables donde
almacenamos datos relacionados con los objetos.
Métodos en las clases
Son las funcionalidades asociadas a los objetos. Cuando estamos programando las
clases las llamamos métodos. Los métodos son como funciones que están asociadas
a un objeto.
Objetos en POO
Los objetos son ejemplares de una clase cualquiera. Cuando creamos un ejemplar
tenemos que especificar la clase a partir de la cual se creará. Esta acción de crear
un objeto a partir de una clase se llama instanciar (que viene de una mala
traducción de la palabra instace que en inglés significa ejemplar). Por ejemplo, un
objeto de la clase fracción es por ejemplo 3/5. El concepto o definición de fracción
sería la clase, pero cuando ya estamos hablando de una fracción en concreto 4/7,
8/1000 o cualquier otra, la llamamos objeto.
Para crear un objeto se tiene que escribir una instrucción especial que puede ser
distinta dependiendo el lenguaje de programación que se emplee, pero será algo
parecido a esto.
miCoche = new Coche()
Con la palabra new especificamos que se tiene que crear una instancia de la clase
que sigue a continuación. Dentro de los paréntesis podríamos colocar parámetros
con los que inicializar el objeto de la clase coche.
Estados en objetos
Cuando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando
tenemos un coche la propiedad color tomará un valor en concreto, como por
ejemplo rojo o gris metalizado. El valor concreto de una propiedad de un objeto se
llama estado.
Para acceder a un estado de un objeto para ver su valor o cambiarlo se utiliza el
operador punto.
miCoche.color = rojo
El objeto es miCoche, luego colocamos el operador punto y por último el nombre e
la propiedad a la que deseamos acceder. En este ejemplo estamos cambiando el
valor del estado de la propiedad del objeto a rojo con una simple asignación.
Mensajes en objetos
Un mensaje en un objeto es la acción de efectuar una llamada a un método. Por
ejemplo, cuando le decimos a un objeto coche que se ponga en marcha estamos
pasándole el mensaje “ponte en marcha”.
Para mandar mensajes a los objetos utilizamos el operador punto, seguido del
método que deseamos imbocar.
miCoche.ponerseEnMarcha()
En este ejemplo pasamos el mensaje ponerseEnMarcha(). Hay que colocar
paréntesis igual que cualquier llamada a una función, dentro irían los parámetros.
Otras cosas
Hay mucho todavía que conocer de la POO ya que sólo hemos hecho referencia a
las cosas más básicas. También existen mecanismos como la herencia y el
polimorfismo que son unas de las posibilidades más potentes de la POO.
La herencia sirve para crear objetos que incorporen propiedades y métodos de
otros objetos. Así podremos construir unos objetos a partir de otros sin tener que
reescribirlo todo.
El polimorfismo sirve para que no tengamos que preocuparnos sobre lo que
estamos trabajando, y abstraernos para definir un código que sea compatible con
objetos de varios tipos.
Son conceptos avanzados que cuesta explicar en las líneas de ese informe. No hay
que olvidar que existen libros enteros dedicados a la POO y aquí solo pretendemos
dar un repaso a algunas cosas para que os suenen cuando tengáis que poneros
delante de ellas en los lenguajes de programación que debe conocer un
desarrollador del web.
:: PARADIGMA ESTRUCTURADO ::
La Programación estructurada fija su atención en el conjunto de acciones que manipulan el flujo de datos,
mientras que la OOP se fija en la interrelación que existe entre los datos y las acciones a realizar con ellos.
• Descomposición funcional: el sistema es considerado una
unidad funcional que se disgrega en procesos.
• El resultado del proceso de abstracción para la solución de un
problema macro lo constituyen pequeños subprogramas.
• Un problema macro se subdivide en unidades más pequeñas
llamadas procesos, estos se pueden distribuir entre diferentes
personas que se vean involucradas en la solución de un
problema y así efectuar los desarrollos de software de una
manera más rápida y eficiente.
• Los procesos son la parte central de este modelo pues a partir de estos se manejan las variantes (datos) que
solucionarán el problema.
• Generalmente se manejan muchos procesos lo cual hace largos códigos.
• El mantenimiento de los desarrollos deben efectuarse minuciosamente.
• Los procedimientos empleados en una aplicación pueden reutilizarse teniendo cuidado en el manejo de los
datos.
• Las operaciones se ajustan a las características propias de los lenguajes procedimentales.
• Los procesos que se modelan en el desarrollo de un problema plasman las operaciones necesarias para
resolverlo
:: PARADIGMA ORIENTADO A OBJETOS ::
• Descomposición en objetos. El sistema es considerado un objeto o conjunto de objetos. Los cuales son el
resultado del proceso de abstracción para la solución del problema macro.
• Dado que un problema macro puede ser dividido en objetos, estos pueden ser tratados por diferentes personas
que luego lo integraran para dar la solución final.
• Los datos (estados) son la parte central del modelo y los métodos que los modifican muestran el
comportamiento del objeto.
• El mantenimiento de programas y aplicaciones generalmente son fáciles de realizar.
• Los objetos que se modelan en el desarrollo de un sistema se ajustan a la realidad que representa el problema,
este puede representare como un objeto o conjunto de objetos abstractos.
• El modelo orientado a objetos no es una técnica de programación sino un medio de plasmar el mundo real.
:: EJEMPLO MODELO ESTRUCTURAL ::
R = ( a1 + b1, a2 + b2, a3 + b3 )
R = ( c1 .d1 + c2 .d2 + c3 .d3 )
R = ( e2 x f3 - e3 x f2, e3 x f1 - e1 x f3, e1 x f2 - e2 x f1)
R = ( kg1, kg2, kg3 )
R = Raíz cuadrada de (h1 x h1, h2 x h2, h3 x h3)
:: EJEMPLO MODELO ORIENTADO A OBJETOS ::
Adición:
Producto Punto:
Producto Cruz:
Producto por
escalar:
Norma:
R = A + B, R =(a1 + b1, a2 + b2, a3 + b3)
R = A . B, R =(a1 .b1 + a2 .b2 + a3 .b3)
R=AxB, R =(a2*f3-a3*b2, a3*b1-a1*b3, a1*b2-a2*b1)
R = k A, R = ( ka1, ka2, ka3 )
R = /R/I, R = Raíz cuadrada de (A*A)
Ventajas del Modelo orientado a objetos con respecto al modelo estructurado
• Un modelo de objetos es más cercano a la realidad que un modelo funcional.
• Un desarrollo realizado con el modelo orientado a objetos es más fácil de mantener y de reutilizar.
• El modelo orientado a objetos evita la redundancia en los procesos luego los códigos son más entendibles y
resumidos.
• La integridad que dan los objetos a los datos evita ambigüedades en su uso, dando mayor seguridad en los
resultados.
• El modelo orientado a objetos facilita la integridad de módulos que hallan sido realizados por separado sin
correr riesgos en el manejo de los datos.
1.-CONCEPTOS DE PROGRAMACIÓN ORIENTADA A OBJETOS
1.1 Introducción
Un concepto muy importante introducido por la programación estructurada es la
abstracción. La abstracción se puede definir como la capacidad de examinar
algo sin preocuparse de los detalles internos. En un programa estructurado es
suficiente conocer que un procedimiento dado realiza una tarea específica. El
cómo se realiza la tarea no es importante; mientras el procedimiento sea fiable
se puede utilizar sin tener que conocer cómo funciona su interior. Esto se conoce
como
abstracción
funcional.
Una debilidad de la programación estructurada aparece cuando programadores
diferentes trabajan en una aplicación como un equipo. Dado que programadores
diferentes manipulan funciones separadas que pueden referirse a tipos de datos
mutuamente compartidos, los cambios de un programador se deben reflejar en el
trabajo del resto del equipo. Otro problema de la programación estructurada es
que raramente es posible anticipar el diseño de un sistema completo antes de
que
se
implemente
realmente.
En esencia, un defecto de la programación estructurada, como se acaba de ver,
consiste en la separación conceptual de datos y código. Este defecto se agrava
a medida que el tamaño del programa crece.
1.2 Abstracción de datos
La abstracción de datos permite no preocuparse de los detalles no esenciales.
Existe en casi todos los lenguajes de programación. Las estructuras de datos y
los tipos de datos son un ejemplo de abstracción. Los procedimientos y
funciones son otro ejemplo. Sólo recientemente han emergido lenguajes que
soportan sus propios tipos abstractos de datos (TAD), como Pascal, Ada,
Modula-2 y C++.
1.3 ¿Qué es la programación orientada a objetos?
Se puede definir POO como una técnica o estilo de programación que utiliza
objetos
como
bloque
esencial
de
construcción.
Los objetos son en realidad como los tipos abstractos de datos. Un TAD es un
tipo definido por el programador junto con un conjunto de operaciones que se
pueden realizar sobre ellos. Se denominan abstractos para diferenciarlos de los
tipos
de
datos
fundamentales
o
básicos.
En C se puede definir un tipo abstracto de datos utilizando typedef y struct y la
implementación de las operaciones con un conjunto de funciones.
C++ tiene muchas facilidades para definir y utilizar un tipo TAD.
Al igual que los tipos de datos definidos por el usuario, un objeto es una
colección de datos, junto con las funciones asociadas, utilizadas para operar
sobre esos datos. Sin embargo la potencia real de los objetos reside en las
propiedades que soportan: herencia, encapsulación y polimorfismo, junto con los
conceptos básicos de objetos, clases, métodos y mensajes.
1.4 Trabajando con objetos
En programación convencional los programas se dividen en dos componentes:
procedimientos y datos. Este método permite empaquetar código de programa
en procedimientos, pero ¿Qué sucede con los datos? Las estructuras de datos
utilizadas en programación son globales o se pasan como parámetros. En
esencia los datos se tratan separadamente de los procedimientos.
En POO un programa se divide en componentes que contienen procedimientos y
datos.
Cada
componente
se
considera
un
objeto.
Un objeto es una unidad que contiene datos y las funciones que operan sobre
esos datos. A los elementos de un objeto se les conoce como miembros; las
funciones que operan sobre los datos se denominan métodos (en C++ también
se llaman funciones miembro) y los datos se denominan miembros datos. En
C++ un programa consta de objetos. Los objetos de un programa se comunican
entre sí mediante el paso o envío de mensajes (acciones que debe ejecutar el
objeto).
En POO los objetos pueden se cualquier entidad del mundo real:
- Objetos físicos
* automóviles en una simulación de tráfico
* aviones en un sistema de control de tráfico aéreo
* animales mamíferos, etc
- Elementos de interfaces gráficos de usuarios
* ventanas
* iconos
* menús
* ratones
- Estructuras de datos
* arrays
* pilas
* árboles binarios
- Tipos de datos definidos por el usuario
* números complejos
* hora del día
1.5 Definición de objetos
Un objeto es una unidad que contiene datos y las funciones que operan sobre
esos datos. Los datos se denominan miembros dato y las funciones métodos o
funciones
miembro.
Los datos y las funciones se encapsulan en una única entidad. Los datos están
ocultos y sólo mediante las funciones miembro es posible acceder a ellos.
1.6 Clases
Una clase es un tipo definido por el usuario que determina las estructuras de
datos y las operaciones asociadas con ese tipo. Cada vez que se construye un
objeto de una clase, se crea una instancia de esa clase. En general, los términos
objetos e instancias de una clase se pueden utilizar indistintamente.
Una clase es una colección de objetos similares y un objeto es una instancia de
una
definición
de
una
clase.
La comunicación con el objeto se realiza a través del paso de mensajes. El envío
a una instancia de una clase produce la ejecución de un método o función
miembro. El paso de mensajes es el término utilizado para referirnos a la
invocación o llamada de una función miembro de un objeto.
1.7 Mensajes: activación de objetos
Los objetos pueden ser activados mediante la recepción de mensajes. Un
mensaje es simplemente una petición para que un objeto se comporte de una
determinada manera, ejecutando una de sus funciones miembro. La técnica de
enviar mensajes se conoce como paso de mensajes.
Estructuralmente un mensaje consta de tres partes:
- la identidad del objeto receptor
- la función miembro del receptor cuya ejecución se ha solicitado
- cualquier otra información adicional que el receptor pueda necesitar para
ejecutar el método requerido.
En C++, la notación utilizada es
nombre_del_objeto.función_miembro
Ejemplo: Se tiene un objeto o1 con los siguientes miembros dato:
nombre_alumno y curso y con las funciones miembro: leer_nombre e imprimir.
Si el objeto o1 recibe el mensaje imprimir, esto se expresa:
o1.imprimir()
La sentencia anterior se lee: "enviar mensaje imprimir al objeto o1". El objeto o1
reacciona al mensaje ejecutando la función miembro de igual nombre que el
mensaje.
El mensaje puede llevar parámetros:
o1.leer_nombre("Pedro Pérez")
Sin los mensajes los objetos que se definan no podrán comunicarse con otros
objetos. Desde un punto de vista convencional, el paso de mensajes no es más
que el sinónimo de llamada a una función.
1.8 Programa orientado a objetos
Un programa orientado a objetos es una colección de clases. Necesitará una
función principal que cree objetos y comience la ejecución mediante la
invocación
de
sus
funciones
miembro.
Esta organización conduce a separar partes diferentes de una aplicación en
distintos archivos. La idea consiste en poner la descripción de la clase para cada
una de ellas en un archivo separado. La función principal también se pone en un
archivo independiente. El compilador ensamblará el programa completo a partir
de
los
archivos
independientes
en
una
única
unidad.
En realidad, cuando se ejecuta un programa orientado a objetos, ocurren tres
acciones:
1.
Se
crean
los
objetos
cuando
se
necesitan
2. Los mensajes se envían desde uno objetos y se reciben en otros
3. Se borran los objetos cuando ya no son necesarios y se recupera la memoria
ocupada por ellos
1.9 Herencia
La herencia es la propiedad que permite a los objetos construirse a partir de
otros objetos.
Una clase se puede dividir en subclases. En C++ la clase original se denomina
clase base; las clases que se definen a partir de la clase base, compartiendo sus
características y añadiendo otras nuevas, se denominan clases derivadas.
Las clases derivadas pueden heredar código y datos de su clase base
añadiendo su propio código y datos a la misma.
La herencia impone una relación jerárquica entre clases en la cual una clase hija
hereda de su clase padre. Si una clase sólo puede recibir características de otra
clase base, la herencia se denomina herencia simple.
Si una clase recibe propiedades de más de una clase base, la herencia se
denomina herencia múltiple.
1.10 Polimorfismo
En un sentido literal, significa la cualidad de tener más de una forma. En el
contexto de POO, el polimorfismo se refiere al hecho de que una misma
operación puede tener diferente comportamiento en diferentes objetos. Por
ejemplo, consideremos la operación sumar. El operador + realiza la suma de dos
números de diferente tipo. Además se puede definir la operación de sumar dos
cadenas mediante el operador suma.
¿Qué es un objeto?
Objeto es el concepto clave de la Programación Orientada a Objetos, la idea de objeto es
similar a la del mundo real, un objeto puede ser una silla, una mesa. Tu perro es un
objeto.
Los objetos tienen dos características: Un estado y un comportamiento. Fijate que por
ejemplo tu perro tiene un estado: nombre, color, raza, altura, etc. y un comportamiento:
ladrar, cavar pozo, llorar, dormir, comer, etc.
Un auto es un objeto. También tiene un estado: Cantidad de puertas, color, tamaño, etc.
y un comportamiento: acelerar, frenar, subir cambio, bajar cambio, girar izq., girar der.,
etc.
Entonces podemos definir a un objeto en POO, como un conjunto de datos y funciones
relacionadas. A las funciones de los objetos, tales como acelerar en el caso del auto, de
aquí en más las llamaremos métodos, a los datos los llamaremos atributos.
Los objetos en programación, son modelados observando objetos del mundo real, por
ejemplo implementamos el objeto "perro" dentro de nuestro programa definiendo los
atributos y métodos del objeto perro real.
El objeto "Auto" se puede representar gráficamente como sigue:
Un ejemplo mas complicado de un objeto podría ser el siguiente:
Objeto: Cuenta bancaria
Atributos: tipo, titular, saldo.
Métodos: Depositar, Extraer.
Aquí se ve la necesidad de que el atributo "saldo" sea solo accesible a través de los
métodos "Depositar" y "Extraer" por una cuestión de seguridad, encapsulamiento y para
evitar comportamientos indeseados.
¿Qué es una clase?
Una clase es algo abstracto que define la "forma" del objeto, se podría hablar de la clase
como el molde de los objetos.
En el mundo real existen objetos del mismo tipo, por ejemplo tu bicicleta es solo una
mas de todas las bicicletas del mundo. Entonces diríamos que tu bicicleta es una
instancia de la clase "Bicicleta". Todas las bicicletas tienen los atributos: color, cantidad
de cambios, dueño y métodos: acelerar, frenar, pasar cambio, volver cambio.
Las fabricas de bicicletas utilizan moldes para producir sus productos en serie, de la
misma forma en POO utilizaremos la clase bicicleta (molde) para producir sus
instancias (objetos).
Los objetos son instancias de clases.
Ejemplo: Podríamos tener la clase Perro, una instancia de esta clase podría ser el objeto
perro llamado "Chicho". La clase Perro especificaría que todos los perros tendrían un
nombre, color de pelo, una altura. Mientras que la instancia "Chicho" contendrá valores
específicos para cada uno de estos atributos.
Podemos definir a una clase como una plantilla que define variables y métodos comunes
para todos los objetos de cierto tipo.
Existe un lenguaje de modelado llamado UML mediante el cual podemos representar
gráficamente todo un sistema orientado a objetos utilizando rectángulos, líneas y otro
tipo de símbolos gráficos. Según UML, la clase "Cuenta Bancaria" antes mencionada se
representará gráficamente como sigue:
Mensajes
Un objeto por si solo no tiene mucho significado. Ejemplo: el objeto "bicicleta" no tiene
mucho sentido si no interactúa con un objeto "persona" que pedalee.
La interacción entre objetos se produce mediante mensajes. Los mensajes son llamados
a métodos de un objeto en particular.
Podemos decir que el objeto persona envía el mensaje "girar a la izquierda" al objeto
bicicleta.
Los mensajes pueden contener parámetros. Por ejemplo teniendo un método en la clase
bicicleta llamado "Girar" que recibe como parámetro la dirección (derecha o izquierda).
Un mensaje esta compuesto por los siguientes tres elementos:
1. El objeto destino, hacia el cual el mensaje es enviado
2. El nombre del método a llamar
3. Los parámetros solicitados por el método
Beneficios de los mensajes
Como todo lo que un objeto puede hacer esta expresado mediante métodos, el envío de
mensajes soporta todas las posibles interacciones entre objetos.
Para enviar o recibir mensajes, los objetos no necesitan formar parte del mismo proceso,
ni siquiera de la misma máquina.
Herencia
Los sistemas orientados a objetos permiten definir clases en término de otras clases. Por
ejemplo ovejero alemán y caniche son diferentes razas de perros. En la terminología
orientada a objetos "Ovejero Alemán" y "Caniche" son subclases de la clase perro. De
forma similar Perro es la superclase de "Ovejero Alemán".
Entonces tenemos la siguiente jerarquía de clases:
En UML se representa la relación de herencia mediante una flecha.
Cada subclase hereda los atributos de la superclase. Tanto la clase "Ovejero Alemán"
como "Caniche" tendrán los atributos nombre, color de pelo, altura definidos en la clase
Perro.
Una subclase no esta limitada únicamente a los atributos de su superclase, también
puede tener atributos propios, o redefinir algunos definidos anteriormente en la
superclase.
No se esta limitado tampoco a un solo nivel de herencia, se pueden tener todos los que
se consideren necesarios.
Ejemplo:
Clase Empleado hereda de clase Persona, y esta a su vez hereda de clase Animal.
Las subclases proveen un comportamiento especializado sobre los elementos comunes
provistos por las superclases. Gracias a la herencia, los programadores pueden rehusar
código una y otra vez.
Enlaces
Estos son los conceptos básicos de un programa orientado a objetos. Para profundizar
en el tema, visitar los siguientes links:
Descargar