| Programación Orientada a Objetos (OOP, Object Oriented Programming) |
Entradas desde el 20/10/2003 :
Introducción
El término de Programación Orientada a Objetos indica 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.
El desarrollo de la OOP empieza a destacar durante la década de lo 80 tomando en cuenta la programación
estructurada, a la que engloba y dotando al programador de nuevos elementos para el análisis y desarrollo
de software.

El propósito de este trabajo es explicar el diseño orientado a objeto y no una explicación
de su programación, puesto que no nos alcanzaría toda la currícula para hacerlo.
Básicamente la OOP permite a los programadores escribir software, de forma que esté organizado en
la misma manera que el problema que trata de modelizar. Los lenguajes de programación convencionales son
poco más que una lista de acciones a realizar sobre un conjunto de datos en una determinada secuencia. Si
en algún punto del programa modificamos la estructura de los datos o la acción realizada sobre ellos,
el programa cambia.
La OOP aporta un enfoque nuevo, convirtiendo la estructura de datos en el centro sobre el que pivotan las operaciones.
De esta forma, cualquier modificación de la estructura de datos tiene efecto inmediato sobre las acciones
a realizar sobre ella, siendo esta una de la diferencias radicales respecto a la programación estructurada.
Para quienes no están familiarizados con la programación estructurada diré que una de las
bases de esta escuela de programación parte del diseño arriba - abajo. En esta forma de diseño
se descomponen los requerimientos del programa paso a paso, hasta llegar a un nivel que permite expresarlos mediante
procedimientos y funciones. La OOP estructura los datos en objetos que pueden almacenar, manipular y combinar información.
En resumen, la programación estructurada presta atención al conjunto de acciones que manipulan el
flujo de datos (desde la situación inicial a la final), mientras que la programación orientada a
objetos presta atención a la interrelación que existe entre los datos y las acciones a realizar con
ellos.
Muchos habrán oído comentarios sobre la incidencia de la OOP sobre la programación convencional.
Se ha llegado a decir que el cambio introducido por la OOP es similar al producido por la aparición del
ensamblador sobre el código de máquina.
La OOP proporciona las siguientes ventajas sobre otros lenguajes de programación
Uniformidad. Ya que la representación de los objetos lleva implica tanto el análisis como
el diseño y la codificación de los mismos.
Comprensión. Tanto los datos que componen los objetos, como los procedimientos que los manipulan,
están agrupados en clases, que se corresponden con las estructuras de información que el programa
trata.
Flexibilidad. Al tener relacionados los procedimientos que manipulan los datos con los datos a tratar, cualquier
cambio que se realice sobre ellos quedará reflejado automáticamente en cualquier lugar donde estos
datos aparezcan.
Estabilidad. Dado que permite un tratamiento diferenciado de aquellos objetos que permanecen constantes
en el tiempo sobre aquellos que cambian con frecuencia permite aislar las partes del programa que permanecen inalterables
en el tiempo.
Reusabilidad. La noción de objeto permite que programas que traten las mismas estructuras de información
reutilicen las definiciones de objetos empleadas en otros programas e incluso los procedimientos que los manipulan.
De esta forma, el desarrollo de un programa puede llegar a ser una simple combinación de objetos ya definidos
donde estos están relacionados de una manera particular.
Uno de los puntos clave a remarcar en esta introducción es que la programación orientada a objetos
no sustituye a ninguna metodología ni lenguaje de programación anterior. Todos los programas que
se realizan según OOD se pueden realizar igualmente mediante programación estructurada. Su uso en
la actualidad se justifica porque el desarrollo de todas las nuevas herramientas basadas en un interface de usuario
gráfico como Windows, OS/2, x-Windows, etc. Es mucho más sencillo.
OBJETOS
Características de los Objetos
Identidad del Objeto
La identidad expresa que aunque dos objetos sean exactamente iguales en sus atributos, son distintos entre sí.
De esta forma incluso una serie de Objetos coches, recién fabricados son distintos los unos de los otros.
La afirmación anterior, aunque parece obvia, tiene importancia cuando descendemos al nivel de programación.
En este ámbito cada uno de los objetos tiene un controlador pro el cual se identifica. Este puede ser una
variable, una estructura de datos, una cadena de caracteres, etc. El controlador será distinto para cada
uno de los objeto, aunque las referencias a éstos sean uniformes e independientes del contenido, permitiendo
crear agrupaciones de objetos con el mismo tratamiento.
Clasificación
Con la clasificación comienza la verdadera programación orientada a objetos. Ellos nos obliga a una
abstracción del concepto de objeto denominada clase.
| Las clases permiten la agrupación de objetos que comparten las mismas propiedades
y comportamiento. Si bien clase y objeto suelen usarse como sinónimos, no lo son. El esfuerzo del programador ante una aplicación orientada a objetos se centra en la identificación de las clases, sus atributos y operaciones asociadas |
| Los lenguajes OOP incorporan la posibilidad de encapsular también las estructuras de datos que sirven como base a las funciones. Aportan por tanto un nivel superior en cuanto a protección de información. |

Mantenibilidad
Cualidad que indica que un programa o sistema debe ser fácilmente modificable. Es decir que los cambios
en las condiciones externas (como la definición de una nueva variable) implicarán modificaciones
pequeñas en el programa / sistema. El concepto de mantenibilidad implica que un programa, al igual que un
ser vivo debe ser capaz de adaptarse a un medio ambiente siempre cambiante.
Reusabilidad
Cualidad que nos indica que partes del programa ( en este caso objetos) pueden ser reutilizados en la confección
de otros programas. Ello implica que los objetos definidos en un programa pueden ser extraídos del mismo
e implantados en otro sin tener que realizar modificaciones importantes en el código del objeto. El objeto
final es que el programador construya una librería de objetos que le permita realizar programas basándose
en la técnica de cortar y pegar. Esta extrae (corta) código de otras aplicaciones ya realizadas y
las implementa (pega) en la aplicación a realizar donde, tras algunos retoques, la nueva aplicación
estará lista para funcionar. Como podrá observar el concepto de reusabilidad, permite reducir el
tiempo de realización , ganando en claridad, mantenibilidad y productividad.
| La encapsulación de datos se muestra como una herramienta poderosa que nos permite ganar en tiempo de desarrollo y claridad, con el único coste adicional de definir con precisión las entradas y salida de nuestras operaciones. |
| Ya está habituado al operador <<suma>> que está presente en todos los lenguajes de programación.
Sin embargo, los operadores <<suma de fracciones>> y <<suma de números complejos>>
no existen en casi ningún lenguaje de programación. Los lenguajes OOP permiten definir un operador <<suma>> tal que reconozca que tipo de objeto se le está aplicando, a través de operaciones de objetos. Previamente deberá definir la fracción y el número complejo como una clase y la operación suma como una operación de una clase. Definiendo adecuadamente las operaciones suma de fracciones y suma de números imaginarios, el operador suma devolverá, en el caso que los operandos sean fracciones, una fracción y , en el caso de los números imaginarios, otros número imaginario. Es posible extender el concepto e incluso definir operaciones como suma de bases de datos |

| El operador suma de base de datos. Aunque a primera vista la expresión C= A+B, siendo A y B bases de datos,
nos pudiera parecer una extraordinaria simplificación, nos conduce a la pregunta: ¿Qué es
la suma de una base d datos? Consideremos varias posibilidades: Introducción de registros: Lo que exige que A y B tengan la misma estructura. Unión de campos: Aquellos campos que aparezcan en B pero no en A serán añadidos a C ¿Alguna de estas dos opciones es verdaderamente una suma? Es decir ¿Cumple las propiedades conmutativa, asociativa, de elemento neutro, etc.? ¿Qué ocurre si sumo dos bases de datos con estructuras distintas? Como puede observar, la definición de un operador sobre un tipo complejo de datos, intentando utilizar identificadores de operadores de datos simples, puede tener resultados impredecibles. |
Una de las ventajas más importantes, sin entrar en la redefinición de operadores es permitir la
realización de las clases que definen un programa de forma totalmente independiente al programa donde se
utilizan. Gracias a la encapsulación y el polimorfismo, aunque se utilicen los mismos nombre con las operaciones
en dos clases distintas, el programa reconoce a que clase se aplica durante la ejecución.
Como se podrá observar el polimorfismo y la encapsulación de datos están íntimamente
ligados y nos permiten un mayor grado de mantenibilidad y reusabilidad que los lenguajes tradicionales Esta ese
precisamente una de las causas de la revolución que ha supuesto la introducción de los lenguajes
orientados a objetos dentro de la programación.
Herencia
La herencia es la última de las propiedades relativas a la OOP, Consiste en la propagación de los
atributos y las operaciones a través de distintas sub-clases definidas a partir de una clase común.
Introduce, por tanto, una posibilidad de refinamiento sucesivo del concepto de clase. Nos permite definir una clase
principal y , a través de sucesivas aproximaciones, cualquier característica de los objetos. A partir
de ahora definiremos como sub-clases todas aquellas clases obtenidas mediante refinamiento de una (o varias) clases
principales.
| La herencia nos permite crear estructuras jerárquicas de clases donde es posible la creación de sub-clases que incluyan nuevas propiedades y atributos. Estas sub-clases admiten la definición de nuevos atributos, así como crear, modificar o inhabilitar propiedades. |

Además, es posible que una sub-clase herede atributos y propiedades de más de una clase. Este proceso
se denomina herencia múltiple y lo veremos con más detalle en capítulos posteriores.
La herencia es, sin duda alguna, una de las propiedades más importantes de la OOP, ya que permite, a través
de la definición de una clase básica, ir añadiendo propiedades a medida que sean necesarias
y, además, en el sub-conjunto de objetos que sea preciso.
La herencia permite que los objetos pueden compartir datos y comportamientos a través de las diferentes
sub-clases, sin incurrir en redundancia. Más importante que el ahorro de código, es la claridad que
aporta al identificar que las distintas operaciones sobre los objetos son en realidad una misma cosa.
Conclusión.
Identidad, clasificación, polimorfismo y herencia caracterizan a los lenguajes orientados a objetos. Cada
uno de estos conceptos puede utilizarse aisladamente, incluso aparecen en otras metodologías de programación,
pero juntos se complementan en una relación sinérgica. Los beneficios de la programación orientada
a objetos son más que los que pueden verse a simple vista. El énfasis en las propiedades esenciales
de un objeto, fuerza al desarrollador a pensar cuidadosamente que es un objeto y que es lo que hace con el resultado
de que el sistema es normalmente más preciso, general y robusto que si pusiéramos el énfasis
en los procedimientos y los datos por separado

Construcción de clases
Tal como hemos definido con anterioridad, una clase de objeto describe a un grupo de objetos con similares:
· Propiedades (atributos)
· Comportamientos (operaciones)
· Relaciones con otros objetos
La abreviatura clase es utilizada en lugar de clase de objetos. Los objetos difieren en los valores asociados a
sus atributos definidos dentro de la clase. Cada objeto <<conoce>> cuál es su clase. La mayoría
de los lenguajes orientados a objetos pueden determinar a que clase pertenece un objeto durante la ejecución
del programa.
A continuación expondremos una serie de pasos para definir una clase.
Identificar los objetos.
Para ello examine la aplicación e identifique las distintas estructuras de datos, algunos tips a tener en
cuenta son los siguientes:
· El nombre de la aplicación a veces nos da la del nombre del objeto principal
· Los objetos software pueden imitar el mundo real, modelizando las propiedades de los objetos a través
de variables Cualquier propiedad de un objeto puede ser identificada dentro del objeto correspondiente a través
de variables.
· Los objetos no se han de corresponder siempre con objetos físicos, sino que también pueden
ser entidades que se utilizan dentro de la construcción del programa.
· Piense en el objeto en <<primera persona>>. Este truco nos puede identificar claramente los
atributos y sus operaciones asociadas: <<Soy un cuadrado y me muevo, giro, agrando y reduzco. Las partes
que me componen son los puntos de mis vértices>>.
· Una clase es un tipo de dato que puede ser usado para declarar objetos, de la misma forma que una estructura
es un tipo definido por el usuario que puede utilizarse para declarar variables.
Definir las operaciones
Defina las operaciones a partir de los objetos, examinando las distintas operaciones asociadas a un conjunto de
datos. Los atributos del objeto se deben definir de tal manera que éstos satisfagan todos los requerimientos
de cada una de las operaciones.
A estas operaciones añada dos más: Crear y Destruir. Estas operaciones nos servirán para inicializar
y borrar el objeto dentro de la aplicación.
A partir de la definición de las propiedades, un objeto siempre debe ser capaz de responder a estas tres
preguntas: ¿Qué soy?, ¿Qué hago? ¿Qué dejo ver al resto del mundo?
Algunas de las operaciones sólo se aplicarán a determinados objetos pertenecientes a las clases.
Hemos visto que a través de la herencia podemos <<especializar>> un sub conjunto de objetos
creando una sub-clase.
Únicamente aquellas operaciones que sean comunes a todos los objetos de la clase deben incluirse dentro
de las operaciones de la clase. El resto, que corresponden a las operaciones de sub-Grupos de objetos, se deben
definir dentro de la especializaciones de la clase.
Definir los atributos de los objetos
Una vez identificados los objetos, defina los atributos de la clase. Un atributo es un valor almacenado en los
objetos de la clase.
Aplicaciones orientadas a objetos
A lo largo de la historia de la programación, los lenguajes y las metodologías han pasado de una
relativa simplicidad a una complejidad creciente. Los lenguajes de programación orientados a objetos pretenden
aportar simplicidad a la tarea de programación de grandes aplicaciones.
Cuando se crearon las primeras computadoras todavía no existían los lenguajes de programación,
tal como ahora los entendemos. El lenguaje ensamblador puede considerarse como el primer lenguaje de programación
propiamente dicho. Permitía al usuario un diálogo más fluido con la máquina a través
de instrucciones que tenían relación directa con el conjunto de operaciones que la máquina
podía realizar.
A partir de este momento empezó la evolución de los lenguajes de programación. _cada uno tenía
su entorno definido y aunque en realidad todos los lenguajes son polivalentes (en teoría, con cualquiera
de ellos se puede desarrollar cualquier programa de gestión o científico). Pronto apareció
la especialización funcional. Así, COBOL (Common Business Orientated Language) se introdujo como
lenguaje mainframe para el diseño de aplicaciones de gestión.; FORTRAN (Formula Translator) para
el diseño de aplicaciones científicas; APL (A Programming Language) para el cálculo matemático,
etc.
A medida que el software tomaba importancia, aparecieron los primeros problemas relacionados con la programación.
Al tiempo que aumenta el volumen de un programa, disminuye el control del mismo por parte del programador y la
capacidad de este de dar mantenimiento.
En un intento de solucionar estos problemas aparecen las metodologías de programación. Una metodología
es un conjunto de reglas destinadas a simplificar las tareas de diseño, estimación de costes, desarrollo
y mantenimiento de un sistema informático. A menudo se ven acompañadas con unas herramientas (CASE:
Computer Aided Software Engeneering) que permiten la elaboración estructurada y documentada de los sistemas
informáticos.
DISEÑO DE APLICACIONES Y ELECCIÓN DE ENTORNO.
Un entorno de programación implica tanto el lenguaje de programación como al empleo de una determinada
metodología.
Los lenguajes de programación no se producen por generación espontánea y se ven influidos
en gran manera por la forma en la que los profesionales piensan que se debe programar. De esta manera se crea un
conjunto de reglas para simplificar la tarea de programación. Generalizadas y codificadas, se convierten
en <<principios>> de los que surgen los lenguajes de programación en un afán por darles
soporte.
Estos <<principios>> son modelos que proporcionan técnicas que , a su vez, deben aplicarse en
el diseño e implementación de los programas. Estas técnicas nos indican la forma de resolver
los distintos problemas que surgen a la hora de programar.
Decimos que un lenguaje de programación <<soporta>> un conjunto de <<principios>>
si el lenguaje simplifica la aplicación de estas técnicas. A estos <<principios>> se
les denomina metodologías de programación.
Las metodologías de programación son modelos sobre como diseñar e implementar los programas.
Diferentes modelos tienen como resultado diferentes técnicas. Que cada técnica sea distinta no implica
que una sea la verdadera y que las demás falsas. Por el contrario, las metodologías se complementan
entre sí. Lo que todas las metodologías tienen en común es la premisa de que hay que partir
de abstracciones que corresponden a elementos del problema a resolver, y que la implementación de la solución
se debe realizar mediante un conjunto de módulos preferiblemente reutilizables.
Las metodologías orientadas a objetos se centran en las estructuras de datos que sin embargo se relegan
a un segundo plano en los modelos procedurales. La base de esta metodología es que una estructura de datos
debe contener las operaciones que los modifican. La técnica que se utiliza para obtener esta <<abstracción
de datos>> es la encapsulación de los mismos en una estructura conocida como clase.
El accesos a los datos contenidos en la clase se realiza mediante las operaciones que la propia clase define. Por
tanto, la metodología orientada a objetos complementa el punto de vista procedural de operaciones realizadas
sobre un flujo de datos, al asociar a cada dato el conjunto de operaciones que lo modifican. Como podrá
ver, ambos enfoques son complementarios.
| Para ilustrar las diferencias entre las aproximaciones orientadas a procedimientos y las orientadas a objetos,
considere el diseño de un <<compilador>> El compilador es un programa que a partir de un conjunto de fichero fuente (programa) construye el código objeto que posteriormente se convierte en programa. Para realizar su trabajo, el compilador lee el fichero fuente y separa de él las variables y las instrucciones. Las variables constituyen la tabla de símbolos del programa, mientras que las instrucciones se organizan en un árbol sintáctico donde se plasman todas la referencias que realizan los mandatos y funciones entre sí. |

El modelo mejor establecido es el basado en funciones (procedural) que trata de la construcción de un programa
como una colección de funciones. Las metodologías proporcionan una gruía sobre cómo
diseñar, organizar e implementar las funciones que componen un programa. El método de diseño
es la descomposición funcional que identifica las funciones como los pasos a seguir en la resolución
de un problema. La organización en archivos permite que las funciones se agrupen módulos separados,
mientras que las técnicas de programación estructurada permiten que las implementaciones de las funciones
sean fáciles de consultar y mantener.
La programación orientada a objetos está basada en un modelo de construcciones de programas como
un conjunto de clases. El diseño orientado a objetos identifica los tipos que representan los distintos
objetos en el programa. Las operaciones a realizar con cada uno delos objetos son, al igual que en el modelo procedural,
los pasos destinados a solucionar el problema. El objeto sirve además de módulo que puede reutilizarse
para la solución de un problema de similares características en otro programa.
Ninguna metodología resuelve con acierto todos los tipos de problemas. La programación requiere una
especialización como la que se produce en la ingeniería pero todavía no es posible identificarla
como una ciencia. Las técnicas a emplear se han de utilizar con exquisito cuidado, sin perder de vista el
objetivo de resolver un determinado problema.
Actualmente existe la tendencia de identificar la programación con una disciplina como la ingeniería.
Sin embargo, debe considerarse más como un arte como la arquitectura, donde se unen la inspiración
y el dominio de la técnica.
Para la elección de un determinado entorno debemos fijar los criterios necesarios, como los que describimos
a continuación.:
Tamaño de la aplicación
Cuanto mayor sea el volumen de información a procesar, mas necesidad habrá de estructurar dicha información
de forma que se fácil su manipulación.
Complejidad
Podemos dividir el problema de la complejidad en dos grandes apartados.
Datos: La complejidad viene reflejada por el tipo de datos a tratar, por las relaciones que puedan tener los datos
entre si, etc.
Funciones: El método para la obtención de nuevos datos es complicado o requiere un esfuerzo de programación
importante.
Aunque tratados como grupos independientes, ambos están generalmente interrelacionados. De esta forma una
estructura de datos compleja suele ir acompañada de un conjunto de funciones de diseño complejo.
Asimismo, una mayor abstracción se traduce en unas instrucciones mas potentes y un soporte de estructuras
de datos más complejas. Esto a menudo se traduce en que el compilador (programa que traduce el programa
introducido por el usuario en código ejecutable por la máquina) ha de introducir una cantidad grande
de código auxiliar para poder ejecutar el código fuente.
| Si ha programado en C o en Turbo Pascal, habrá observado que los ejecutables son en general de pequeño tamaño. Un simple programa <<Hola mundo>>, clásico de programación. Nunca es mayor de seis líneas de código y su ejecutable es siempre inferior a 10 Kbytes. Si tomamos Clipper el programa no ocupa más de una línea pero más de 200 Kbytes. |
| En la realización de un sistema informático se utiliza un equipo de varias personas. El trabajo se
divide en tres áreas funcionales: una parte del equipo se encarga del interface de usuario, otra de la manipulación
de datos y, la última del diseño de salidas impresas. Cada quipo utiliza funciones y datos suministrados por los otros miembros del equipo y a su vez diseña funciones para su uso interno y para el uso del resto de los grupos. Si no se realiza la división del trabajo de forma adecuada puede producirse el caos. He aquí una pequeña enumeración de los problemas que se pueden encontrar. · Las funciones desarrolladas por cada uno de los grupos no encajan con las necesidades de los demás. · Otros grupos han elegido nombres de variables y funciones similares a los elegidos por nuestro grupo. Estas funciones y variables son prácticamente iguales a las desarrolladas por nosotros, pero varían ligeramente en el tratamiento de la información, por lo que no podemos sustituir nuestras funciones. Ambas deben coexistir aumentando la complejidad del programa de manera innecesaria. · El resto de los grupos sólo cubren determinados aspectos de la información a tratar, pero no proporcionan toda la información necesaria para que el programa funcione. El resto de información debe suministrarse suplantando parte de la funcionalidad destinada a otros grupos. · Algunas de las modificaciones que realizamos sobre variables locales o globales producen resultados imprevistos en el resto de los módulos. |
| El <<sistema de tratamiento de información documental>> es un gestor de <<documentos>>, de tal manera que puedan clasificar en uno o varios <<índices>>, recuperar para su modificación, visualizar, para su consulta, reclasificar, archivar y destruir. El <<sistema>> procesa la petición del <<usuario>>, devolviendo un mensaje e indicando el éxito o el fracaso de la petición. |

Hemos traducido los requerimientos a un conjunto de objetos.
Estos están inconexos entre sí, pero aplicando la <<lógica>> podemos ver las relaciones
que existen entre ellos. Sin salirnos de las especificaciones de la aplicación, vemos que existen las asociaciones
que aparecen en la siguiente figura:

Como podemos observar, algunas asociaciones cíclicas como Indice <-> Documento. Estas asociaciones
pueden simplificarse. También existen otras implícitas que examinaremos más adelante, como
Usuario->Documento->Indice.
Observemos gráficamente las asociaciones que mantienen los objetos entre sí en la siguiente figura

Como puede verse hay dos asociaciones sospechosas, ya que no son verbos sino los sustantivos <<petición>>
y <<mensaje>>. Estas dos asociaciones se pueden <<objetivar>> de tal manera que reúnan
las condiciones de un objeto. Para ello debemos volver a las especificaciones iniciales.
| Cuando se archiva un documento se debe indicar el nombre del documento así como los índices a los que se va a asociar. Las peticiones de recuperación deben incluir un índice y el nombre del archivo. Las consultas a los índices deben incluir el nombre del indice y una condición. |

BIBLIOGRAFÍA / INFOGRAFIA
Principles of Component Design 1518A Microsoft Autorized academic trining program
Fundamentos del diseño y la programación orientada a objetos Sergio M Fernández Sastre, editorial
McGraw Hill
Ingeniería de software, Sommerville I, editorial Addison-Wesley
Object-Oriented Programming, Coad P . Editorial Yourdon Press.
Apuntes de cátedra Programación 3 lenguae C++ Universidad Nacional de la Matanza.
Autoría: