La Programación Orientada a Objetos (POO)
(1)
Es un paradigma de
programación que emplea objetos y sus interacciones para diseñar aplicaciones y
programas de computadora. Está basado en varias técnicas, incluyendo herencia,
modularidad, polimorfismo, y encapsulamiento.
El término de Programación
Orientada a Objetos se
refiere más una forma de diseño y una metodología de desarrollo de software que un lenguaje
de programación, ya
que en realidad se puede aplicar el Diseño Orientado a Objetos (En inglés abreviado OOD, Object Oriented Design),
a cualquier tipo de lenguaje de programación.
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.
(2)
El (OOP) no es
nuevo, lenguajes clásicos como SmallTalk se basan en ella. Dado que la OOP. se
basa en la idea natural de la existencia de un mundo lleno de objetos y que la
resolución del problema se realiza en términos de objetos, un lenguaje se dice
que está basado en objetos si soporta objetos como una característica fundamental
del mismo.
(3)
La programación
orientada a objetos es una “filosofía”, un modelo de programación, con su
teoría y su metodología. Un lenguaje orientado a objetos es un lenguaje de
programación que permite el diseño de aplicaciones orientadas a objetos.
La programación
orientada a objetos es otra forma de descomponer problemas. Este nuevo método
de descomposición es la descomposición en objetos; vamos a fijarnos no en lo
que hay que hacer en el problema, sino en cuál es el escenario real del mismo,
y vamos a intentar simular ese escenario en nuestro programa.
Los lenguajes
orientados a objetos, como es el caso de C++ y Java, el elemento básico no es
la función (programación tradicionales no orientados ), sino un ente denominado
precisamente objeto. Un objeto es la representación en un programa de un
concepto, y contiene toda la información necesaria para abstraerlo: datos que
describen sus atributos y operaciones que pueden realizarse sobre los mismos .
(4)
La programación
orientada a objeto (OOP) es un enfoque al desarrollo de software en la cual la
estructura del software se basa en la interacción de objetos para lograr
realizar la(s) tarea(s) requeridas. La interacción se realiza mediante el envío
y recepción de mensajes entre objetos. Como respuesta a los mensajes, un objeto
puede ejecutar una acción o método.
Historia.
El concepto de
programación orientada a objeto comienza a concretizare a mediados de la década
de los 60 con el lenguaje de programación llamado Simula y su futura evolución
en los 70 llamada Smalltalk.
Características
de la OOP
No
existe un consenso aceptado por todo el mundo respecto a cuáles son las
características que definen la POO, pero al menos todos coinciden en las
siguientes cincos:
1.
Abstracción.
2.
Encapsulación.
3.
Polimorfismo.
4.
Herencia.
5.
Agregación.
Objeto.
Es una
estructura que incorpora datos y procedimientos para trabajar con dichos datos.
Para actualizar o consultar los datos en el objeto, esto debe de realizarse
mediante el mismo objeto.
Cabe
aclarar que cada objeto tiene una identidad única.
Abstracción.
En
programación, el término se refiere al énfasis en el "¿qué hace?" más
que en el "¿cómo lo hace?" (característica de caja negra). El común
denominador en la evolución de los
lenguajes de programación, desde los clásicos o imperativos hasta los
orientados a objetos, ha sido el nivel de abstracción del que cada uno de ellos
hace uso.
Los lenguajes
de programación son las herramientas mediante las cuales los
diseñadores de lenguajes pueden implementar los modelos abstractos. La
abstracción ofrecida por los lenguajes de programación se puede dividir en dos
categorías: abstracción de datos (pertenecientes a los datos) y abstracción
de control (perteneciente a las estructuras de control).
Pero ¿qué es
realmente la abstracción? Podemos concluir que es la habilidad de dividir o
separa elementos de un todo complejo para así poder verlo de forma simple
(Divides y vencerás).
La
abstracción modela un problema real construyendo una representación que
puede ser procesado computacionalmente.
El
modelo define una vista abstracta del problema. Esto implica que el modelo solo
se enfoca en la materia relativa al problema.
Cómo se piensa en
objetos
Pensar en términos de objetos es parecido a cómo lo haríamos en
la vida real. Por ejemplo vamos a pensar en un carro para tratar de modelarlo
en un esquema de POO. Podemos decir que
el carro es el elemento principal que tiene una serie de características, como
podrían ser el modelo, cantidad de
puertas, o la marca. Además tiene una
serie de funcionalidades asociadas, como: ponerse en marcha, parar o estacionar.
En un esquema POO el carro sería el objeto, las propiedades
serían las características como el modelo, la cantidad de puertas y los métodos
serían las funcionalidades asociadas como ponerse en marcha o parar.
La programación orientada a objetos, intenta simular (modelar) el
mundo real a través del significado de objetos que contiene características y
funciones. Los lenguajes orientados a objetos se clasifican como lenguajes de
quinta generación.
El
modelo debe definir los objetos de software, identificados con sus atributos
y respectivas operaciones.
El lenguaje de modelado de
objetos es un conjunto estandarizado de símbolos y de modos de disponerlos
para modelar (parte de) un diseño de software orientado a
objetos
Lenguaje Unificado de Modelado (LUM o UML,
por sus siglas en inglés, Unified Modeling Language) es el lenguaje de modelado de
sistemas de software
más conocido y utilizado en la actualidad; está respaldado por el OMG (Object Management Group). Es un
lenguaje gráfico para visualizar, especificar, construir y documentar un
sistema. UML ofrece un estándar para describir un "plano" del sistema
(modelo), incluyendo aspectos conceptuales tales como procesos de negocio, funciones
del sistema, y aspectos concretos como expresiones de lenguajes de
programación, esquemas de bases de datos y compuestos reciclados.
Es importante remarcar que UML es un "lenguaje de modelado" para especificar o para describir métodos o procesos. Se utiliza para definir un sistema, para detallar los artefactos en el sistema y para documentar y construir. En otras palabras, es el lenguaje en el que está descrito el modelo.
Encapsulado (conocida como ocultamiento).
(1)
Proceso
mediante el cual se garantiza no acceder directamente a los datos. Si es
requerido accesar a los datos entonces se debe de interactuar con el objeto
responsable por los datos.
Si el
objeto permite accesar los datos para que estos puedan ser : consultado,
modificados, el mismo debe de disponer de los mecanismos ( métodos ) para
realizar dichas operaciones.
El encapsulado
de datos permite hace que el sistema sea mas seguro y confiable.
(2)
Se encarga de
mantener ocultos los datos y procesos internos que necesita para hacer lo que
se requiere, dándole al programador acceso sólo a lo
necesario. Esto nos da dos
ventajas iniciales:
1. Controlar
internamente lo que el usuario hace, evitando fallas por una intervención indeseada
(quieres que tú mejor amigo, que no tiene ni idea de mecánica, abra el motor de
tu carro y empiece a jugar al mecánico para reparar tu carro ?).
2. La
segunda ventaja es que, al hacer que la mayor parte del código esté oculto,
puedes hacer cambios y/o mejoras sin que eso afecte el modo como los usuarios
van a utilizar tu código. Sólo tienes que mantener igual la forma de acceder a
él.
Polimorfismo.
(1)
Es la
habilidad de dos diferentes objetos a responder al mismo mensaje de la forma
definida por cada uno de estos.
Implementación
de varios métodos con el mismo nombre ( sobrecarga / overloading)
(2)
Capacidad que
tienen los objetos de una clase de responder al mismo mensaje o evento en
función de los parámetros utilizados durante su invocación ( sobrecarga /
overloading). Un objeto polimórfico es una entidad que puede contener valores
de diferentes tipos durante la ejecución del programa.
Dicho de otra
forma, el polimorfismo consiste en conseguir que un objeto de una clase se
comporte como un objeto de cualquiera de sus subclases, dependiendo de la forma
de llamar a los métodos de dicha clase o subclases.
Herencia.
La mayoría de
los objetos son clasificados acorde a su jerarquía. Ejemplo,
Podemos
clasificar todas las figuras con características con sus características
comunes como: área,
Agregación (tiene-un).
(1)
Composición de
un objeto por otros. Es una relación más débil que la que existe entre el
atributo y el objeto al cual pertenece, y más fuerte que una asociación.
(2)
Es cuando un
objeto consiste de una composición de otros objetos que trabajan en conjunto.
Cuando se escribe un programa en un lenguaje orientado a objetos, definimos una plantilla o clase que describe las características y el comportamiento de un conjunto de objetos similares. La clase automóvil describe las características comunes de todos los automóviles: sus atributos y su comportamiento. Los atributos o propiedades se refieren a la marca o fabricante, el color, las dimensiones, si tienen dos, tres, cuatro o más puertas, la potencia, si utiliza como combustible la gasolina o gasoil, etc. El comportamiento se refiere a la posibilidad de desplazarse por una carretera, frenar, acelerar, cambiar de marcha, girar, etc.
Una clase es por tanto una plantilla implementada en software que describe un conjunto de objetos con atributos y comportamiento similares.
Una instancia u objeto de una clase es una representación concreta y específica de una clase y que reside en la memoria del ordenador.
Atributos
Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.
Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.
Los atributos serán característica, cualidad, propiedad, particularidad, peculiaridad,
singularidad, rasgo, marca, carácter, idiosincrasia, naturaleza o condición del
objeto;
Estado.
Esta compuesto de datos o informaciones; serán uno o varios atributos a los que se habrán asignado unos valores concretos (datos).
Comportamiento
El comportamiento de los objetos de una clase se implementa mediante funciones miembro o métodos. Un método es un conjunto de instrucciones que realizan una determinada tarea y son similares a las funciones de los lenguajes estructurados.
Del mismo modo que hay variables de instancia y de clase, también hay métodos de instancia y de clase. En el primer caso, un objeto llama a un método para realizar una determinada tarea, en el segundo, el método se llama desde la propia clase.
Operaciones que se pueden realizar sobre
un objeto: aunque existe gran cantidad de operaciones que se
pueden realizar sobre un objeto, generalmente se dividen en tres grandes
grupos:
Operaciones que manipulan los datos de alguna forma específica ( añadir, borrar, cambiar formato, …);
Operaciones que realizan un cálculo o proceso;
Operaciones que comprueban (monitorizan) un objeto frente a la ocurrencia de algún suceso de control;
Objeto de software; Dominio del objeto real, proceso de abstracción,
dominio de la aplicación.;
OJO-> Identificar objetos a su alrededor y
especificar los atributos más relevantes conjuntamente con su comportamiento.
Clase:
¿Qué es una clase?
Es la generalización de un tipo específico de objetos, pero cada objeto
construido a partir de dicha clase tendrá sus propios datos.
Las
propiedades y métodos de un objeto en OOP son definidas mediante una clase. Una
clase es un modelo que define los atributos y comportamiento de los objetos que
son creado como instancias de a clase.
Representación
de una clase en UML
Ejemplo
Cuenta Por Cobrar
|
Cliente
BalanceDeudor
BalanceAcreedor
|
+montoPagar()
…
|
Para encontrar objetos y clases
Para encontrar clases se inicia por el
proceso de abstracción definido más arriba. Este inicia con descartar los
detalles que no aporta a lo que debe de hacer el objeto (se debe de prestar atención
a los elementos que se quieren almacenar).
Ejemplo.
Escenario para facturar productos a
una persona.
Conjunto de atributos
|
Atributos de interés
|
Cliente
Código
del producto
Cantidad de mercancía
Sexo
del cliente
Fecha
vencimiento del producto
Estado
civil del cliente
Color
del cliente
Precio
del producto
Estatura
del cliente
Edad
de la cajera
Propaganda
Personas
que lo promueven
Fecha
vencimiento
|
|
Operaciones.
….. ( Discusión en el curso )
Según
coad/yourdon, los objetos o sus clases pueden ser:
Cosas
o eventos a recordar: Cosas que el sistema
debe recordar (fecha y hora de acceso de una persona a un edificio, operación de compra con una
tarjeta de crédito, etc.)
Estructuras: Cuando del enunciado se
deduce fácilmente una relación de agregación o generalización entre dos o más
conceptos, posiblemente estamos ante dos o más clases candidatas.
Otros sistemas: ¿Con qué otros sistemas interactúa el sistema en desarrollo? Muchas veces
dichos sistemas necesitan interacción desde nuestro sistema, y serán
considerados clases.
Dispositivos: Dispositivos que
nuestro sistema necesita, siempre que estos sean externos al ordenador que
albergará a nuestro sistema (sensores, brazo mecánico, barrera automática,
etc.).
Roles: Administrador, alumno,
profesor, etc. son diferentes roles que una persona puede desempeñar cuando
inicia una sesión en el campus virtual de la universidad. Aunque una misma
persona física que conozca tres combinaciones correctas usuario - clave puede conectarse
de tres formas diferentes (diferente interfaz, etc.), no hay una clase persona,
sino una por cada rol o papel que puede desempeñar una persona según el tipo de
sesión que inicie.
Unidades organizacionales: Sucursal, sede, departamento, etc. siempre que haya que guardar
información específica al respecto. Es importante saber que utilizar este
criterio por sistema (por ejemplo, siempre pensar en los departamentos de una
empresa como clases) provoca errores en la mayoría de los casos.
Lugares, etc.: laboratorios,
aulas, oficinas, etc. siempre, como antes se ha dicho, que haya que guardar
información específica al respecto.
Regla de
oro:
“Convertir
en clase candidata todo aquel concepto del que haya que almacenar
Información
en el sistema, bien a corto o a largo plazo.”
Después, en un
segundo paso, se seleccionan aquellas clases que sean aplicables al dominio de
nuestro problema. Para ello, una vez que hayamos seleccionado las clases candidatas,
debemos escoger las que sean válidas según los siguientes criterios de
filtrado:
Necesidad de
recordar: Las clases deben tener información asociada. Una clase sin atributos
puede existir, pero es extraño, así que se impone una reflexión al respecto.
Necesidad de
comportamiento: Las clases deben tener operaciones. Una clase sin comportamiento
también puede existir, pero no es común, así que se impone una reflexión al
respecto.
Múltiples
atributos: Las clases suelen tener más de un atributo. Las clases que sólo cuentan
con un atributo son sospechosas de no ser clases, sino atributos de otras.
Más de una
Objeto por Clase: Generalmente identificamos clases porque existe más de un
objeto de la misma. Es posible que una clase que sólo tiene un objeto sea válida,
pero no es normal. Sospechar.
Atributos y
Servicios siempre aplicables: Todos los objetos de una clase deben tener los
mismos atributos y operaciones. Si identificamos objetos de la misma clase con
atributos y/o métodos diferentes, pueden ser que en realidad exista más de una
clase, las cuales posteriormente relacionaremos mediante generalización.
Luego de encontrados los objetos y sus clases será preciso encontrar los atributos y las operaciones
que actúan sobre ellos;
Para
encontrar las operaciones se realiza un nuevo análisis gramatical de la descripción del problema buscando y aislando los verbos del texto.
Las clases estarán definidas por
los objetos
identificados con sus atributos y comportamiento
comunes. El conjunto de todas las clases es un modelo OO del sistema
en desarrollo.
Ejemplo
de clases y atributos.
Clase
|
Atributos
|
Operaciones
|
Persona
|
Cedula
Nombre
Apellido
Fecha
Nacimiento
|
optenerEdad()
asignarNombre()
opteberNombre()
…
|
Cuenta
Contable
|
Código
Descripción
Origen
Balance
|
asignarCodigo()
asignarDescripción
calcularBalance()
|
Persona
|
-Cedula
-Nombre
-Apellido
-FechaNacimiento
|
+optenerEdad()
+asignarNombre()
+optenerNombre()
…
|
El
proceso de para encontrar objetos y sus clases inicia con el problema de
estudio en el cual se debe de prestar atención
a :
Los
nombre propios,
Los
nombres comunes,
Verbos
Adjetivos.
Ejemplo
Elemento
gramatical
|
Elemento del
modelo OO
|
Ejemplo
|
Nombre
propios
|
Objeto (
Instancia )
|
Pedro, juan
|
Nombre común
|
Clase
|
Persona
|
Verbo
|
Acción
|
Calcular
Edad
|
Adjetivos
|
Atributos
|
6 pies de
estatura
|
Ejemplo
completo
El señor Juan
Alberto encargado del departamento de contabilidad de la tienda
ABC tiene que realizar los asientos de diario por las ventas realizadas en la
tienda, dichas ventas ascienden a un total de 15,000.00.
1) Seleccionar
los elementos gramaticales.
2) Realizar una
lista de los elementos gramaticales encontrados.
3) Descartar los
elementos gramaticales que no interesan
( abstracción ),
4) Mapear (relacionar)
los elementos gramaticales con los del modelo.
(Método:
Análisis del lenguaje natural)
Elementos
encontrados
|
Elemento del
modelo OO
|
|
Instancia
|
Encargado
Departamento de Contabilidad
|
Clase
|
|
Clase
|
|
Instancia
|
|
Acción
|
|
Acción
|
|
Clase
|
Tienda
|
Clase
|
Ventas
|
Acción
|
Total
|
Atributo
|
Realizar
asiento
|
Acción
|
Como
asignación
1) Para cada una
de las clases identificadas crear tarjeta CRC.
Las tarjetas
CRC (clase, responsabilidad y colaboración) son una metodología para el
diseño de software orientado por objetos creada por Kent Beck y Ward
Cunningham.
Las tarjas CRC son un método empleado para detectar, comprobar y actualizar las
responsabilidades de las clases y sus colaboraciones con otras clases en un
nivel conceptual.
Formato tarjeta CRC
Nombre de la clase
|
|
Responsabilidades
|
Clases colaboradoras
|
2) Escribir cada
clase en formato
NombreClase(
Atributo1, Atributo2 …; Accion1, Accion2, …)
3) Realizar
representación UML de cada una de las clases.
Responsabilidades
de una clase:
definen el comportamiento que debe tener una clase. Esto se logra mediante la
definición de los atributos y de los métodos que definirán el comportamiento de
los objetos (instancias).
Dentro de las responsabilidades de una
clase, lo primero es encapsular los atributos y las funciones miembros que se
requieran así como su nivel de visibilidad (privado, protegido, público).
.