Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Índice
1 Introducción
2 Origen
3 Conceptos fundamentales
4 Características de la POO
5 Resumen
7 Véase también
8 Notas y referencias
9 Enlaces externos
Introducción[editar]
El estado está compuesto de datos o informaciones; serán uno o varios atributos a los que
se habrán asignado unos valores concretos (datos).
La identidad es una propiedad de un objeto que lo diferencia del resto; dicho con otras
palabras, es su identificador (concepto análogo al de identificador de una variable o
unaconstante).
Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos
pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores
bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción
llamados métodos, que favorecen la comunicación entre ellos. Esta comunicación favorece a su
vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades
indivisibles, en las que no se separa el estado y el comportamiento.
Origen[editar]
Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje
diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard, del Centro de
Cómputo Noruego en Oslo. En este centro se trabajaba en simulaciones de naves, que fueron
confundidas por la explosión combinatoria de cómo las diversas cualidades de diferentes naves
podían afectar unas a las otras. La idea surgió al agrupar los diversos tipos de naves en diversas
clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y
comportamientos. Fueron refinados más tarde en Smalltalk, desarrollado en Simula en Xerox
PARC (cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema
completamente dinámico en el cual los objetos se podrían crear y modificar "sobre la marcha" (en
tiempo de ejecución) en lugar de tener un sistema basado en programas estáticos.
Conceptos fundamentales[editar]
La programación orientada a objetos es una forma de programar que trata de encontrar una
solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos
antiguos ya conocidos. Entre ellos destacan los siguientes:
Clase
Herencia
(Por ejemplo, herencia de la clase C a la clase D) es la facilidad mediante la cual la clase D hereda
en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones
hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos métodos y variables
públicas declaradas en C. Los componentes registrados como "privados" (private) también se
heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y sólo
pueden ser accedidos a través de otros métodos públicos. Esto es así para mantener hegemónico
el ideal de POO.
Objeto
Método
Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la
recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto
puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación
de un "evento" con un nuevo mensaje para otro objeto del sistema.
Evento
Es un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje
enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto
pertinente. También se puede definir como evento la reacción que puede desencadenar un
objeto; es decir, la acción que genera.
Atributos
Mensaje
Una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos
parámetros asociados al evento que lo generó.
Propiedad o atributo
Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los
datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y
cuyo valor puede ser alterado por la ejecución de algún método.
Estado interno
Es una variable que se declara privada, que puede ser únicamente accedida y alterada por un
método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o
clase de objetos). No es visible al programador que maneja una instancia de la clase.
Componentes de un objeto
Identificación de un objeto
Un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y
funciones correspondientes.
En comparación con un lenguaje imperativo, una "variable" no es más que un contenedor interno
del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno
del método del objeto.
Características de la POO[editar]
Abstracción
Denota las características esenciales de un objeto, donde se capturan sus comportamientos. Cada
objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo,
informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se
implementan estas características. Los procesos, las funciones o los métodos pueden también ser
abstraídos, y, cuando lo están, una variedad de técnicas son requeridas para ampliar una
abstracción. El proceso de abstracción permite seleccionar las características relevantes dentro de
un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el
mundo real. La abstracción es clave en el proceso de análisis y diseño orientado a objetos, ya que
mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el
problema que se quiere atacar.
Encapsulamiento
Significa reunir todos los elementos que pueden considerarse pertenecientes a una misma
entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes
del sistema. Algunos autores confunden este concepto con el principio de ocultación,
principalmente porque se suelen emplear conjuntamente.
Modularidad
Se denomina modularidad a la propiedad que permite subdividir una aplicación en partes más
pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea
posible de la aplicación en sí y de las restantes partes. Estos módulos se pueden compilar por
separado, pero tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes
soportan la modularidad de diversas formas.
Principio de ocultación
Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone
una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El
aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga
derecho a acceder a ellas; solamente los propios métodos internos del objeto pueden acceder a su
estado. Esto asegura que otros objetos no puedan cambiar el estado interno de un objeto de
manera inesperada, eliminando efectos secundarios e interacciones inesperadas. Algunos
lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una
manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un
agregado o rompecabezas de objetos.
Polimorfismo
Herencia
Las clases no se encuentran aisladas, sino que se relacionan entre sí, formando una jerarquía de
clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las
que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento, permitiendo
a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos
pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto
suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que
reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que
hay herencia múltiple; siendo de alta complejidad técnica por lo cual suele recurrirse a la herencia
virtual para evitar la duplicación de datos.
Recolección de basura
Resumen[editar]
La programación orientada a objetos es un paradigma surgido en los años 70, que utiliza objetos
como elementos fundamentales en la construcción de la solución. Un objeto es una abstracción de
algún hecho o ente del mundo real, con atributos que representan sus características o
propiedades, y métodos que emulan su comportamiento o actividad. Todas las propiedades y
métodos comunes a los objetos se encapsulan o agrupan en clases. Una clase es una plantilla, un
prototipo para crear objetos; en general, se dice que cada objeto es una instancia o ejemplar de
una clase.
Simula (1967) es aceptado como el primer lenguaje que posee las características principales de un
lenguaje orientado a objetos. Fue creado para hacer programas de simulación, en donde los
"objetos" son la representación de la información más importante. Smalltalk (1972 a 1980) es
posiblemente el ejemplo canónico, y con el que gran parte de la teoría de la programación
orientada a objetos se ha desarrollado.
ActionScript
ActionScript 3
Ada
C++
C#
Clarion
Clipper1
D
Gambas
Genie
Harbour
Eiffel
Fortran 90/95
Java
JavaScript2
Lexico3
Objective-C
Ocaml
Oz
R
Perl4
PHP5
PowerBuilder
Python
Ruby
Self
Smalltalk6
Magik (SmallWorld)
Vala
VB.NET
Visual FoxPro7
Visual DataFlex
Visual Objects
XBase++
Lenguaje DRP
Scala8
Muchos de estos lenguajes de programación no son puramente orientados a objetos, sino que son
híbridos que combinan la POO con otros paradigmas.
1) que el software debe ser escrito según un modelo mental de los objetos reales o imaginarios
que representan. La OOP y las disciplinas relacionadas de análisis orientado a objetos y el diseño
orientado a objetos están enfocados en el modelado de interacciones del mundo real [cita requerida] e
intentan identficar los "sustantivos" y los "verbos" en las reuniones de levantamiento de
requerimientos, para esos conceptos sean programados directamente en clases y métodos, que
pueden ser usados en más formas humanamente legibles, idealmente por los usuarios finales así
como por los programadores que codifican para esos usuarios finales. Esta manera de pensar
acerca de la OOP es más bien una ilusión, históricamente no ha dado buenos resultados.
Por contraste, la ingeniería de software basado en componentes no hace tal asunción, y en lugar
ello expresa que los desarrolladores deben construir el software pegando entre sí componentes
prefabricados - como en los campos de la electrónica o la mecánica. Algunos pares[¿quién?] incluso
hablan de sistemas modularizados como componentes de software como un nuevo paradigma de
programación.
En ambas formas, esta noción ha llevado a muchos debates académicos [palabras de comadreja]
sobre los pros y los contra de los dos acercamientos y de las posibles estrategias para unir los dos.
Algunos[¿quién?] consideran las diversas estrategias no como competidoras, sino como descripciones
del mismo problema desde diversos puntos de vista.[cita requerida]
97 Comentarios
Desarrollo
Introducimos para los más profanos las bases sobre las que se asienta la Programación
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.
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.
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.
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 invocar.
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. Puedes
encontrar en DesarrolloWeb.com un artículo completo dedicado a la Herencia.
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. Puedes acceder
a otro artículo para saber más sobre Polimorfismo.
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. Sin embargo, si quieres saber más también puedes
continuar leyendo en DesarrolloWeb.com, en el manual de la teoría de la Programación orientada
a objetos.
2 Comentarios
Programación
Si ya entendiste lo que son clases y objetos, atributos y estados, métodos y mensajes, ahora
puedes ampliar la información en el presente texto para conocer acerca de la herencia. Pero antes
de ello, centrémonos en entender algunas de las prácticas más útiles y deseables de la
programación en general.
Jerarquización
Composición: Es cuando unos elementos podemos decir que están compuestos de otros, o que
unos elementos están presentes en otros. Por ejemplo, el sistema respiratorio y los pulmones, la
nariz, etc. Podemos decir que los pulmones están dentro del sistema respiratorio, así como dentro
de los pulmones encontramos bronquios y alvéolos. En esta jerarquía de elementos tenemos
composición porque donde unos forman parte de otros. En una factura también podemos decir
que puede haber una jerarquía de composición. La factura tiene un cliente, varios conceptos
facturables, un impuesto, etc.
Clasificación: Este tipo de jerarquización indica que unos elementos son una especialización de
otros. Por ejemplo, los animales, donde tenemos vertebrados e invertebrados. Luego, dentro de
los vertebrados encontramos aves, reptiles, mamíferos, etc. En los mamíferos encontramos
perros, vacas, conejos... Éste es el tipo de jerarquización en que quiero que te fijes.
Por otra parte, otro de los mecanismos que cualquier lenguaje de programación debe proveer es
la posibilidad de reutilizar el código. En la programación estructurada tenemos las funciones, así
que ya hemos podido reutilizar código de alguna manera. Así pues, el equivalente a las funciones,
los métodos, ya nos da un grado de reutilización, pero no llegan al nivel de potencia de las que
encontraremos en la herencia.
No necesitamos decirte mucho más para entender las bondades de la reutilización: en inglés lo
resume el término "DRY", Don't Repeat Yourself (no te repitas) y es uno de los enunciados que
debes tener más presente cuando programas. "No es mejor programador quien más líneas de
código hace, sino quien mejor las reutiliza".
Quizás está de más decirlo, porque seguro que ya sabes que debemos evitar escribir dos veces el
mismo código, evitar los copia/pega y pensar que la reutilización nos ayuda seriamente en el
mantenimiento del software. Enseguida verás cómo la herencia es un mecanismo fundamental
para reutilizar código.
Herencia el la POO
Ahora que ya conoces dos beneficios que nos proporciona la herencia y por qué es algo tan
deseable en la programación, creo que te sentirás motivado para profundizar en las bases de este
mecanismo, herencia, clave de la Orientación a Objetos.
La herencia es la transmisión del código entre unas clases y otras. Para soportar un mecanismo de
herencia tenemos dos clases: la clase padre y la/s clase/s hija/s. La clase padre es la que transmite
su código a las clases hijas. En muchos lenguajes de programación se declara la herencia con la
palabra "extends".
class Hija extends Padre{ }
Eso quiere decir que todo el código de la clase padre se transmite, tal cual, a la clase hija. Si lo
quieres ver así, es como si tuvieras escrito, línea a línea, todo el código de la class "Padre" dentro
de las llaves de la class "Hija". Por eso, la herencia es fundamental para reutilizar código, porque
no necesitas volver a incorporar el código de Padre en Hija, sino que realmente al hacer el
"extends" es como si ya estuviera ahí.
Ejemplo de herencia
Volvamos a los animales, pensemos en los mamíferos. Todos tienen una serie de características,
como meses de gestación en la barriga de la madre, pechos en las hembras para amamantar y
luego funcionalidades como dar a luz, mamar, etc. Eso quiere decir que cuando realices la clase
perro vas a tener que implementar esos atributos y métodos, igual que la clase vaca, cerdo,
humano, etc.
¿Te parecería bien reescribir todo ese código común en todos los tipos de mamíferos, o prefieres
heredarlo? en este esquema tendríamos una clase mamífero que nos define atributos como
numero_mamas, meses_gestacion y métodos como dar_a_luz(), mamar(). Luego tendrías la clase
perro que extiende (hereda) el código del mamífero, así como las vacas, que también heredan de
mamífero y cualquiera de los otros animales de esta clasificación.
Otro ejemplo, tenemos alumnos universitarios. Algunos son alumnos normales, otros Erasmus y
otros becarios. Probablemente tendremos una clase Alumno con una serie de métodos como
asistir_a_clase(), hacer_examen() etc., que son comunes a todos los alumnos, pero hay
operaciones que son diferentes en cada tipo de alumno como pagar_mensualidad() (los becarios
no pagan) o matricularse() (los Erasmus que son estudiantes de intercambio, se matriculan en su
universidad de origen).
Lo que debes observar es que con la herencia siempre consigues clases hijas que son una
especialización de la clase padre. Para saber si está correcto emplear herencia entre unas clases y
otras, plantéate la pregunta ¿CLASE HIJA es un CLASE PADRE? (por ejemplo, ¿un perro es un
mamífero? ¿Un becario es un alumno de universidad?)
Nota: Existen otros modos de decir clases hija, como clase heredada, clase derivada, etc.
En este artículo nos hemos limitado a hablar sobre el concepto de herencia, pero no sobre una
serie de mecanismos asociados que resultan clave para entender todavía mejor las posibilidades
de esta capacidad de la POO. Nos referimos a la visibilidad de propiedades y métodos entre clases
padre e hija, la posibilidad de hacer clases abstractas, que son las que contienen métodos
abstractos o incluso propiedades abstractas. Hemos dejado de lado asuntos como la herencia
múltiple, que te proporciona la posibilidad de heredar de varias clases a la vez (los ejemplos
mencionados son de herencia simple).
Todo eso es algo que tendrás que aprender en otros textos, futuros artículos o en la referencia de
tu propio lenguaje de programación. Nosotros esperamos que el presente texto te haya aclarado
el concepto de una forma amena, que es lo más fundamental para que a partir de aquí tengas la
base suficiente para profundizar en las características de tu propio lenguaje de programación con
orientación a objetos.
7 Comentarios
PHP
Cómo trabaja PHP 5 con la orientación a objetos. Listado de las novedades con respecto a los
objetos en versiones anteriores.
En el artículo anterior comentamos las carencias del modelo de orientación a objetos en PHP 3 y 4,
que afortunadamente han quedado solventadas en la versión PHP 5.
Como decíamos, uno de los problemas más básicos de las versiones anteriores de PHP era la
clonación de objetos, que se realizaba al asignar un objeto a otra variable o al pasar un objeto por
parámetro en una función. Para solventar este problema PHP5 hace uso de los manejadores de
objetos (Object handles), que son una especie de punteros que apuntan hacia los espacios en
memoria donde residen los objetos. Cuando se asigna un manejador de objetos o se pasa como
parámetro en una función, se duplica el propio object handle y no el objeto en si.
Nota: También se puede realizar una clonación de un objeto, para obtener una copia
exacta, pero que no es el propio objeto. Para ello utilizamos una nueva instrucción
llamada "clone", que veremos más adelante.