¿Que es un objeto?
Objeto es el concepto clave de la Programación Orientada a Objetos,
la idea de objeto es similar a la del mundo real, un objeto puede ser
una silla, una mesa. Tu perro es un objeto.
Los objetos tienen dos características: Un estado y un
comportamiento. Fijate que por ejemplo tu perro tiene un estado: nombre,
color, raza, altura, etc. y un comportamiento: ladrar, cavar pozo,
llorar, dormir, comer, etc.
Un auto es un objeto. También tiene un estado: Cantidad de puertas,
color, tamaño, etc. y un comportamiento: acelerar, frenar, subir cambio,
bajar cambio, girar izq., girar der., etc.
Entonces podemos definir a un objeto en POO, como un conjunto de
datos y funciones relacionadas. A las funciones de los objetos, tales
como acelerar en el caso del auto, de aquí en más las llamaremos
métodos, a los datos los llamaremos atributos.
Los objetos en programación, son modelados observando objetos del
mundo real, por ejemplo implementamos el objeto "perro" dentro de
nuestro programa definiendo los atributos y métodos del objeto perro
real.
Un ejemplo mas complicado de un objeto podría ser el siguiente:
Objeto: Cuenta bancaria
Atributos: tipo, titular, saldo.
Métodos: Depositar, Extraer.
Aquí se ve la necesidad de que el atributo "saldo" sea solo accesible
a través de los métodos "Depositar" y "Extraer" por una cuestión de
seguridad, encapsulamiento y para evitar comportamientos indeseados.
Herencia
Los sistemas orientados a objetos permiten definir clases en término
de otras clases. Por ejemplo ovejero alemán y caniche son diferentes
razas de perros. En la terminología orientada a objetos "Ovejero
Alemán" y "Caniche" son
subclases de la clase perro. De forma similar Perro es la
superclase de "Ovejero Alemán".
Cada subclase hereda los atributos de la superclase. Tanto la clase
"Ovejero Alemán" como "Caniche" tendrán los atributos nombre, color de
pelo, altura definidos en la clase Perro.
Una subclase no esta limitada únicamente a los atributos de su
superclase, también puede tener atributos propios, o redefinir algunos
definidos anteriormente en la superclase.
No se esta limitado tampoco a un solo nivel de herencia, se pueden tener todos los que se consideren necesarios.
Ejemplo:
Clase Empleado hereda de clase Persona, y esta a su vez hereda de clase Animal.
Las subclases proveen un comportamiento especializado sobre los
elementos comunes provistos por las superclases. Gracias a la herencia,
los programadores pueden rehusar código una y otra vez.
Polimorfismo
El
polimorfismo es un concepto de la programación orientada a objetos que
nos permite programar en forma general, en lugar de hacerlo en forma
específica.
En general nos sirve para programar objetos con
características comunes y que todos estos compartan la misma superclase
en una jerarquía de clases, como si todas fueran objetos de la
superclase. Esto nos simplifica la programación.
Recuerde el
ejemplo del ecosistema, en donde todos los objetos de las distintas
especies heredaban de una superclase llamada Animal, que brindaba la
información general de cualquier animal, independiente de su especie.
Sin embargo, cada especie hace un uso particular de cada uno de los
métodos u operaciones de la clase
Animal. El método
comer() no se ejecutará de la misma manera en un
León() o en un
Pavo(). Lo mismo ocurre para métodos moverse() en objetos de tipo
Tiburón() o
Gallina(),
aunque todas las especies realicen estos métodos. A la sobrescritura o
implementación específica de métodos es la clave del polimorfismo.
Para
poner en práctica se hará un ejemplo bastante sencillo. Se hará una
librería de clases que represente figuras tridimensionales y
bidimensionales, y su respectiva jerarquía de clases. Las clases deben
ser capaces de tener funcionamiento bastante básico, como obtener áreas,
volúmenes y perímetros de la figura correspondiente.
La representación de la jerarquía sería como ésta:
Encapsulamiento
Definicion de encapsulamiento
El encapsulamiento es la característica de autonomía de la OO. Esta característica permite generar componentes autónomos de software tomando una parte de funcionalidad y ocultando los detalles de la implementación al mundo exterior.
Los términos módulo, componente o bean se suelen utilizan en lugar de “componente encapsulado de software”.
Una vez encapsulada, una entidad de software se puede visualizar como una caja negra.
Un encapsulamiento eficaz permite escribir
componentes autónomos de software.
Las tres características de un encapsulamiento
eficaz son:
Abstracción.
Ocultamiento
de la implementación.
División
de la responsabilidad.
Abstracción
La abstracción es el proceso de simplificar un problema complejo.La abstracción permite resolver un problema una vez y utilizar la solución posteriormente en todo el dominio del problema.
Ejemplo
1
Imaginemos
una cola de personas ante un cajero en un banco.
Tan
pronto como el cajero está listo, la primera persona de la cola avanza a la
ventanilla.
La
gente mantiene este orden: primero en entrar, primero en salir.
Ejemplo
2
Consideremos
un establecimiento de venta rápida de hamburguesas.
Conforme
una hamburguesa llega al final de la banda transportadora, es colocada tras la
última hamburguesa por preparar.
Así, la
primera hamburguesa que se toma es también la primera que se preparó.
Ambos
dominios son un ejemplo de una cola primero en entrar, primero en salir (orden
de elementos
tipo FIFO).
Ocultamiento de la
implementación
El ocultamiento de la implementación presenta
dos beneficios:
Proteger
al objeto de los usuarios.
Mediante los Tipos Abstractos de
Datos.
Proteger
a sus usuarios del objeto.
Mediante la utilización de código
moderadamente ligado.
¿Cómo proteger a los
usuarios mediante el ocultamiento de la implementación?
El ocultamiento de la implementación conduce a
un diseño más flexible porque evita que los usuarios del objeto dependan
estrechamente de la implementación del objeto.
Así, el ocultamiento de la implementación no
sólo protege al objeto, sino también a aquellos que lo utilizan pues fomenta la
creación de código moderadamente ligado al objeto.
El código moderadamente ligado es independiente de la
implementación de otros componentes.
El código estrechamente ligado depende intensamente de la
implementación de otros componentes.
El
encapsulamiento y el ocultamiento de la implementación no son mágicos. Si se
realizan cambios en una interfaz, será necesario actualizar el código
dependiente de esa interfaz. Mediante el ocultamiento de los detalles y la
escritura de software para una interfaz, se crea código moderadamente ligado.
El código estrechamente ligado choca con el propósito del encapsulamiento:
crear objetos independientes y reutilizables.
División de la responsabilidad
Para
generar código moderadamente desligado, hay que contar con una división
apropiada de la
responsabilidad.
El
ocultamiento de la implementación y la responsabilidad van de la mano.
Un
objeto tiene la responsabilidad de saber cómo llevar a cabo su trabajo.
Si la
implementación se deja abierta a todo el mundo exterior, un usuario podría
empezar a actuar
sobre ella, duplicando en consecuencia la responsabilidad
RESUMEN
El encapsulamiento eficaz se compone de:
Abstracción
más
Ocultamiento
de la implementación más
Responsabilidad.
Si
eliminamos
La
abstracción, el rdo será código no reutilizable.
El
ocultamiento de la implementación, el rdo será
código frágil y estrechamente ligado.
La
responsabilidad, el rdo será código orientado a datos y con
una lista de procedimientos (procedural).