PARADIGMA DE LENGUAJE
DE PROGRAMACIÓN ORIENTADA A OBJETOS
ORIGEN
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 ocurrió para 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,
que fue 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 “en marcha” (en
tiempo de ejecución) en lugar de tener un sistema basado en programas
estáticos.
La programación orientada a objetos tomó posición
como el estilo de programación dominante a mediados de los años ochenta, en
gran parte debido a la influencia de C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de
las Interfaces gráficas de usuario, para las cuales la programación orientada a
objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por
eventos.
Las características de orientación a objetos fueron
agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, entre otros. La adición de estas características
a los lenguajes que no fueron diseñados inicialmente para ellas condujo a
menudo a problemas de compatibilidad y en la capacidad de mantenimiento del
código. Los lenguajes orientados a objetos “puros”, por su parte, carecían de
las características de las cuales muchos programadores habían venido a
depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear
nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo
algunas características imperativas de maneras “seguras”. El Eiffel de Bertrand Meyer fue un temprano y moderadamente
acertado lenguaje con esos objetivos pero ahora ha sido esencialmente
reemplazado por Java, en gran parte debido a la aparición de Internet,
y a la implementación de la máquina virtual de Java en la mayoría de navegadores. PHP en su versión 5 se ha modificado, soporta una
orientación completa a objetos, cumpliendo todas las características propias de
la orientación a objetos.
Los objetos son entidades que combinan estado
(atributo), comportamiento (método) e identidad:
·
El
estado está compuesto de datos,
será uno o varios atributos a los que se habrán asignado unos valores concretos
(datos).
·
El
comportamiento está definido
por los procedimientos o métodos con que puede operar dicho objeto, es decir, qué
operaciones se pueden realizar con él.
·
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 una constante).
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.
Los métodos
(comportamiento) y atributos
(estado) están estrechamente relacionados por la propiedad de conjunto.
Esta propiedad destaca que una clase requiere de métodos para poder tratar los
atributos con los que cuenta. El programador
debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor
importancia a alguno de ellos. Hacerlo podría producir el hábito erróneo de
crear clases contenedoras de información por un lado y clases con métodos que
manejen a las primeras por el otro. De esta manera se estaría realizando una programación
estructurada camuflada en un lenguaje de programación orientado a objetos.
La POO difiere de la programación estructurada tradicional, en la que los datos y los
procedimientos están separados y sin relación, ya que lo único que se busca es
el procesamiento de unos datos de entrada para obtener otros de salida. La
programación estructurada anima al programador a pensar sobre todo en términos
de procedimientos o funciones, y en segundo lugar en las estructuras de datos
que esos procedimientos manejan. En la programación estructurada sólo se
escriben funciones que procesan datos. Los programadores que emplean POO, en
cambio, primero definen objetos para luego enviarles mensajes solicitándoles
que realicen sus métodos por sí mismos.
CARACTERISTICAS DE LA PROGRAMACION ORIENTADA A OBJETO:
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 a 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 que se puedan compilar por
separado, pero que 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 específica 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 pueden cambiar el estado interno de un objeto
de maneras inesperadas, 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: comportamientos diferentes, asociados a objetos
distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se
utilizará el comportamiento correspondiente al objeto que se esté usando. O
dicho de otro modo, las referencias y las colecciones de objetos pueden
contener objetos de diferentes tipos, y la invocación de un comportamiento en
una referencia producirá el comportamiento correcto para el tipo real del
objeto referenciado. Cuando esto ocurre en “tiempo de ejecución”, esta última
característica se llama asignación
tardía o asignación dinámica.
Algunos lenguajes proporcionan medios más estáticos (en “tiempo de compilación”)
de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
Herencia: las clases no están 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.
Recolección de basura: la
recolección de basura o garbage collector
es la técnica por la cual el entorno de objetos se encarga de destruir
automáticamente, y por tanto desvincular la memoria asociada, los objetos que
hayan quedado sin ninguna referencia a ellos. Esto significa que el programador
no debe preocuparse por la asignación o liberación de memoria, ya que el
entorno la asignará al crear un nuevo objeto y la liberará cuando nadie lo esté
usando. En la mayoría de los lenguajes híbridos que se extendieron para
soportar el Paradigma de Programación Orientada a Objetos como C++ u Objeto Pascal, esta característica no existe y la memoria debe
desasignarse manualmente.
La programación orientada a objetos es una forma de
programación avanzada. PHP5 incorpora una nueva forma de POO, la cual
contribuye a mejorar su rendimiento y aumentar sus posibilidades.
Las aplicaciones se desarrollan creando clases, que
están compuestas por funciones, variables o atributos. De las cuales se crean
objetos, que obtienen las propiedades definidas en la clase
Cuando se escribe un programa en un lenguaje
orientado a objetos, definimos una plantilla o clase que describe las características
y el comportamiento de un conjunto de objetos similares. La clase automóvil
describe las características comunes de todos los automóviles: sus atributos y
su comportamiento. Los atributos o propiedades se refieren a la marca o
fabricante, el color, las dimensiones, si tienen dos, tres, cuatro o más
puertas, la potencia, si utiliza como combustible la gasolina o gasoil, etc. El
comportamiento se refiere a la posibilidad de desplazarse por una carretera,
frenar, acelerar, cambiar de marcha, girar, etc.
Luego, tenemos automóviles concretos, por ejemplo
el automóvil propio de una determinada
marca, color, potencia, etc, el automóvil del vecino de otra marca, de otro
color, etc. El automóvil de un amigo, etc.
Una clase es por tanto una pantalla implementada en
software que describe un conjunto de objetos con atributos y comportamiento
similares.
Una instancia u objeto de una clase es una
representación concreta y específica de una clase y que reside en la memoria
del ordenador.
Atributos
Los atributos son las características individuales
que diferencian un objeto de otro y determinan su apariencia, estado u otras
cualidades. Los atributos se guardan en variables denominadas de instancia, y
cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia también denominados
miembros dato, son declaradas en la clase pero sus valores son fijados y
cambiados en el objeto.
Además de las variables de instancia hay variables
de clase, las cuales se aplican a la clase y a todas sus instancias. Por
ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los
automóviles.
Comportamiento
El comportamiento de los objetos de una clase se
implementa mediante funciones miembro o métodos. Un método es un conjunto de
instrucciones que realizan una determinada tarea y son similares a las
funciones de los lenguajes estructurados.
Del mismo modo que hay variables de instancia y de
clase, también hay métodos de instancia y de clase. En el primer caso, un
objeto llama a un método para realizar una determinada tarea, en el segundo, el
método se llama desde la propia clase.
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 está 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.
LENGUAJES ORIENTADOS A OBJETOS
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.
Entre los lenguajes orientados a objetos se
destacan los siguientes:
Ø
ABAP
Ø
ABL Lenguaje de
programación de OpenEdge de Progress Software
Ø
Ada
Ø
C++
Ø
C#
Ø
Clarion
Ø
Clipper (lenguaje de programación) (Versión 5.x con librería de
objetos Class(y))
Ø
D
Ø
Object Pascal (Delphi)
Ø
Gambas
Ø
Harbour
Ø
Eiffel
Ø
Java
Ø
JavaScript (la herencia se realiza por
medio de la programación basada en prototipos)
Ø
Lexico (en castellano)
Ø
Ocaml
Ø
Oz
Ø
R
Ø
Perl (soporta herencia múltiple. La resolución se
realiza en preorden, pero puede modificarse al
algoritmo linearization C3 por medio del módulo Class::C3 en CPAN)
Ø
PHP (a partir de su versión 5)
Ø
Python
Ø
Ruby
Ø
Smalltalk (Proyecto investigativo.
Influenció a Java.)
Ø
Magik (SmallWorld)
Ø
Vala
Ø
VB.NET
Ø
Visual FoxPro (en su versión 6)
Ø
XBase++
Ø
Lenguaje de programación Scala (lenguaje usado por Twitter)
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.
Al igual que C++ otros lenguajes,
como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados añadiendo extensiones
orientadas a objetos a un lenguaje de programación clásico.
Un nuevo paso en la abstracción de paradigmas de programación es la Programación Orientada a Aspectos (POA). Aunque es todavía una metodología en estado de maduración, cada
vez atrae a más investigadores e incluso proyectos comerciales en todo el
mundo.
VENTAJAS DE LA TECNOLOGÍA ORIENTADA A OBJETOS.
FLEXIBILIDAD: Si partimos del hecho que mediante la definición de
clases establecemos módulos independientes,
a partir de los cuales podemos definir nuevas clases, entonces podemos pensar en estos módulos como bloques con
los cuales podemos construir diferentes programas.
REUSABILIDAD: Una vez que hemos definido a la entidad persona para
utilizarla en una aplicación de negocios, por mencionar un ejemplo, y deseamos
construir a continuación una aplicación, digamos de deportes, en donde requerimos
definir a la misma entidad persona, no es deseable volver a escribir la
definición para la entidad persona. Por medio de la reusabilidad podemos
utilizar una clase definida previamente en las aplicaciones que nos sea conveniente.
Es claro que la flexibilidad con la que se definió la clase va a ser
fundamental para su reutilización.
MANTENIBILIDAD: Las clases que conforman una aplicación, vistas como
módulos independientes entre sí, son
fáciles de mantener sin afectar a los demás componentes de la aplicación.
EXTENSIBILIDAD: Gracias a la modularidad y a la herencia una
aplicación diseñada bajo el paradigma de la orientación a objetos puede ser
fácilmente extensible para cubrir necesidades de crecimiento de la aplicación.
DESVENTAJAS DE LA TECNOLOGÍA ORIENTADA A OBJETOS
A pesar de que las ventajas de la programación
orientada a objetos superan a las limitaciones de la misma, podemos encontrar
algunas características no deseables en ésta.
LIMITACIONES PARA EL PROGRAMADOR: No obstante que la tecnología orientada a objetos no
es nueva, un gran porcentaje de programadores no están familiarizados con los
conceptos de dicha tecnología. En otras palabras, la lógica de la programación
estructurada sigue siendo predominante en la mayoría de los desarrolladores de
software, después de haber revisado de forma breve los principios de la
programación orientada a objetos, nos es claro que en ésta se requiere una lógica de pensamiento totalmente
diferente a la lógica comúnmente utilizada para la programación
estructurada.
TAMAÑO EXCESIVO EN LAS
APLICACIONES RESULTANTES: La
gran mayoría de los equipos de cómputo cuentan
con capacidades tanto de almacenamiento como de memoria lo suficientemente buena
como para ejecutar la mayoría de las aplicaciones que puedan desarrollarse con
la tecnología orientada a objetos, sin embargo existen casos en los que lo
anterior no se cumple.
Una de las desventajas de la programación orientada a
objetos es que cuando se heredan clases a partir de clases existentes se
heredan de forma implícita todos los miembros de dicha clase aun cuando no
todos se necesiten, lo que produce aplicaciones muy grandes que no siempre
encajan en los sistemas con los que se disponga.
VELOCIDAD DE EJECUCIÓN: Esto tiene que ver, en cierto modo, con el punto
anterior, una aplicación innecesariamente pesada en muchas ocasiones es más
lenta de ejecutar que una aplicación conformada únicamente por los módulos
necesarios.
No hay comentarios:
Publicar un comentario