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.

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:

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:
-
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).
-
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.