Documentos de Académico
Documentos de Profesional
Documentos de Cultura
POO Unidad 1 - Intro A La POO
POO Unidad 1 - Intro A La POO
MÉXICO
Licenciatura En Informática
Informática V
(Programación Orientada a Objetos)
Al finalizar esta unidad, el alumno deberá estar familiarizado con los fundamentos
básicos del paradigma orientado a objetos.
Objetivos Específicos
Conocer brevemente los orígenes de la programación orientada a objetos
Definir qué es la orientación a objetos
Definir qué es el paradigma orientado a objetos
Conocer los principios fundamentales de la programación orientada a objetos
Describir algunas de las características de los lenguajes orientados a objetos
Identificar la diferencia entre el paradigma orientado a objetos y otros paradigmas
1.1 Introducción
En los 70’s se hablaba de la “crisis del software”, lo que dio lugar en el campo de la informática a una
tendencia estructurada (programación estructurada, análisis estructurado, diseño estructurado, etc.) se
pensaba que lo estructurado era la solución a todos los problemas de desarrollo de software ya que
aparecieron metodologías que promovían una solución jerárquica, disciplinada, organizada y planificada
para el desarrollo de software. Se introdujeron algunas mejoras en los lenguajes de programación para
facilitar estas características, como estructuras de control para eliminar el goto, algunos recursos de
modularidad y de organización de bibliotecas de programas.
Sin embargo, desafortunadamente pocos sistemas lograban terminarse, pocos se terminaban cumpliendo
los requerimientos iniciales y no todos los que se terminaban cumpliendo los requerimientos iniciales se
usaban según lo planeado. El problema (mal llamado de mantenimiento) era la falta de adaptabilidad a
nuevos requerimientos que no habían sido planeados. La “estructuración” facilitaba la revisión y
modificación de cientos de líneas de código, pero no lo impedía.
En la realidad es prácticamente imposible planear absolutamente todo, puesto que aprendemos con la
experiencia, no de la planificación. Actualmente es necesario desarrollar prototipos rápidamente sin tener
que esperar a que los requerimientos iniciales estén totalmente definidos; es preciso aprovechar el
software existente y tener facilidad de adaptación de este software a otros usos diferentes a los originales,
sin tener que modificar el código existente, con los riesgos que implica que algo que funcionaba ya no
funcione.
La orientación a objetos vino a suplantar la tendencia estructurada en los 90's, con los objetivos de hacer
frente a una mayor productividad, funcionalidad y sencillez en el desarrollo de aplicaciones (programas,
interfaces y bases de datos).
Actualmente la frase “orientado (a) a objetos”, es muy popular, escuchándose a cada momento frases
como “sistemas operativos orientados a objetos”, “lenguajes orientados a objetos”, “programación
orientada a objetos” (POO), “bases de datos orientadas a objetos”, etc. Sin embargo, el concepto tiene
más de 50 años, cuando se dio su nacimiento con la creación del lenguaje Simula en 1967, este lenguaje
fue creado para aplicaciones de simulación. Su redescubrimiento y popularidad se deben a lenguajes
como Smalltalk creado a finales de los 70s, Java y C++, lenguaje que fue creado por Bjärne Stroustrup y
fue basado en un lenguaje que es usado ampliamente como C.
La Orientación a Objetos permite una representación más directa del mundo real, reduciendo fuertemente
la transformación radical normal desde los requerimientos del sistema, definidos en términos del usuario,
a las especificaciones del sistema, definidas en términos de la computadora. En vez de tratar de modelar
un problema en algo familiar a la computadora se trata de acercar la computadora al problema, es decir,
modelar el problema mediante entidades independientes que interactúan y cuyas fronteras no están
determinadas por su instrumentación computacional sino por la naturaleza del problema.
1.2.2 Ventajas de la OO
Las técnicas OO fueron creadas para mejorar la capacidad del profesional de cómputo de diversos
modos. Es recomendable comprender todos sus beneficios potenciales e intentar conseguirlos todos, en
vez de sólo algunos. Los beneficios que la Orientación a Objetos proporciona son:
Reutilización: las clases pueden diseñarse para que se reutilicen en otros sistemas, al modificar y
ampliar con facilidad la implementación de estos componentes sin afectar al resto de su
estructura. También se pueden construir componentes reutilizables de software y bibliotecas
específicas de estos componentes fácilmente extensibles. Se debe construir un repositorio de
clases con esta finalidad.
Estabilidad y confiabilidad: las clases diseñadas para reutilización repetida se vuelven estables y
es probable que estas clases tengan menos fallas que el software creado a partir de cero. Aunque
no implica que estén libres de errores.
Encapsulamiento: el diseñador piensa en términos del comportamiento de objetos y no en detalles
de bajo nivel, el encapsulamiento oculta los detalles y hace que las clases complejas sean fáciles
de usar (las clases pueden verse como cajas negras).
Escalabilidad: ya que permite construir clases cada vez más complejas; las clases se construyen a
partir de otras existentes y probadas, esto permite construir componentes complejos de software
que a su vez se convierten en bloques de construcción de software más complejo.
Abstracción
Herencia
Identidad de los Objetos
Herencia
Encapsulamiento o encapsulación
Polimorfismo
Mientras que otros señalan siete u ocho de los siguientes aspectos como básicos a considerar para una
verdadera orientación al objeto:
Modularidad
Abstracción
Objetos
Clases
Encapsulamiento
Herencia
Polimorfismo y enlace dinámico
Persistencia
1.3.1 Modularidad
La modularidad consiste en dividir un programa en partes llamadas módulos, los cuales pueden
trabajarse por separado. En términos de programación, los módulos pueden compilarse por separado y la
división no depende de cierto número de líneas sino es una división en términos de integrar en un módulo
un conjunto de procedimientos relacionados entre sí, junto con los datos que son manipulados por tales
procedimientos.
Por ejemplo, un automóvil está constituido por un conjunto de módulos tales como un sistema eléctrico,
uno mecánico y uno de frenado. Cada módulo se trabaja por separado y el especialista sólo conoce la
forma en que se relaciona el módulo con los otros, pero no tiene por qué saber los detalles de
funcionamiento de otros módulos o sistema.
Estos conceptos no son exclusivos de la OO, pues se han desarrollado desde la programación
estructurada, sólo que en ésta se pueden omitir (desde luego bajo responsabilidad del programador),
pues hacerlo, lleva a tener grandes programas en un solo archivo y sin estructura alguna, lo cual causa
grandes pérdidas de tiempo al desear modificar tal programa.
La OO no puede lograrse sin hacer uso de los mecanismos antes mencionados y para ello, proporciona
los medios para ir creando módulos llamados clases. En las clases, cada tipo no simple es un módulo, y
cada módulo de alto nivel es un tipo.
La abstracción es esencial para construir cualquier sistema, sea o no orientado a objetos y debe
enfocarse más en qué es un objeto y qué hace, antes de pensar en la implementación.
Por ejemplo, un automóvil puede abstraerse como un objeto que sirve para desplazarse a mayor
velocidad, sin importar cómo lo haga.
Una característica de la abstracción es que un objeto puede abstraerse de diversas formas, dependiendo
del observador. Así, el automóvil que se mencionaba puede ser visto como un objeto de colección por un
coleccionista, una herramienta de trabajo por un corredor profesional, una mercancía por un vendedor,
etc.
Las abstracciones en un sistema OO ayudan a representar los diferentes puntos de vista incorporados en
el sistema a desarrollar. Los objetos son descritos como implementaciones de tipos de datos abstractos.
En conjunto las abstracciones forman una jerarquía que muestra cómo las diferentes perspectivas de un
sistema se relacionan unas con otras.
Como sabemos, la abstracción es un concepto básico en la solución de problemas, ya que permite definir
conceptos generales a partir de objetos particulares que representan algún aspecto del mundo real. Los
TDA son independientes de la implementación, lo cual hace posible centrarse en los datos y operaciones
sin pensar en el lenguaje de programación y posteriormente traducirlos al lenguaje deseado.
1.3.3 Objetos
A pesar de que el punto central en esta metodología de programación es el concepto de objeto, resulta
difícil tratar de definirlo. En un diccionario se puede encontrar la siguiente definición:
“Un objeto es cualquier cosa que se ofrece a la vista y afecta los sentidos. Es una entidad
tangible que exhibe algún comportamiento bien definido”.
Cada objeto en un sistema OO usualmente tiene un nombre, también llamado referencia o asa (handle);
este nombre distingue a un objeto de otros.
Por ejemplo, un automóvil puede tener diversos estados, puede estar estacionado o en circulación. Un
comportamiento asociado con el auto puede incluir encenderlo, lo cual modifica su estado, y
generalmente tiene una identidad marca, modelo, número de serie del motor y placa.
Por ejemplo, podríamos tener un conjunto de objetos: un auto compacto, un auto de carreras, un perro
maltés, un perro chihuahua, un barco y un triángulo. En este caso se podrían agrupar el auto compacto y
el de carreras en una clase; el perro maltés y el chihuahua en otra clase; el barco en otra y el triángulo en
una última.
Compacto
Clase Deportivo
Auto
Camioneta
El grupo de perros puede ser considerado una clase, ya que es posible asociar atributos con la clase
perro, tales como color, tamaño o raza y también se pueden asociar operaciones o comportamientos con
esta clase: el perro ladra, se alimenta y se baña. Similarmente, la clase auto tiene sus propios atributos
(color, tamaño y cantidad de pasajeros) y operaciones (arrancar, circular y detenerse).
Se dice que un objeto es una instancia de una clase. Cada instancia tiene sus propios atributos (es decir,
tiene formas de describir su propio estado en cualquier instante de tiempo), pero comparte nombre y
comportamientos con las otras instancias de la clase.
Una clase es un módulo y un tipo de datos abstracto que definen un grupo de objetos que comparten
características comunes. Las clases se caracterizan por los mensajes que pueden recibir. Para facilidad
de manejo y mantenimiento, las clases se agrupan en paquetes. En relación a su alcance, las clases
pueden ser públicas, aquellas que pueden ser vistas desde fuera de un paquete, o privadas, las que sólo
son visibles dentro de su paquete.
Por ejemplo, se puede hablar de autos como una clase y mencionar propiedades compartidas tales como
los asientos o parabrisas, pero también se pueden emplear los valores de los atributos para distinguir a un
miembro de la clase de otro (un auto de carreras corre a una mayor velocidad). Así, una clase describe un
conjunto de objetos que comparten una estructura común y tienen comportamientos comunes, pero los
valores de los atributos permiten distinguir a unos de los otros.
Los conceptos de clase y objeto están profundamente relacionados, no se puede hablar de un objeto sin
prestar atención a su clase. Pero tienen diferencias:
Objeto es una entidad concreta que existe en el tiempo y el espacio (se crea al momento de
ejecución del programa), una clase representa sólo una abstracción, la “esencia” de un objeto (se
crea al momento de compilar el programa).
Los objetos son conceptos dinámicos porque los objetos muestran un comportamiento e
interactúan entre ellos, las clases son estáticas, no interactúan entre ellas.
1.3.5 Encapsulamiento
La clase representa la esencia del objeto y el objeto es una entidad que existe en el tiempo y el espacio.
El objeto se define también como instancia de la clase a que pertenece. La clase tiene dos vistas: la
exterior, en la cual se hace énfasis en la abstracción y se oculta en la estructura y secretos de
comportamiento, y la vista interior o implementación. Aquí se nota que es indispensable hacer uso del
concepto de encapsulación.
Generalmente, a un objeto se le debe “pedir” o “decir” que cambie sus propios datos con un mensaje, en
vez de esperar que procesos externos cambien la naturaleza de un objeto.
Al encapsular los atributos y comportamiento de un objeto, se separan los aspectos externos de un objeto
(los accesibles para todos) y se ocultan los detalles de implementación (los accesibles para nadie). Sin
embargo, encapsulamiento no es lo mismo que ocultamiento de información; de hecho, el límite de
protección del encapsulamiento puede ser transparente o translúcido. Esto es, en algunos casos, se
puede ver dentro del límite de protección (es transparente) pero otras veces está oculto (es translúcido).
De hecho, la abstracción es una técnica que ayuda a identificar qué información debe ser visible y cuál
debe ocultarse.
Por lo tanto, el encapsulamiento es una técnica para empaquetar la información de tal forma que se
oculte lo que debe ocultarse y haga visible lo que está pensado para serlo.
El encapsulamiento permite una alta cohesión y un bajo acoplamiento entre módulos (clases).
Con esto se trata de lograr que al tener algún cambio en la implementación de un objeto no se tengan que
modificar los programas que utilizan tal objeto.
Siguiendo con el ejemplo del automóvil, se sabe que existen diversos mecanismos para que funcione, en
particular se tiene el sistema de frenado que todo mundo sabe que sirve para detener el auto al pisar el
pedal de freno, pero sólo el mecánico sabe los detalles de la implementación. Por otro lado, si en algún
momento se cambia, para el conductor es transparente.
1.3.6 Herencia
Evidentemente, algunos atributos son compartidos entre miembros de una clase. Por ejemplo, los autos
compactos y los autos de carreras tienen asientos, pero difieren en otras características como la
velocidad. Las clases pueden ser organizadas jerárquicamente de acuerdo con las semejanzas y
diferencias entre ellas; esta jerarquía exhibe la estructura de herencia de clases de la OO.
La herencia que es una relación entre clases donde las características y el comportamiento general de
una superclase puede compartirse (darse o derivarse) a sus subclases, permite que una clase sea
definida como una extensión o restricción de otra y es la contribución más importante de la POO, pues
mediante este mecanismo es posible lograr la principal meta de la OO que es la reutilización de código.
Una subclase define el comportamiento de un conjunto de objetos que heredan algunas de las
características de la clase padre, pero adquieren características especiales no compartidas por el padre,
en este sentido se dice que la subclase es una especialización de la clase padre.
En ocasiones se usa una clase abstracta para simplificar la jerarquía, de manera que no se pueda definir
ningún objeto de la clase abstracta si no es como una instancia de una subclase.
La herencia define relaciones entre clases, donde una clase comparte la estructura o comportamiento
definidos en una o más clases.
La herencia múltiple y repetida permite que se pueda declarar una clase como heredera de varias, e
incluso de ella misma.
La herencia simple permite heredar sólo de una clase padre. En estos casos, se implementan las
llamadas interfaces que permiten simular la herencia múltiple.
1.3.7 Polimorfismo
Un comportamiento es una acción o transformación que un objeto realiza a la cual está sujeto. Un
comportamiento de un objeto se activa por la recepción de un mensaje o por la entrada en un estado
particular. En ocasiones el mismo comportamiento se manifiesta de manera diferente en diferentes clases
o subclases, propiedad que se denomina polimorfismo.
El polimorfismo es la capacidad de tener métodos con el mismo nombre, pero con una implementación
diferente.
Por ejemplo, al tratar de frenar un auto siempre se debe oprimir el pedal del freno y el vehículo se
detendrá sin importar si los frenos son de tambor o de disco.
Objeto
Corredor
Una forma de polimorfismo en OO se da al usar un operador para aplicarlo a elementos de diferente tipo.
Por ejemplo, al pretender sumar enteros, reales o complejos, se emplea el mismo símbolo +, esto se
conoce como sobrecarga de operadores. En este caso el compilador se encarga de determinar cuál es
el método que se está invocando de acuerdo a los objetos involucrados en la operación.
El polimorfismo permite agregar nuevas clases sin cambiar el código existente. Así, un nuevo tipo de
transporte, como un camión puede agregarse con facilidad a la jerarquía. Sin embargo, hay que señalar
que será necesario revisar los métodos.
1.3.8 Persistencia
La última propiedad asociada con sistemas OO es la persistencia, que es la capacidad del nombre,
estado y comportamiento de un objeto para trascender el espacio o el tiempo. En otras palabras, el
nombre, estado y comportamiento de un objeto se pueden conservar aun cuando el objeto es
transformado o destruido.
Una vez almacenado en memoria secundaria, se puede reconstruir para usarlo durante la ejecución
(materialización del objeto).
Por ejemplo, se puede desear guardar información del mantenimiento de un auto, para poder comparar
los ajustes y modificaciones que se le han realizado. En este caso, el objeto persiste aun cuando sus
atributos se transformen.
Mientras que en la etapa de programación (programación orientada a objetos-POO), los términos a utilizar
son: Tipo de Dato Abstracto, Objeto, Mensaje, Clase, Sobrecarga, Enlace Dinámico, Polimorfismo,
Herencia, Variables de Clase o de Instancia, Métodos, Constructores, Destructores, Genericidad,
Aserción, Invariante, etc.
Todos estos términos son metáforas del paradigma, y configuran el lenguaje o "jerga" que utiliza el
ingeniero informático en el diseño y desarrollo de software aplicando esta metodología.
Las Ciencias de la Computación están llenas de metáforas que han llegado a trascender el círculo
especializado del informático y son utilizadas de forma rutinaria por la inmensa mayoría del público,
debido a la incorporación de la computadora en la actividad diaria. Dos excelentes ejemplos son los
términos "memoria" y "ventanas". Estas palabras presentan poca semejanza real con los conceptos que
representan en el lenguaje habitual. No obstante, los términos informáticos han quedado acuñados y los
utilizamos indiscriminadamente, aparentemente sin gran dificultad.
En realidad, muchos de los conceptos creados con la programación estructurada como las estructuras de
control, la modularidad, la definición de tipos (o estructuras) de datos y la definición del alcance de las
variables persisten en estos lenguajes, agregando la mayoría de las características citadas en el punto
anterior.
En algunos LOO como Smalltalk y Phyton no hacen chequeo estático de tipos, sino que los tipos son
verificados en tiempo de ejecución. Esto es menos restrictivo durante la compilación, pero impone una
sobrecarga en tiempo de ejecución, ya que durante esta se determina si un objeto puedo o no dar
respuesta a un mensaje; además, esto permite que se generen errores difíciles de detectar al momento
de ejecución.
Algunos LOO son llamados híbridos, como C++ y Java, en estos lenguajes, casi todo es un objeto, pero
existen elementos que no son objetos, como los tipos de datos primitivos. En cambio, los LOO puros,
todo es un objeto.
Lenguajes basados en objetos, son los que soportan encapsulamiento e identidad del objeto; es
decir, los métodos y atributos se ocultan dentro y se hacen privados a los objetos, y estos objetos
tienen identificadores únicos. Estos lenguajes tienen poco o ningún soporte para las clases, en el
sentido de que no hay soporte para la abstracción en conjunto. En otras palabras, los objetos no
pertenecen a las clases abstractas, las cuales tienen una identidad independiente. Además, no
hay herencia. El lenguaje Ada original es típico de este tipo.
Lenguajes basados en clases, como CLU, incluyen la noción de abstracción en conjunto a nivel
instancia/clase, pero no soportan la herencia entre clases abstractas, las cuales no pueden tener
instancias concretas. Los lenguajes basados en clases incluyen todas las características de los
lenguajes basados en objetos.
Los lenguajes orientados a objetos se caracterizan porque toman las características de los
lenguajes basados en objetos y de los basados en clases y tienen además herencia completa
entre clases e instancias y entre clases y clases o, lo que es lo mismo, las instancias y las clases
heredan los métodos y atributos de las clases a las que pertenecen.
Apoya los tipos de datos abstractos. Los TDA se basan en las clases de datos diseñadas
previamente. Cada TDA protege los datos del uso inadecuado, al ofrecer una cantidad de
operaciones permisibles. Para esto, tanto la representación de los datos como las operaciones
permisibles están protegidos ocultando los detalles de su implementación. Si un lenguaje de
programación está orientados a los tipos de datos abstractos, los tipos identificados para un
sistema de aplicación se asocian de manera directa con las unidades de código; el abismo entre el
concepto y la realidad se reduce en gran medida.
Soporta la selección de métodos. Al seleccionar el método, el usuario sólo debe especificar la
operación a aplicarse a cada objeto (o en lenguajes más amplios, a uno o más registros). Así, el
sistema elegirá el método adecuado para los parámetros especificados. En otras palabras, el
usuario sólo debe especificar lo que debe hacerse y el selector del método determina cómo debe
aplicarse. El polimorfismo es una de las aplicaciones más comunes de la selección de método.
Soporta la herencia de tipo. Con la herencia de tipo, los sistemas se amplían y afinan por medio
de componentes de tipos ya existentes. La herencia de tipo permite construir los sistemas a partir
de jerarquías de tipo ya existentes; proporciona los mecanismos para la construcción y
reutilización del software. De esta forma, no es necesario reescribir el código, sólo aquella parte
que es diferente. La herencia impone un mecanismo en los TDA que reduce en gran medida la
complejidad de los sistemas resultantes.
La tecnología orientada a objetos como herramienta para analizar, diseñar e implementar aplicaciones
permite obtener aplicaciones más fáciles de modificar y extender a partir de componentes reutilizables,
esto disminuye el tiempo de desarrollo y aumenta la confiabilidad de los sistemas, estas características
son particularmente importantes al momento de crear, de modo más sencillo, aplicaciones muy grandes y
complejas.
Cuestionario
Leer en otras fuentes sobre los temas tratados en esta unidad, y resuelve el siguiente cuestionario,
Explicar:
1. En qué consiste la “Crisis del Software” y porqué dio origen a buscar nuevas formas de desarrollar
sistemas.
2. Cuándo nació el paradigma orientado a objetos y con qué lenguaje de programación.
3. Qué es un CIS.
4. En qué consiste el paradigma orientado a objetos.
5. Qué es la orientación a objetos.
6. Cuáles consideras que son las tres ventajas principales de la orientación a objetos y porqué.
7. Cuáles son los ocho principios fundamentales del paradigma orientado a objetos.
8. Qué es la modularidad, cómo se logra en el paradigma orientado a objetos y en qué difiere del
paradigma imperativo.
9. Que es la abstracción y para qué se emplea en el paradigma orientado a objetos.
10. En programación OO qué es un objeto y cuáles son los elementos que lo componen.
11. Qué es una instancia de una clase.
12. Qué es una clase y qué diferencias tiene con un objeto.
13. A qué se refieren las vistas interna y externa de una clase.
14. Qué es encapsulamiento, qué tipos de encapsulamiento existen, porqué difiere del ocultamiento
de información y porqué es tan importante en el PaOO
15. Qué es la herencia de clases y qué tipos de herencia existen.
16. Qué diferencia existe entre una superclase y una subclase.
17. Qué es el polimorfismo y cómo se relaciona con el enlace dinámico.
18. Qué es la persistencia de un objeto.
19. En qué radica el concepto Objeto/Mensaje en el PaOO.
20. Cuál es la diferencia entre un LOO híbrido y uno puro.
21. Cuál es la diferencia entre los lenguajes basados en objetos, los lenguajes basados en clases y
los orientados a objetos.
22. Cuáles son los campos de aplicación del PaOO.
23. Qué diferencias existen entre la programación OO y la estructurada