Você está na página 1de 16

UNIDAD I: LA POO Y EL LENGUAJE DE PROGRAMACION JAVA

1.1 Introducción a la POO.


1.1.1. Que es programación orientada a objetos (POO).
1.1.2. Historia de la POO.
1.1.3. Concepto de Objeto y Clase.
1.1.4. Abstracción.
1.1.5. Encapsulamiento.
1.1.6. Herencia.
1.1.7. Polimorfismo.

1.1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

1.1.1. Que es programación orientada a objetos (POO).

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.

¿Cómo definiría con sus propias palabras POO?

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.

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.

Escriba un ejemplo sencillo además de los planteados de POO

1.1.2 Historia de la POO

Al mismo tiempo que se da la Crisis del Software, por otro lado la Orientación a Objetos
(OO) se empezó a discutir a fines de los años 60 con el desarrollo del lenguaje SIMULA67
por Nygaard y Ole-Johan Dahl en el Centro de Cálculo Noruego, en él, introdujeron los
conceptos de clase, subclases y rutinas, muy parecidos los conceptos a los lenguajes
orientados a objetos de hoy en día. A mitad de la década de los 70 los científicos del
Centro de Investigaciones Palo Alto de XEROX (PARC) (XEROX Palo Alto Research Center)
crearon el lenguaje SMALLTALK, el primer lenguaje orientado a objetos consistente y
completo. En él cada elemento del lenguaje fue realizado un objeto. Este último lenguaje
evolucionó a través de varios lanzamientos realizados por PARC.

A pesar de este movimiento temprano hacia los lenguajes orientados a objetos, sólo se
lograron pequeñas incursiones en la comunidad de la programación general. El progreso
reciente se ha acelerado debido principalmente a la disponibilidad de las extensiones
orientadas a objetos para dos lenguajes populares: C y PASCAL, y a las extensiones
prometidas para otros lenguajes comerciales populares como BASIC y COBOL.

En sus comienzos la programación de computadores era una tarea relegada


prácticamente a los "genios" de la computación de aquel entonces; hacer un programa
para computador demandaba miles de horas de tiempo invertido y desde luego miles
de miles o millones de líneas de código para llevar a cabo una tarea determinada. Bien
la programación de ese entonces tenía un estilo particular llamado hoy día
programación en spaghetti, se llama así porque todo el código generalmente sigue una
línea secuencial desde la primera instrucción hasta la última, ocasionalmente hay saltos
entre instrucciones, pero generalmente se regresa al punto donde se originó el salto...
los lenguajes más populares en ese entonces eran desde luego el ASM, el FORTRAN y el
COBOL.

Luego los programas se fueron haciendo más grandes y complejos, así que las cosas se
comenzaron a hacer dificiles de manejar (es decir aún más dificiles de manejar), allí nació
una nueva forma de programación... una nueva metodología, la programación
estructurada.

Programación Estructurada

La solución a tantos problemas fue básicamente sencilla, agrupar el código por


funcionalidad de tal forma que cada funcionalidad pueda ser invocada tantas veces
como se necesite, esto permitió reducir las líneas de código necesarias para crear un
programa ya que si existe una rutina compleja que podía ser en algún grado repetitiva,
esta se coloca en una función que sea aplicable en uno o más casos diferentes, veamos
un ejemplo...

Supongamos que tenemos un programa que controla las cuentas de un banco


(imaginemos un banco pequeño), así que se ha creado un conjunto de programas para
tal fin. Dentro de esos programas tenemos una sección de programa que lo que hace es
manejar los retiros que ha hecho el dueño de la cuenta, lo cual implica descontar un
valor determinado de una cuenta y elaborar el registo contable correspondiente...
imaginemos otra parte del código de ese programa, un cliente paga su tarjeta de crédito
así que otra vez el programa descuenta el valor de la cuenta del cliente, también elabora
el registro contable correspondiente y adicionalmente hace otros registros y abonos a
la cuenta de la tarjeta de crédito... Este tipo de cosas las tendría que hacer el programa
miles de veces, una vez cada que se presente una transacción en el banco.

En programación spaguetti eso tomaría miles de líneas como lo vimos anteriormente,


ya que por cada transacción se requiere volver a repetir las instrucciones para hacer lo
correspondiente; en programación estructurada esto ya no es necesario ya que
habríamos creado algunas funcionalidades que nos permiten invocarlas cuando las
necesitemos, así solamente crearíamos el código para registrar el abono o el descuento
de dinero de una cuenta, y otro código para hacer registros contables, así que cada vez
que los necesitemos simplemente colocamos una línea de código haciendo el llamado a
la funcionalidad, y no repitiendo nuevamente todo el código que hace parte de la misma.

Pero los días de la programación estructurada estaban contados, los programas


siguieron creciendo, tener un código altamente estructurado ya no ayudaba lo
suficiente, pues la complejidad y magnitud de las cosas que se deben hacer aumentaba
exponencialmente...
Y llegó la POO

Cuando las cosas se hicieron demasiado complejas, fue necesario tomar decisiones
radicales, cuando nació la programación estructurada la solución fue sencilla...
demasiado sencilla, agrupar las cosas en funcionalidades... funcionó y de hecho funciona
tanto que si se hubiese deseado disminuir nuevamente la complejidad de los problemas
de la programación a gran escala simplemente se hubiesen creado niveles de
agrupamiento de funcionalidades, algo como funcionalidades de funcionalidades, pero
el problema se volvería a repetir entre más grande fuera el software, así que hubo
necesidad de cambiar las cosas de una manera más profunda.

La forma en que se hacían los programas era siempre orientada a la funcionalidad, es


decir que haga lo que debe y que lo haga de la manera más rápida, ocasionalmente y si
era posible reutilizar el código ya creado, los incidentes comenzaron a aparecer veamos
una ejemplo, sigamos con el banco...

Bien, el banco ha crecido un poco más razón por la cual necesitan modernizar su sistema
(hardware, programas etc...) se ponen en la labor de crear nuevos programas, como los
requieren en el menor tiempo imposible dividieron su área de desarrollo en varios
grupos: uno que hará toda la parte con cuentas corrientes, otro que funciona con
cuentas de ahorro, y otro con tarjetas débito, otro con CDT etc. Para evitar algunos
problemas definen una serie de estándares de nomenclatura y ese tipo de cosas. Tiempo
después los módulos del programa ya están casi listos así que se disponen a integrar
todos esos programas en un programa único, pero cuando iniciaron con eso pasó algo
inesperado...

Los señores del grupo de cuentas de ahorros crearon unas funciones, se llaman débito
y crédito, mientras tanto los señores del grupo de CDT´s , los de tarjetas, los de cuenta
corriente etc. crearon también todos funciones llamadas débito y crédito, pero todas
hacen cosas diferentes cada una para su caso puntual... resultado de la operación: hay
que renombrar todas las funciones débito crédito para que todas se llamen diferentes,
cosa que todos los grupos... con desagrado decidieron acatar, todos excepto dos.

El grupo de cuentas de ahorro y el de tarjeta de crédito no pueden hacer el cambio de


una manera tan sencilla ya que han utilizado unas librerías provistas por terceros y que
ya desde hace tiempo interactúan con u sistema de transacciones a nivel internacional
que requiere que el software cumpla con una serie de lineamientos e interfaces de
programación, y para completar el problema parte de esas interfaces implican no solo
es usar el nombre que ya usan en sus funciones sino que el nombre que se ha propuesto
utilizar ya es usado para otros fines en dichas librerías integradas, etc.

Así las cosas les tardara un poco de tiempo a los señores hacer los cambios que necesitan
porque definitivamente el programa integrador no se puede crear si hay dos funciones
con el mismo nombre dentro del paquete, imaginemos todas las variables que habrán
quedado con nombres parecidos, sino es que iguales... en un programa tan enorme
evitar esa situación es algo muy complicado.
Pero en POO las cosas habrían sido diferentes, puesto que desde que se han creado los
módulos cada uno es un componente por separado y las funciones de los Sre del CDT
serian accedidas algo así como:

CDT.debito

CDT.crédito

Las de ahorros serian:

Ahorros.debito

Ahorros.crédito

Y así sucesivamente con cada uno de los módulos, de hecho todos podrían tener las mismas
variables: a, b, c, d, e, f y no pasaría absolutamente nada.

Otro problema con el sistema estructurado es que si los señores de CDT tienen una función para
encripción única que no debe ser usada por nadie más... no hay garantía de que más adelante
los señores de tarjeta de crédito la usen, y pueden hacerlo por que hace parte del mismo
programa enlazado, eso sería muy difícil sino imposible de evitar en programación estructurada,
pero en POO sería muy sencillo ya que le diríamos a nuestra función que fuera de uso privado,
es decir solo utilizable dentro del grupo de CDT.

Según el texto leído sobre programación estructura y POO explique de forma sencilla
porque afirmaría usted que la POO posee más ventajas que la Programación
estructurada.

Paradigma de la Programación Orientada a Objetos.

Para aquel que no es un programador, Orientación a Objetos significa algo bastante


familiar: considerar al mundo como un conjunto de entidades u objetos que están
relacionados y se comunican entre ellos.

Esta es la forma en que la gente normal ve el mundo, así es que este pensamiento tiene
intrínsecamente sentido.

La Orientación a Objetos se basa en estas ideas: un programa es un mundo que


representa un subconjunto del mundo real. La estructura del programa se simplifica en
gran medida si cada una de las entidades u objetos del problema que se está modelando
corresponde directamente con un objeto que se puede manipular internamente en un
programa.

Para el desarrollo de sistemas, la orientación a objetos es un nivel de abstracción de


computadora más allá de los procedimientos y los datos. La orientación a objetos anima
al desarrollador de sistemas a concentrarse en los temas importantes e ignorar el resto
a la hora de la modelación.
El hecho de que el tema central sean los objetos, aunque intuitivamente, marca una
desviación significativa de los anteriores paradigmas de la programación.

Una ecuación para reconocer una aproximación a la Orientación a Objetos es:

ORIENTACIÓN_OBJETOS = CLASES Y OBJETOS + HERENCIA + COMUNICACIÓN CON MENSAJES

Todos los sistemas que merecen la descripción de Orientado a Objetos contienen estos
mecanismos esenciales, aunque los mecanismos pueden no estar realizados
exactamente de la misma forma. Analicemos ahora los términos de la ecuación.

1.1.3 Conceptos de Objetos y Clase

OBJETOS (Sinónimo de instancia). Es la abstracción de alguna cosa en el dominio del


problema que refleja la capacidad de un sistema de alcanzar información alrededor de
él. Los objetos, por lo tanto, son entidades que tienen atributos (datos) y formas de
comportamiento (procedimientos) particulares. Lasaplicaciones pueden constar de
diferentes clases de objetos. Un objeto pasivo es el que actúa solamente bajo petición.
Los objetos activos efectúan el seguimiento de los sucesos que ocurren en una aplicación
y actúan de forma autónoma.

Un objeto consta de:

 Tiempo de vida: La duración de un objeto en un programa siempre está limitada


en el tiempo. La mayoría de los objetos sólo existen durante una parte de la
ejecución del programa. Los objetos son creados mediante un mecanismo
denominado instanciación, y cuando dejan de existir se dice que son destruidos.
 Estado: Todo objeto posee un estado, definido por sus atributos. Con él se
definen las propiedades del objeto, y el estado en que se encuentra en un
momento determinado de su existencia.
 Comportamiento: Todo objeto ha de presentar una interfaz, definida por sus
métodos, para que el resto de objetos que componen los programas puedan
interactuar con él.

Defina con sus propias palabras que es un objeto y las partes que este consta

CLASE. Una clase es una descripción de un conjunto de objetos casi idénticos. Una clase
consta de métodos y datos que resumen las características comunes de los objetos,
incluyendo una descripción de cómo crear un nuevo objeto de la clase. En otras
palabras, las clases contienen los anteproyectos para crear objetos.

Redefiniendo un objeto. Un objeto es un modelo o instancia de una clase.


Ejemplos de estos conceptos (utilizaremos un lenguaje más fácil de entender para
definirlos):
Una clase es un molde que define los datos y procedimientos que actúan sobre esos
datos y los objetos serán los elementos producidos por ese molde.
Ejemplo 1:
Consideremos cómo un programador podría designar una aplicación de procesamiento
de una posición en el espacio en forma orientada a objetos.

Los objetos serían PuntoA, PuntoB donde tanto PuntoA como PuntoB tienen las
características de posición.

Veamos ahora cómo sería la aplicación con el sistema de los números complejos en
forma orientada a objetos.

Algunos objetos son p y q que por ser números complejos son de la forma (real,
imaginaria).

Defina con sus propias palabras que es una clase:

Descripción del término herencia:

La herencia es un mecanismo para expresar similitud entre clases, amplificando


definiciones de las clases similares previamente definidas. La herencia permite crear
nuevas clases llamadas subclases agregando solamente las diferencias con la clase. En
otras palabras la herencia es una partición en subclases
más especializadas.
El principio en que se basa este concepto es de que las clases que se derivan de otra
clase, comparten las características comunes de la clase de la que descienden.

Ejemplo 1:

Ejemplo 1:
Ejemplo 2
Ejemplo 2:
Para este ejemplo usaremos la clase publicación.

Descripción del término comunicación con mensajes.

Los objetos tienen la posibilidad de actuar, la acción sucede cuando un objeto recibe un
mensaje, que es, una solicitud que pide al objeto que se comporte de alguna forma.
Cuando se ejecutan los programas orientados a objetos, los objetos reciben, interpretan
y responden a mensajes procedentes de otros objetos.

Los mensajes pueden contener información para clasificar una solicitud. El objeto
emisor del mensaje no necesita conocer la forma en que el objeto receptor está llevando
a cabo la solicitud, solamente conoce que se está sucediendo.
Los procedimientos residen en el objeto y determinan cómo actúa el objeto cuando
recibe un mensaje.

De hecho, los métodos proporcionan el único mecanismo para cambiar los valores de
las variables del objeto. (A este hecho se le conoce como encapsulamiento). Los
mensajes que reciben el objeto son los únicos conductos que conectan al objeto con el
mundo exterior.

Estas características de los objetos confieren a la orientación a objetos su ventaja: la


orientación a objetos fomenta la modularidad haciendo muy claras las fronteras entre
objetos, explícita la comunicación entre los mismo y oculta los detalles de la realización.

En un programa con orientación a objetos ocurren tres sucesos:


1) Se crean los objetos cuando se necesitan.
2) Los mensajes se mueven de un objeto a otro a medida que el programa procesa
internamente información o responde a la entrada de los usuarios.
3) Se borran los objetos cuando ya no son necesarios y se recupera memoria.

En base al ejemplo anterior escriba otro ejemplo donde represente al objeto, clase
método y herencia.
Características deseadas de la Programación Orientada a Objetos
Las características deseadas pueden variar y es difícil ponerse de acuerdo.
1. Principio de Abstracción
• Datos
• Procedimientos
2. Encapsulamiento
3. Herencia
• Simple
• Múltiple
4. Comunicación con mensajes
5. Polimorfismo

Manejo automático de memoria


• Constructores
• Destructores
Métodos virtuales
Sobreposición de operadores

Antes de ver cada uno de estos conceptos es importante mencionar que los ejemplos
de los mismos se darán con seudo código, por lo que daremos una idea de este
concepto.

El seudo código se utiliza como una herramienta para estructurar el código de un


programa sin comprometerse con ningún lenguaje, pero que es posible que tenga
alguna semejanza con el lenguaje a utilizar.

En el seudo código se utilizan palabras en nuestro lenguaje que son similares a las
palabras utilizadas por los lenguajes de programación. En realidad el seudo código es
muy similar a un algoritmo pero más estructurado, ya que se le deben de dar sangrías a
la escritura de las instrucciones para hacerlo más legible en la lectura. Iniciamos:

Principio de abstracción:
• Es el principio de ignorar los aspectos de un sujeto que no son relevantes en un
propósito de orden de concentración más exacto.
• El proceso de representar entidades reales como elementos internos a un programa
recibe el nombre de abstracción.
• De esta forma, un tipo de dato abstracto se puede escribir concentrándose en las
operaciones que manipulan a los objetos de este tipo, sin caer en detalles de
representación y manipulación de datos.

 Datos. Es un atributo del objeto que representa cuantitativamente o


cualitativamente a ese objeto.

 Procedimiento. Es una operación que lleva a cabo un servicio a los atributos del
objeto.
Ejemplo 1:
En el ejemplo de la posición en el espacio se quiere representar en objetos, queremos
abstraer esta parte del mundo real a un programa que pueda representarlos. Una
posición en el plano la determinan las coordenadas (x, y), que serían nuestros datos y
los procedimientos que las manipulen pueden ser:

iniciar posición
leer x
leer y
saluda
Ejemplo 2:
En el ejemplo de los números complejos se tiene que éstos son de la forma (real,
imaginaria), donde real e imaginaria son números reales, de lo que podemos intuir que
los datos sean: real e imaginaria
Los atributos que manipulan estos datos pueden ser todos los operadores aritméticos
(+, -, *, /) y los
operadores de relación ( =, < > ).

Encapsulamiento (ocultamiento de datos). Se refiere al hecho de que ningún


programador ni de ninguna otra parte de un programa se pueda tener acceso a los datos
de un objeto en forma directa, sino a través de los procedimientos del objeto.
Ejemplo 1:
En este ejemplo para leer cualquiera de las coordenadas no se puede directamente sólo
leyendo por separado las coordenadas con los procedimientos de lectura.
Ejemplo 2:
En el ejemplo de los números complejos cada número complejo no se puede modificar
a menos que sea con los operadores.

Herencia. La herencia es un mecanismo que para expresar similaridad entre clases,


simplificando definiciones de clases similares previamente detenidas.
• La herencia simple es cuando el lenguaje sólo permite que una clase derive de una
clase.
• La herencia múltiple es cuando una clase puede ser derivada de más de una clase.

Ejemplo 1. Herencia simple:


Ejemplo 2. Herencia Múltiple: (Multimedia)

Comunicación con mensajes. Las variable de un objeto sólo pueden ser manipuladas por
sus propios métodos. Es decir, los mensajes mandan una petición de acción a un objeto,
mientras que los métodos del objeto deciden cómo llevar a cabo la acción.

Ejemplo: En la definición de posición consta de los datos, coordenadas X e Y y los


métodos que inician y devuelven los valores X y Y.
Procedimiento leer X
Regresa valor de X

Polimorfismo
Es cuando una clase tiene varios procedimientos con el mismo nombre, pero con distinto
tipo y/o número de argumentos.
Ejemplo 1:
Se puede tener más de un procedimiento saluda en la clase posición.
a) Se puede tener un procedimiento procedimiento Saluda escribe "Hola soy posición";
b) Se puede tener un procedimiento procedimiento Saluda (mensaje) escribe mensaje;

Manejo Automático de Memoria. En el apartado de comunicación con mensajes se


menciona que en un programa con orientación a objetos ocurren tres sucesos, dos de
ellos nos interesan.

El primer suceso dice: "Se crean los objetos cuando se necesitan." y el tercer suceso
indica: "Se borran los objetos cuando ya no son necesarios y se recupera la memoria.".
Estos sucesos se desarrollan con los constructores y destructores.

• Constructores
Los constructores son procedimientos de la clase que permiten crear objetos. Un
constructor es llamado para asignar memoria a un objeto, para asignar valores a los
datos del objeto y realizar tareas iniciales para un nuevo objeto.
Esto implique que si no podemos trabajar con un objeto que no haya sido creado a
través de un constructor y si sólo se pueden modificar mediante los procedimientos de
la clase NO TENEMOS FORMA DE CORROMPER EL OBJETO, lo cual aumenta la
confiabilidad y facilita la rehusabilidad.

• Destructores
Un destructor es un procedimiento de la clase que realiza la tarea opuesta a su
constructor, libera la memoria que fue asignada al objeto que fue creado por el
constructor. Es deseable que el destructor se invoque implícitamente cuando el objeto
abandone el bloque donde fue declarado.

El destructor le permite al programador despreocuparse de tener que liberar la memoria


que deja de utilizar y correr el riesgo de que ésta se sature.
Ejemplos:
Normalmente en los lenguajes con orientación a objetos el destructor como el
constructor tienen el mismo nombre de la clase a la que pertenece.
Ejemplo 1:
Constructor iniciar (real 1, real 2)
x = real 1
y = real 2
Destructor iniciar
borra x
borra y

Métodos Virtuales. Una jerarquía de clases unidas por la herencia, con nombres de
métodos comunes para operaciones que son similares conceptualmente, pero que
realizan tareas diferentes. Como consecuencia, cuando diferentes objetos de las
diferentes clases de la jerarquía reciben el mismo mensaje, éste provoca acciones
totalmente distintas.
Ejemplo:
En el ejemplo 1, Posición, Punto y Círculo pueden recibir cada uno el mensaje saluda y
responder de distinta forma, los procedimientos serían:
a) posición saluda
"Hola, soy posición";
b) punto saluda
"Hola, soy punto";
c) círculo saluda
"Hola, soy círculo"
Se puede hacer algo más complejo como hacer procedimientos que mostrará el punto
o mostrará el círculo.

Sobreposición de Operadores. Es una característica de un lenguaje de programación que


permite que el mismo operador sea utilizado con tipos diferentes. Dicho de otra forma,
si se tiene una aritmética definida con ciertos operadores, sería deseable que permita
utilizar la misma notación para los nuevos tipos de operadores que se definan.

Ejemplo:
En el ejemplo 2 de números complejos se tienen los operadores aritméticos un ejemplo
de sobrecarga de operadores sería:
complejos operador + (complejo,complejo)
complejos operador *(complejo,complejo)

Con sus propias palabras defina una a una las características de la programación
Orientada a Objetos
Mapa Conceptual

POO
Posee Datos
Es principios
Consta
Consta
Abstracción

Paradigma Objetos Clases Procedimie


programación ntos

Tiempo de Vida Atributos Encapsulamiento


Nueva forma de Poseen
pensar Poseen
Estado Métodos Simple
Herencia

Comportamiento Propiedades Múltiple

Comunicación con
mensajes

Polimorfismo

Você também pode gostar