Introduccion a la programacion orientada a objetos
1. PROGRAMACION ORIENTADA A OBJETOS II
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS
FABIAN DORADO CARVAJAL
SIMEON CARDENAS
ING. PEDRO ALVAREZ
INSTITUCION UNIVERSITARIA COLEGIO MAYOR DEL CAUCA
FACULTAD DE INGENIERIA
TECNOLOGIA EN DESARROLLO DE SOFTWARE
POPAYAN
2013
2. PROGRAMACION ORIENTADA A OBJETOS
La orientación a objetos es un paradigma de programación que facilita la creación de
software de calidad por sus factores que potencian el mantenimiento, la extensión y la
reutilización del software generado bajo este paradigma.
La programación orientada a objetos trata de amoldarse al modo de pensar del hombre y
no al de la máquina. Esto es posible gracias a la forma racional con la que se manejan las
abstracciones que representan las entidades del dominio del problema, y a propiedades
como la jerarquía o el encapsulamiento.
El elemento básico de este paradigma no es la función (elemento básico de la
programación estructurada), sino un ente denominado objeto. Un objeto es la
representación de un concepto para un programa, y contiene toda la información
necesaria para abstraer dicho concepto: los datos que describen su estado y las
operaciones que pueden modificar dicho estado, y determinan las capacidades del objeto.
Java incorpora el uso de la orientación a objetos como uno de los pilares básicos de su
lenguaje
TIPO DE DATO ABSTRACTO (TDA)
Con mucha frecuencia se utilizan los términos TDA y Abstracción de Datos de manera
equivalente, y esto es debido a la similitud e interdependencia de ambos. Sin embargo, es
importante definir por separado los dos conceptos.
Los Lenguajes de Programación Orientados a Objetos son lenguajes formados por
diferentes métodos o funciones y que son llamados en el orden en que el programa lo
requiere, o el usuario lo desea. La abstracción de datos consiste en ocultar las
características de un objeto y obviarlas, de manera que solamente utilizamos el nombre
del objeto en nuestro programa. Esto es similar a una situación de la vida cotidiana.
Cuando yo digo la palabra “perro”, usted no necesita que yo le diga lo que hace el perro.
Usted ya sabe la forma que tiene un perro y también sabe que los perros ladran. De
manera que yo abstraigo todas las características de todos los perros en un solo término,
al cual llamo “perro”. A esto se le llama ‘Abstracción’ y es un concepto muy útil en la
programación, ya que un usuario no necesita mencionar todas las características y
funciones de un objeto cada vez que éste se utiliza, sino que son declaradas por
separado en el programa y simplemente se utiliza el término abstracto (“perro”) para
mencionarlo.
En el ejemplo anterior, “perro” es un Tipo de Dato Abstracto y todo el proceso de definirlo,
implementarlo y mencionarlo es a lo que llamamos Abstracción de Datos.
Vamos a poner un ejemplo real de la programación. Supongamos que en algún Lenguaje
de Programación Orientado a Objetos un pequeño programa saca el área de un
rectángulo de las dimensiones que un usuario decida. Pensemos también que el usuario
probablemente quiera saber el área de varios rectángulos. Sería muy tedioso para el
programador definir la multiplicación de ‘base’ por ‘altura’ varias veces en el programa,
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS 2
3. además que limitaría al usuario a sacar un número determinado de áreas. Por ello, el
programador puede crear una función denominada ‘Área’, la cual va a ser llamada el
número de veces que sean necesitadas por el usuario y así el programador se evita
mucho trabajo, el programa resulta más rápido, más eficiente y de menor longitud. Para
lograr esto, se crea el método Área de una manera separada de la interfaz gráfica
presentada al usuario y se estipula ahí la operación a realizar, devolviendo el valor de la
multiplicación. En el método principal solamente se llama a la función Área y el programa
hace el resto.
Al hecho de guardar todas las características y habilidades de un objeto por separado se
le llama Encapsulamiento y es también un concepto importante para entender la
estructuración de datos. Es frecuente que el Encapsulamiento sea usado como un
sinónimo del Ocultación de información, aunque algunos creen que no es así.
VENTAJAS DE USO:
-Reusabilidad (mecanismos de abstracción y herencia)
-En programación convencional: uso de funciones y procedimiento
-Adecuación a entornos de bases de datos.
-Idónea para tratamiento de Interfaces de Usuario.
- Adecuada en prototipos y simulación.
-Construcción de sistemas complejos a partir de componentes.
-Modelado más fiel del mundo real.
-Estimación de reducción de 40% con respecto la programación convencional
Otras Ventajas de POO
-Mejor mantenimiento.
-Estructuras más reales de la información.
-Escalabilidad.
-Adaptabilidad.
-Más apropiada para aplicaciones dirigidas por eventos.
INCONVENIENTES DE POO
-Necesidades de estandarización: Notación de Modelado ( , j (OMG, Object Management
Group).Lenguajes de Programación.
-Coste de conversión de software legado
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS 3
4. CLASE
El elemento básico de la programación orientada a objetos en Java es la clase. Una clase
define la forma y comportamiento de un objeto. Para crear una clase sólo se necesita un
archivo fuente que contenga la palabra clave reservada class seguida de un identificador
legal y un bloque delimitado por dos llaves para el cuerpo de la clase. class MiPunto. {}
Un archivo de Java debe tener el mismo nombre que la clase que contiene, y se les suele
asignar la extensión ".java". Por ejemplo la clase MiPunto se guardaría en un fichero que
se llamase MiPunto.java. Hay que tener presente que en Java se diferencia entre
mayúsculas y minúsculas; el nombre de la clase y el de archivo fuente han de ser
exactamente iguales.
Aunque la clase MiPunto es sintácticamente correcta, es lo que se viene a llamar
una clase vacía, es decir, una clase que no hace nada. Las clases típicas de Java
incluirán variables y métodos de instancia. Los programas en Java completos constarán
por lo general de varias clases de Java en distintos archivos fuente.
Una clase es una plantilla para un objeto. Por lo tanto define la estructura de un objeto y
su interfaz funcional, en forma de métodos. Cuando se ejecuta un programa en Java, el
sistema utiliza definiciones de clase para crear instancias de las clases, que son los
objetos reales. Los términos instancia y objeto se utilizan de manera indistinta. La forma
general de una definición de clase es:
class Nombre_De_Clase {
tipo_de_variable nombre_de_atributo1;
tipo_de_variable nombre_de_atributo2;
// . . .
tipo_devuelto nombre_de_método1( lista_de_parámetros ) {
cuerpo_del_método1;
}
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS 4
5. tipo_devuelto nombre_de_método2( lista_de_parámetros ) {
cuerpo_del_método2;
}
// . . .
}
Los tipos tipo_de_variable y tipo_devuelto, han de ser tipos simples Java o nombres de
otras clases ya definidas. Tanto Nombre_De_Clase, como
los nombre_de_atributo y nombre_de_método, han de ser identificadores Java válidos.
OBJETOS
En el paradigma de programación orientada a objetos (POO, o bien OOP en inglés),
un objeto se define como la unidad que en tiempo de ejecución realiza las tareas de
un programa. También a un nivel más básico se define como la instancia de una clase.
Estos objetos interactúan unos con otros, en contraposición a la visión tradicional en la
cual un programa es una colección de subrutinas (funciones o procedimientos), o
simplemente una lista de instrucciones para el computador. Cada objeto es capaz de
recibir mensajes, procesar datos y enviar mensajes a otros objetos de manera similar a
un servicio.
En el mundo de la programación orientada a objetos (POO), un objeto es el resultado de
la instanciación de una clase. Una clase es el anteproyecto que ofrece la funcionalidad en
ella definida, pero ésta queda implementada sólo al crear una instancia de la clase, en la
forma de un objeto. Por ejemplo: dado un plano para construir sillas (una clase de
nombre clase_silla), entonces una silla concreta, en la que podemos sentarnos,
construida a partir de este plano, sería un objeto de clase_silla. Es posible crear
(construir) múltiples objetos (sillas) utilizando la definición de la clase (plano) anterior. Los
conceptos de clase y objetos son análogos a los de tipo de datos y variable; es decir,
definida una clase podemos crear objetos de esa clase, igual que disponiendo de un
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS 5
6. determinado tipo de dato (por ejemplo el tipo entero), podemos definir variables de dicho
tipo:
int a,b;
( 'int' es un tipo de dato y 'a' y 'b' son variables de tipo entero con las que podemos
operar)
Para utilizar la funcionalidad definida en una clase en particular (salvo en las clases
abstractas), primeramente es necesario crear un objeto de esa clase. De la misma
manera, para una persona que desea sentarse, las especificaciones para construir
una silla serán de poca utilidad; lo que se necesita es una silla real construida a partir
de esas especificaciones. Siguiendo con la analogía anterior, también se puede decir
que para hacer operaciones aritméticas, de nada sirve por sí solo el tipo entero (int);
para ello necesitamos variables (o constantes) con las que operar.
LOS ATRIBUTOS
Los datos se encapsulan dentro de una clase declarando variables dentro de las llaves de
apertura y cierre de la declaración de la clase, variables que se conocen como atributos.
Se declaran igual que las variables locales de un método en concreto.
Por ejemplo, este es un programa que declara una clase MiPunto, con dos atributos
enteros llamados x e y.
class MiPunto {
int x, y;
}
Los atributos se pueden declarar con dos clases de tipos: un tipo simple Java (ya
descritos), o el nombre de una clase (será una referencia a objeto, véase el punto C.a de
este mismo apartado).
Cuando se realiza una instancia de una clase (creación de un objeto) se reservará en la
memoria un espacio para un conjunto de datos como el que definen los atributos de una
clase. A este conjunto de variables se le denomina variables de instancia.
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS 6
7. METODOS
En la programación orientada a objetos, un método es una subrutina asociada
exclusivamente a una clase (llamados métodos de clase o métodos estáticos) o a
un objeto (llamados métodos de instancia). Análogamente a los procedimientos en
los lenguajes imperativos, un método consiste generalmente de una serie de sentencias
para llevar a cabo una acción, un juego de parámetros de entrada que regularán dicha
acción y o, posiblemente, un valor de salida (o valor de retorno) de algún tipo.
Algunos lenguajes de programación asumen que un método debe de mantener
el invariante del objeto al que está asociado asumiendo también que éste es válido
cuando el método es invocado. En lenguajes compilados dinámicamente, los métodos
pueden ser objetos de primera clase, y en este caso se puede compilar un método sin
asociarse a ninguna clase en particular, y luego asociar el vínculo o contrato entre el
objeto y el método en tiempo de ejecución. En cambio en lenguajes no compilados
dinámicamente o tipados estáticamente, se acude a precondiciones para regular los
parámetros del método y postcondiciones para regular su salida (en caso de tenerla). Si
alguna de las precondiciones o postcondiciones es falsa el método genera una excepción.
Si el estado del objeto no satisface la invariante de su clase al comenzar o finalizar un
método, se considera que el programa tiene un error de programación.
La diferencia entre un procedimiento (generalmente llamado función si devuelve un valor)
y un método es que éste último, al estar asociado con un objeto o clase en particular,
puede acceder y modificar los datos privados del objeto correspondiente de forma tal que
sea consistente con el comportamiento deseado para el mismo. Así, es recomendable
entender a un método no como una secuencia de instrucciones sino como la forma en
que el objeto es útil (el método para hacer su trabajo). Por lo tanto, podemos considerar al
método como el pedido a un objeto para que realice una tarea determinada o como la vía
para enviar un mensaje al objeto y que éste reaccione acorde a dicho mensaje
ENCAPSULAMIENTO
En programación orientada a objetos, se denomina encapsulamiento al ocultamiento del
estado, es decir, de los datos miembro, de un objeto de manera que sólo se puede
cambiar mediante las operaciones definidas para ese objeto.
Cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se
reduce a un agregado o rompecabezas de objetos. El aislamiento protege a los datos
asociados a un objeto contra su modificación por quien no tenga derecho a acceder a
ellos, eliminando efectos secundarios e interacciones.
De esta forma el usuario de la clase puede obviar la implementación de los métodos y
propiedades para concentrarse sólo en cómo usarlos. Por otro lado se evita que el usuario
pueda cambiar su estado de maneras imprevistas e incontroladas.
Como se puede observar de los diagramas, las variables del objeto se localizan en el
centro o núcleo del objeto. Los métodos rodean y esconden el núcleo del objeto de otros
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS 7
8. objetos en el programa. 'Al empaquetamiento de las variables de un objeto con la
protección de sus métodos se le llama encapsulamiento. Típicamente, el encapsulamiento
es utilizado para esconder detalles de la puesta en práctica no importantes de otros
objetos. Entonces, los detalles de la puesta en práctica pueden cambiar en cualquier
tiempo sin afectar otras partes del programa.
Formas de encapsular
1. Estándar (Predeterminado)
2. Abierto : Hace que el miembro de la clase pueda ser accedido desde el exterior de
la Clase y cualquier parte del programa.
3. Protegido : Solo es accesible desde la Clase y las clases que heredan (a cualquier
nivel).
4. Semi cerrado : Solo es accesible desde la clase heredada
5. Cerrado : Solo es accesible desde la Clase.
En el encapsulamiento hay analizadores que pueden ser semánticos y sintácticos.
PRINCIPIO DE OCULTAMIENTO
En programación orientada a objetos el principio de ocultación hace referencia a que
los atributos privados de un objeto no pueden ser modificados ni obtenidos a no ser que
se haga a través del paso de un mensaje (invocación a métodos, ya sean estos funciones
o procedimientos).
POLIMORFISMO
En programación orientada a objetos el polimorfismo se refiere a la posibilidad de enviar
un mensaje a un grupo de objetos cuya naturaleza puede ser heterogénea. El único
requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber
responder al mensaje que se les envía.
La apariencia del código puede ser muy diferente dependiendo del lenguaje que se utilice,
más allá de las obvias diferencias sintácticas.
Por ejemplo, en un lenguaje de programación que cuenta con un sistema de
tipos dinámico (en los que las variables pueden contener datos de cualquier tipo u objetos
de cualquier clase) como Smalltalk no se requiere que los objetos que se utilizan de modo
polimórfico sean parte de una jerarquía de clases.
En lenguajes basados en clases y con un sistema de tipos de datos fuerte
(independientemente de si la verificación se realiza en tiempo de compilación o de
ejecución), es posible que el único modo de poder utilizar objetos de manera polimórfica
sea que compartan una raíz común, es decir, una jerarquía de clases, ya que esto
proporciona la compatibilidad de tipos de datos necesaria para que sea posible utilizar
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS 8
9. una misma variable de referencia (que podrá apuntar a objetos de diversas subclases de
dicha jerarquía) para enviar el mismo mensaje (o un grupo de mensajes) al grupo de
objetos que se tratan de manera polimórfica.
En Java, es frecuente y profusamente aconsejada la utilización de interfaces (que es un
mecanismo del lenguaje que se emplea por medio de la palabra clave Interface) para
proveer la necesaria concordancia de tipos para hacer posible el polimorfismo, también
como un contrato que debe cumplir cualquier clase que implemente una cierta interfaz y
como una forma de documentación para los desarrolladores. A veces, en la literatura que
refiere específicamente a Java se hace mención a "herencia y polimorfismo de interfaces",
lo que no concuerda con los conceptos de la programación orientada a objetos porque
una clase que implementa una interfaz sólo obtiene su tipo de datos y la obligación de
implementar sus métodos, no obtiene comportamiento ni de atributos. Esto muchas veces
resulta paradójico porque en Java frecuentemente se utiliza la mal llamada "herencia de
interfaces" para dotar a una clase con un tipo adicional (o varios) para que su uso en
combinación con la agregación (colaboración o composición) permita evitar la necesidad
de la herencia múltiple y favorezca una utilización más amplia del polimorfismo.
No obstante, el uso de una jerarquía de clases como paso previo, es muy habitual incluso
en aquellos lenguajes en los que es posible prescindir de tal jerarquía, ya que, desde una
perspectiva conceptual, se puede decir que al pertenecer los "objetos polimórficos" a
subclases de una misma jerarquía, se asegura la equivalencia semántica de los mensajes
que se invocarán de modo polimórfico. Por esto, en programación orientada a objetos a
veces se denomina al polimorfismo como "polimorfismo de subclase (o de subtipo)".
En resumen, en la programación orientada a objetos, la esencia del polimorfismo no atañe
a la clase o prototipo de la que provienen los objetos. Aun así, en los lenguajes basados
en clases, es habitual (y en algunos tal vez sea el único modo) que dichos objetos
pertenezcan a subclases pertenecientes a una misma jerarquía. Entonces, el polimorfismo
debe verse como una forma flexible de usar un grupo de objetos (como si fueran sólo
uno). Podría decirse que el polimorfismo en esencia refiere al comportamiento de los
objetos, no a su pertenencia a una jerarquía de clases (o a sus tipos de datos).
Lo anterior se hace aún más evidente en lenguajes de programación orientada a objetos
basados en prototipos, como Self, en los que las clases no existen.
POLIMORFISMO DESDE UNA INTERFAZ
Aunque el polimorfismo es el mismo se aplique donde se aplique, el modo en que se
aplica desde una interfaz puede resultar un poco más oscuro y difícil de entender. Se
expone un sencillo ejemplo (en VB-NET) comentado para entender como funciona
aplicado desde una interfaz, primero se escribe el código y luego se comenta el
funcionamiento. Nota: para no enturbiar el código en exceso, todo lo que no se declara
privado se sobreentiende público.
CONCEPTUALIZACION PROGRAMACION ORIENTADA A OBJETOS 9