CONFERENCIA #10 Introducción a la P.O.O Sumario: Problemas del enfoque estructurado El enfoque orientado a objetos. Características de los objetos (Objetos, clases, herencia). Problemas del enfoque estructurado: Que es la Programación Estructurada? Hasta ahora hemos venido siguiendo, aún sin haberlo declarado, la metodología estructurada parar diseñar nuestros programas. Al hacerlo hemos buscado las órdenes necesarias para completar determinada tarea y después hemos escrito las sentencias del lenguaje que reflejen dichas órdenes. En los lenguajes de procedimiento (C, BASIC, PASCAL), cada sentencia del lenguaje le dice a la computadora que haga algo. Entrar un dato, sumar dos números, visualizar el resultado. Un programa en un lenguaje de este tipo es una lista de instrucciones. En el caso de programas muy pequeños, no se necesita un principio de organización riguroso. El programador crea una lista de instrucciones y la computadora las ejecuta. A medida que los programas crecen, la programación se hace más difícil en una tira de instrucciones. Pocos programadores pueden entender un programa de más de 200 instrucciones, a menos que estén divididos en funciones. Cada función tiene un propósito claramente definido y una interfaz bien definida con el resto de las funciones del programa. Dividir un programa en funciones es uno de los pilares de la programación estructurada. Problemas de la programación estructurada. A medida que los programas se vuelven más largos y complejos y más programadores deben participar en el proyecto, la programación estructurada comienza a mostrarse poco flexible, los resultados demoran, se añaden más programadores al proyecto, aumenta la complejidad, suben los costos , el programa no termina, aparecen errores por todas partes. Cuando se analizan las causas de estas fallas, se encuentra la debilidad del paradigma de procedimiento: no importa cuan bien estructurados nuestros programas a medida que crezcan se tornarán excesivamente complejos. Devaluación de los datos. 1 En los lenguajes de procedimiento el énfasis está en hacer cosas, leer el teclado, invertir el vector, chequear los errores, etc. La subdivisión del programa en funciones continúa ese énfasis. Las funciones hacen cosas, tal y como lo hacen las sentencias. Y que sucede con los datos en este paradigma? Después de todo los datos son la existencia de todo programa. La parte más importante de un sistema de inventario no es la función que imprime los datos, sino los propios datos. Aún así a estos se les da un estatus secundario en la organización de los lenguajes de procedimiento. Si los datos se leen de disco y tenemos una función que los actualiza, otra que los imprime, otra que calcula resultados a parir de ellos, probablemente sean tratados como globales. Variables globales V. locales V. locales Función A Función B. Ahora supongamos que se une un nuevo programador al proyecto como no conoce todos los detalles de la implementación puede (de manera accidental) alterar incorrectamente los datos. Por ejemplo en una función que cuenta la cantidad de trabajadores de sexo masculino. if (sexo = 'm') cant_hombres++ En realidad se contarán todos los trabajadores y además la columna sexo será alterada incorrectamente. Encontrar ese error en un programa corto tal vez no sea muy difícil, pero probemos en uno de 10000 líneas. Además como todas las funciones tienen acceso a los datos ( porque son globales ), es difícil determinar cuál produjo el error. A esto se añade que si cambia la estructura de los datos hay que hacer prácticamente un programa nuevo. Está comprobado que en el tiempo de vida de un programa la mayor parte del tiempo y del esfuerzo se invierte en realizarse mejoras y cambios. Y la programación estructurada no es muy flexible a los cambios. Muchos de los programas que Uds. conocen son versiones mejoradas o ampliadas de programas anteriores: Windows, Word, etc. Necesitamos entonces restringir los datos de manera que solo puedan ser accesados por funciones críticas. Esto protegerá los datos y disminuirá los costos y tiempo del mantenimiento. Nuevos tipos de datos. En los lenguajes tradicionales no es posible crear nuevos tipos de datos..Por tipo de datos entendemos no solo su estructura en memoria, sino las operaciones que se realizan sobre ellos. Los lenguajes típicamente tienen varios tipos de datos interconstruidos enteros, números de tipo flotante, caracteres, etc.. Y si queremos invertir nuestro propio tipo de dato?. Por ejemplo Punto_Plano. 2 Los lenguajes tradicionales no permiten crear nuevos tipos de datos. Para sumar dos estructuras de tipo Punto_Plano será necesario hacer una función llamada Suma_Punto_Plano() o algo parecido y enviarle como parámetro dos puntos, pero sería mucho mejor si pudiéramos emplear el propio operador + verdad?. El enfoque Orientado a Objetos. Existe una forma de resolver estas limitaciones de la Programación Estructurada: Si combinamos datos y funciones en una misma estructura llamada Objeto. Esta vez el diseño no se concentrará en la división en funciones del programa, sino en identificar y diseñar los objetos de la aplicación. A esta manera de pensar se le conoce como POO y resulta curioso que realmente surgió mucho antes que la Programación Estructurada, sin embargo tomó auge mucho después porque su implementación exigía una máquina más potente. Los lenguajes OO actuales son en realidad un híbrido de PE y POO, pues diseñar una aplicación enteramente OO puede tornarse muy complejo. Podemos entonces decir que la POO es una extensión, un superconjunto de la PE. Existe en un programa OO funciones que pertenecen a un objeto (funciones miembro) y funciones independientes. main() objeto1 función1 objeto2 datos datos función función miembro() miembro() Típicamente las funciones miembros son la única manera de accesar a los datos de un objeto. O sea, que si queremos leer un dato del objeto, llamamos a la función miembro encargada de eso, y ella nos devolverá el valor del dato. No podemos accesar a él directamente, los datos están ocultos y por tanto más protegidos de alteraciones accidentales. Se dice que los datos y sus funciones están encapsulados, entro de una entidad: los objetos. Si se quiere modificar un dato de un objeto, se conocen exactamente qué funciones interactúan con él; las funciones miembros del objeto. Ninguna otra función puede accesar a los datos. Esto simplifica la escritura, depuración y mantenimiento de los programas. Una analogía. Dptos de una Empresa, cada uno tiene su propio personal con tareas claramente asignadas y datos que atender. (ver interacción entre los Departamentos) Dpto de Contabilidad $ 3 J' de Dpto. contador Personal Secretaría expedientes Matrícula y notas J' de Personal Secretaría Asistente J' de Secretaría Características de los lenguajes OO. Objetos: Cómo dividir el programa en objetos.? Objetos físicos: − automóviles en una simulación del tráfico. − componentes eléctricos en un programa de diseño de circuitos. − países en un modelo económico. Elementos del ambiente computadora−usuario: − ventanas − menús − objetos gráficos( líneas, rectángulos, círculos, polígonos). − el ratón y el teclado. Colecciones de datos. − inventario. − fichero del personal − un diccionario. tipos de datos creados por el usuario − tiempo − punto−plano − #s complejos. Componentes de un juego por computadora. 4 − animales en una simulación ecológica − oponentes y amigos en juegos de aventuras. Objetos se parean con objetos del mundo real. Clases: Los objetos son miembros de clases. Analogía con los tipos de datos interconstruidos y las variables. Una clase es una abstracción que describe las características comunes a un mismo tipo de objeto. Es un molde con el cual se construyen los objetos, que serán por lo tanto una copia de la clase a quien pertenece. Ej. OBJETOS 5