Unidad I

 

POO Abstraccion Encapsulamiento Herencia Polimorfismo Clases Visuales Volver

Programación Orientada a Objetos

 

Conceptos fundamentales

 

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

 

Definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.

 

Una clase es una descripción de datos y operaciones que describen el comportamiento de cierto tipo de elementos. Por lo tanto, para que pueda haber objetos, antes deben haberse definido las clases a las que pertenecerán dichos objetos. No tiene sentido un objeto sin una clase, ya que el objeto tiene los atributos de la clase a la que pertenece, y recibe mensajes correspondientes a métodos de la clase a la que pertenece.

 

Una clase se divide en una parte pública y en una parte privada. El nombre de la clase debe ser único. Antes de continuar, recordar cómo era una librería (UNIT) en Pascal. Tiene una parte donde se declaran las cabeceras de los subprogramas (ineterface) que prodrán usarse desde los ficheros que usen la librería, y otra parte donde se implementan dichos subprogramas (implementation).

 

Parte pública

 

Describe a qué operaciones responden los objetos de una clase (cómo se comportan los objetos). En esta parte de la clase se declaran las cabeceras de los métodos de la clase que podrán ser "invocados" por los objetos. Es decir, si un método se declara en la parte pública, podrá ser "invocado" por un objeto de dicha clase, de lo contrario no podrá ser "invocado" por un objeto. Es la parte "visible" de la clase, la interfaz de la clase.

 

Parte privada

 

Describe los datos de la clase y cómo las operaciones manipulan dichos datos. Esta parte de la clase es donde se oculta (encapsula) la información de la clase: datos e implementación de métodos declarados o no en la parte pública de la clase. Es una parte "no visible", cada objeto de una determinada clase tiene sus atributos (datos) y sus métodos.

 

Con un ejemplo vamos a entenderlo mejor. En primer lugar pensemos en un programa que trata de gestionar datos sobre los vehículos de transporte público de una ciudad, por ejemplo México D.F.

 

El código siguiente muestra cómo podría ser una clase CuentaBancaria, por ejemplo:

'Declaramos la clase CuentaBancaria
Class CuentaBancaria
 'La hacemos privada
 Private CuentaNumero As String
 Private CuentaBalance As Decimal
 'Y la ponemos publica para que calcule el balance
 Public Sub UpdateBalance()
 End Sub
 ReadOnly Property Balance() As Decimal
  Get
   Return CuentaBalance
  End Get
 End Property
End Class

 

Herencia

 

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 publicas 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 OOP.

 

Objeto

 

Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos) los mismos que consecuentemente reaccionan a eventos. Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase.

 

El objeto es la entidad en torno a la cual gira la POO. Un objeto es un ejemplar concreto de una clase, como por ejemplo el curso de metodología de la programación es un curso concreto dentro de todos los tipos de cursos que pueden existir. Un objeto pertenece a una clase, por lo tanto dispondrá de los atributos (datos) y operaciones (métodos) de la clase a la que pertenece.

 

Un objeto responde al comportamiento definido por las operaciones de la clase a la que pertenece. Es decir, si la clase coche dispone del atributo color y del método arrancar, un coche concreto tendrá un color, y podrá arrancar, exclusivamente.

 

Estructura de un objeto

 

Un objeto se puede ver como una "cápsula" de datos y algoritmos que trabajan sobre esos datos. Un objeto no puede acceder directamente a sus datos (atributos). Los atributos son sólo accesibles desde la implementación de los métodos de una clase. Un objeto no puede "manipular" sus propios datos, para ello están los métodos de la clase de dicho objeto: el comportamiento (métodos) de un objeto puede variar el valor (estado) de sus datos (atributos). Por ejemplo, nunca debemos hacer lo siguiente:miCoche.color := 'rojo'. Para esto definiremos métodos que actualicen el valor de los atributos de un objeto, por ejemplo: miCoche.ponerColor('rojo').

 

En la POO, un objeto no es algo "eterno", se instancian (crean) y se destruyen. Una vez que se haya instanciado un objeto puede recibir mensajes. Los objetos pueden instanciarse de forma estática o de forma dinámica (recordar estos conceptos de capítulos anteriores). Un objeto estático comienza su existencia una vez es declarado (instanciación de objetos estáticos), sin embargo, un objeto dinámico no comienza su existencia al ser declarado, sino al recibir un espacio de memoria (instanciación dinámica de objetos). Por ejemplo:

 

Los objetos "se declararán" como atributos de las clases, en las claúsulas var de los métodos o en la lista de parámetros de los métodos. El único objeto que debe ser "declarado" en el programa principal será el de la clase raíz de toda la jerarquía de clases (por cuestiones del lenguaje Pascal orientado a objetos). Los objetos estáticos existen durante la ejecución del programa. Los objetos dinámicos existen mientras no sean destruidos (liberación de la memoria del objeto), mediante la sentencia dispose.

 

Tras ser instanciado, un objeto consta de los atributos de la clase a la que pertenece, y puede recibir mensajes. Dicho objeto determinará a qué método de su clase corresponde dicho mensaje. Un objeto no podrá recibir mensajes correspondientes a métodos de una clase a la qe no pertenezca. Por ejemplo:

 

Un objeto sólo puede recibir mensajes de métodos de su clase

 

 

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, a la reacción que puede desencadenar un objeto, es decir la acción que genera.

 

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

Atributos, identidad, relaciones y métodos.

 

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.

 

Entre los lenguajes orientados a objetos se destacan los siguientes

 

ABAP

ABL Lenguaje de programación de OpenEdge de Progress Software

ActionScript

ActionScript 3

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)

Objective-C

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)

PowerBuilder

Python

Ruby

Smalltalk (Proyecto investigativo. Influenció a Java.)

Magik (SmallWorld)

Vala

Visual BASIC.NET

Visual FoxPro (en su versión 6)

Visual Basic 6.0

Visual Objects

XBase++

Lenguaje DRP

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.

 

¿Qué es una Instancia?

Bien, decíamos que una clase es como la definición de un objeto, pero no es el objeto en sí, del modo como una idea no es una cosa física (el ejemplo de la silla). Así que para sentarnos necesitaremos convertir esa idea en algo, en un objeto real; a ese objeto lo llamamos instancia.

 

En un mismo proyecto puedo tener una o más instancias de una misma clase sin problemas.

 

Cada vez que creamos una nueva instancia, ésta adquiere las propiedades, métodos y eventos de la clase a la que pertenece (es lo que permite la relación es un), sin embargo, cada instancia es independiente de las otras; esto nos da dos ventajas:

  1. Si hago algún cambio en la clase, todas las instancias de esta clase se actualizarán automáticamente; esto nos permite hacer cambios sin tener que ir a cada una de las instancias (se aplica el mismo principio de herencia, aunque a un nivel diferente).

  1. Al ser independientes de las otras instancias, puedo darles valores diferentes sin que afecten a las demás (como tener una silla negra, una roja, una más alta, etc.). Aunque comparten la misma estructura, pueden programarse individualmente, dando versatilidad y flexibilidad al código.

Ventajas de la Programación Orientada a Objeto

 

Vamos a ver las ventajas más importantes de la programación orientada a objetos:

  • Reusabilidad. Cuando hemos diseñado adecuadamente las clases, se pueden usar en distintas partes del programa y en numerosos proyectos.

  • Mantenibilidad. Debido a las sencillez para abstraer el problema, los programas orientados a objetos son más sencillos de leer y comprender, pues nos permiten ocultar detalles de implementación dejando visibles sólo aquellos detalles más relevantes.

  • Modificabilidad. La facilidad de añadir, suprimir o modificar nuevos objetos nos permite hacer modificaciones de una forma muy sencilla.

  • Fiabilidad. Al dividir el problema en partes más pequeñas podemos probarlas de manera independiente y aislar mucho más fácilmente los posibles errores que puedan surgir.

La programación orientada a objetos presenta también algunas desventajas como pueden ser:

  • Cambio en la forma de pensar de la programación tradicional a la orientada a objetos.

  • La ejecución de programas orientados a objetos es más lenta.

  • La necesidad de utilizar bibliotecas de clases obliga a su aprendizaje y entrenamiento.

 

Volver

 

 

*