Programacion orientada objetos-1

524 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
524
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Programacion orientada objetos-1

  1. 1. ACADEMIA DE COMPUTACIÓN PROGRAMACIÓN ORIENTADA A OBJETOS Introducción Antecedentes A partir de la década de los 70 se originó la llamada Crisis del Software debido a una serie de problemas encontrados en el desarrollo de sistemas para computadoras. La crisis también se derivó de la contradicción entre el reciente desarrollo del hardware y su aprovechamiento a través del software, esto es, que se dedicó poco esfuerzo al desarrollo de metodologías para la creación del software, creando un atraso de entre una y dos generaciones entre los microprocesadores y el software que los manipula. Las respuestas a estos problemas fueron entre otras: Programación estructuradas en los lenguajes de programación. Modularidad y organización de bibliotecas. Estas mejoras no fueron suficientes para resolver el problema ya que no se consideró: Recursos humanos para el mantenimiento consistente en adaptar el software a nuevos requerimientos imposibles de haber sido planificados inicialmente. Errores del software, esto es, resultados erróneos. Altos costos y tiempo de desarrollo muy largos. • El análisis era deficiente, lo cual derivaba cambios y adaptaciones. • Problemas de comunicación entre los diferentes módulos al momento de la unión. Sistemas poco flexibles y confiables. • Esto ocurre cuando el sistema no cubre las necesidades del usuario final. • No proporciona la información que el usuario requiere. • Información no confiable. • sistema difícil de manipular. Ante tantos problemas, los especialistas en software llegaron a la conclusión de que en cualquier técnica que trate de resolver los problemas anteriores, el desarrollo de sistemas deberá contemplar las siguientes características: Entender el problema y dominarlo. Comunicación entre personas. Prever cambios continuos. Reutilizar el código. Historia de la Programación Orientada a Objetos (POO). Al mismo tiempo que se da la Crisis del Software, por otro lado la Orientación a Objetos (OO) se empezó a discutir a fines de los años 60 con el desarrollo del lenguaje SIMULA67 por Nygaard y Ole-Johan Dahl en el Centro de Cálculo Noruego, en él, introdujeron los conceptos de clase, subclases y rutinas, muy parecidos los conceptos a los lenguajes orientados a objetos de hoy en día. A mitad de la década de los 70 los científicos del Centro de Investigaciones Palo Alto de XEROX (PARC) (XEROX Palo Alto Research Center) crearon el lenguaje SMALLTALK, el primer lenguaje orientado a objetos consistente y completo. En él cada elemento del lenguaje fue realizado un objeto. Este último lenguaje evolucionó a través de varios lanzamientos realizados por PARC. JAVIER JIMÉNEZ PACHECO
  2. 2. 2 A pesar de este movimiento temprano hacia los lenguajes orientados a objetos, sólo se lograron pequeñas incursiones en la comunidad de la programación general. El progreso reciente se ha acelerado debido principalmente a la disponibilidad de las extensiones orientadas a objetos para dos lenguajes populares: C y PASCAL, y a las extensiones prometidas para otros lenguajes comerciales populares como BASIC y COBOL. Paradigma de la Programación Orientada a Objetos. Para aquel que no es un programador, Orientación a Objetos significa algo bastante familiar: considerar al mundo como un conjunto de entidades u objetos que están relacionados y se comunican entre ellos. Esta es la forma en que la gente normal ve el mundo, así es que este pensamiento tiene intrínsecamente sentido. La Orientación a Objetos se basa en estas ideas: un programa es un mundo que representa un subconjunto del mundo real. La estructura del programa se simplifica en gran medida si cada una de las entidades u objetos del problema que se está modelando corresponde directamente con un objeto que se puede manipular internamente en un programa. Para el desarrollo de sistemas, la orientación a objetos es un nivel de abstracción de computadora más allá de los procedimientos y los datos. La orientación a objetos anima al desarrollador de sistemas a concentrarse en los temas importantes e ignorar el resto a la hora de la modelación. El hecho de que el tema central sean los objetos, aunque intuitivamente, marca una desviación significativa de los anteriores paradigmas de la programación. Una ecuación para reconocer una aproximación a la Orientación a Objetos es: ORIENTACIÓN_OBJETOS = CLASES Y OBJETOS + HERENCIA + COMUNICACIÓN CON MENSAJES Todos los sistemas que merecen la descripción de Orientado a Objetos contienen estos mecanismos esenciales, aunque los mecanismos pueden no estar realizados exactamente de la misma forma. Analicemos ahora los términos de la ecuación. OBJETOS (Sinónimo de instancia). Es la abstracción de alguna cosa en el dominio del problema que refleja la capacidad de un sistema de alcanzar información alrededor de él. Los objetos, por lo tanto, son entidades que tienen atributos (datos) y formas de comportamiento (procedimientos) particulares. Las aplicaciones pueden constar de diferentes clases de objetos. Un objeto pasivo es el que actúa solamente bajo petición. Los objetos activos efectúan el seguimiento de los sucesos que ocurren en una aplicación y actúan de forma autónoma. CLASE. Una clase es una descripción de un conjunto de objetos casi idénticos. Una clase consta de métodos y datos que resumen las características comunes de los objetos, incluyendo una descripción de cómo crear un nuevo objeto de la clase. En otras palabras, las clases contienen los anteproyectos para crear objetos. Redefiniendo un objeto. Un objeto es un modelo o instancia de una clase. Ejemplos de estos conceptos (utilizaremos un lenguaje más fácil de entender para definirlos): Una clase es un molde que define los datos y procedimientos que actúan sobre esos datos y los objetos serán los elementos producidos por ese molde. Ejemplo 1: Consideremos cómo un programador podría designar una aplicación de procesamiento de una posición en el espacio en forma orientada a objetos. PROFESOR JAVIER JIMÉNEZ PACHECO
  3. 3. 3 clase posición métodos iniciar leerX leerY saluda variables X, Y Los objetos serían PuntoA, PuntoB donde tanto PuntoA como PuntoB tienen las características de posición. Ejemplo 2: Veamos ahora cómo sería la aplicación con el sistema de los números complejos en forma orientada a objetos. clase complejos métodos iniciar operadores para las operaciones entre ellos real, imaginaria variables Algunos objetos son p y q que por ser números complejos son de la forma (real, imaginaria). Descripción del término herencia La herencia es un mecanismo para expresar similaridad entre clases, simplificando definiciones de las clases similares previamente definidas. La herencia permite crear nuevas clases llamadas subclases agregando solamente las diferencias con la clase. En otras palabras la herencia es una partición en subclases más especializadas. El principio en que se basa este concepto es de que las clases que se derivan de otras clase, comparten las características comunes de la clase de la que descienden. Ejemplo 1: posición punto muestra oculta visible saluda visible círculo expande comprime crea saluda PROFESOR JAVIER JIMÉNEZ PACHECO radio
  4. 4. 4 Ejemplo 2: Para este ejemplo usaremos la clase publicación. publicación libro periódico Descripción del término comunicación con mensajes. Los objetos tienen la posibilidad de actuar, la acción sucede cuando un objeto recibe un mensaje, que es, una solicitud que pide al objeto que se comporte de alguna forma. Cuando se ejecutan los programas orientados a objetos, los objetos reciben, interpretan y responden a mensajes procedentes de otros objetos. Los mensajes pueden contener información para clasificar una solicitud. El objeto emisor del mensaje no necesita conocer la forma en que el objeto receptor está llevando a cabo la solicitud, solamente conoce que se está sucediendo. Los procedimientos residen en el objeto y determinan cómo actúa el objeto cuando recibe un mensaje. De hecho, los métodos proporcionan el único mecanismo para cambiar los valores de las variables del objeto. (A este hecho se le conoce como encapsulamiento). Los mensajes que reciben el objeto son los únicos conductos que conectan al objeto con el mundo exterior. Estas características de los objetos confieren a la orientación a objetos su ventaja: la orientación a objetos fomenta la modularidad haciendo muy claras las fronteras entre objetos, explícita la comunicación entre los mismo y oculta los detalles de la realización. En un programa con orientación a objetos ocurren tres sucesos: 1) Se crean los objetos cuando se necesitan. 2) Los mensajes se mueven de un objeto a otro a medida que el programa procesa internamente información o responde a la entrada del usuarios. 3) Se borran los objetos cuando ya no son necesarios y se recupera memoria. objeto objeto datos datos métodos métodos mensaje mensaje mensaje datos métodos PROFESOR JAVIER JIMÉNEZ PACHECO
  5. 5. 5 Características deseadas de la Programación Orientada a Objetos Las características deseadas pueden variar y es difícil ponerse de acuerdo. Principio de Abstracción • • Datos Procedimientos Encapsulamiento Herencia • • Simple Múltiple Comunicación con mensajes Polimorfismo Manejo automático de memoria • • Constructores Destructores Métodos virtuales Sobreposición de operadores Antes de ver cada uno de estos conceptos es importante mencionar que los ejemplos de los mismos se darán con seudo código, por lo que daremos una idea de este concepto. El seudo código se utiliza como una herramienta para estructurar el código de un programa sin comprometerse con ningún lenguaje, pero que es posible que tenga alguna semejanza con el lenguaje a utilizar. En el seudo código se utilizan palabras en nuestro lenguaje que son similares a las palabras utilizadas por los lenguajes de programación. En realidad el seudo código es muy similar a un algoritmo pero más estructurado, ya que se le deben de dar sangrías a la escritura de las instrucciones para hacerlo más legible en la lectura. Iniciamos: Principio de abstracción • Es el principio de ignorar los aspectos de un sujeto que no son relevantes en un propósito de orden de concentración más exacto. • El proceso de representar entidades reales como elementos internos a un programa recibe el nombre de abstracción. • De esta forma, un tipo de dato abstracto se puede escribir concentrándose en las operaciones que manipulan a los objetos de este tipo, sin caer en detalles de representación y manipulación de datos. Datos. Es un atributo del objeto que representa cuantitativamente o cualitativamente a ese objeto. Procedimiento. Es una operación que lleva a cabo un servicio a los atributos del objeto. PROFESOR JAVIER JIMÉNEZ PACHECO
  6. 6. 6 Ejemplo 1: En el ejemplo de la posición en el espacio se quiere representar en objetos, queremos abstraer esta parte del mundo real a un programa que pueda representarlos. Una posición en el plano la determinan las coordenadas (x, y), que serían nuestros datos y los procedimientos que las manipulen pueden ser: iniciar posición leer x leer y saluda Ejemplo 2: En el ejemplo de los números complejos se tiene que éstos son de la forma (real, imaginaria), donde real e imaginaria son números reales, de lo que podemos intuir que los datos sean: real e imaginaria Los atributos que manipulan estos datos pueden ser todos los operadores aritméticos (+, -, *, /) y los operadores de relación ( =, < > ). Encapsulamiento (ocultamiento de datos). Se refiere al hecho de que ningún programador ni de ninguna otra parte de un programa se pueda tener acceso a los datos de un objeto en forma directa, sino a través de los procedimientos del objeto. Ejemplo 1: En este ejemplo para leer cualquiera de las coordenadas no se puede directamente sólo leyendo por separado las coordenadas con los procedimientos de lectura. Ejemplo 2: En el ejemplo de los números complejos cada número complejo no se puede modificar a menos que sea con los operadores. Herencia. La herencia es un mecanismo que para expresar similaridad entre clases, simplificando definiciones de clases similares previamente detenidas. • La herencia simple es cuando el lenguaje sólo permite que una clase derive de una clase. • La herencia múltiple es cuando una clase puede ser derivada de más de una clase. Ejemplo 1. Herencia simple: clase posición clase punto datos datos procedimientos procedimientos PROFESOR JAVIER JIMÉNEZ PACHECO
  7. 7. 7 Ejemplo 2. Herencia múltiple (multimedia): sonido imagen imagen con sonido Comunicación con mensajes. Las variable de un objeto sólo pueden ser manipuladas por sus propios métodos. Es decir, los mensajes mandan una petición de acción a un objeto, mientras que los métodos del objeto deciden cómo llevar a cabo la acción. Ejemplo: En la definición de posición consta de los datos, coordenadas X e Y y los métodos que inician y devuelven los valores X y Y. Procedimiento leer X Regresa valor de X Polimorfismo Es cuando una clase tiene varios procedimientos con el mismo nombre, pero con distinto tipo y/o número de argumentos. Ejemplo 1: Se puede tener más de un procedimiento saluda en la clase posición. a) Se puede tener un procedimiento procedimiento Saluda escribe "Hola soy posición"; b) Se puede tener un procedimiento procedimiento Saluda (mensaje) escribe mensaje; Manejo Automático de Memoria. En el apartado de comunicación con mensajes se menciona que en un programa con orientación a objetos ocurren tres sucesos, dos de ellos nos interesan. El primer suceso dice: "Se crean los objetos cuando se necesitan." y el tercer suceso indica: "Se borran los objetos cuando ya no son necesarios y se recupera la memoria.". Estos sucesos se desarrollan con los constructores y destructores. • Constructores Los constructores son procedimientos de la clase que permiten crear objetos. Un constructor es llamado para asignar memoria a un objeto, para asignar valores a los datos del objeto y realizar tareas iniciales para un nuevo objeto. Esto implique que si no podemos trabajar con un objeto que no haya sido creado a través de un constructor y si sólo se pueden modificar mediante los procedimientos de la clase NO TENEMOS FORMA DE CORROMPER EL OBJETO, lo cual aumenta la confiabilidad y facilita la rehusabilidad. PROFESOR JAVIER JIMÉNEZ PACHECO
  8. 8. 8 • Destructores Un destructor es un procedimiento de la clase que realiza la tarea opuesta a su constructor, libera la memoria que fue asignada al objeto que fue creado por el constructor. Es deseable que el destructor se invoque implícitamente cuando el objeto abandone el bloque donde fue declarado. El destructor le permite al programador despreocuparse de tener que liberar la memoria que deja de utilizar y correr el riesgo de que ésta se sature. Ejemplos: Normalmente en los lenguajes con orientación a objetos el destructor como el constructor tienen el mismo nombre de la clase a la que pertenece. Ejemplo 1: Constructor iniciar (real 1, real 2) x = real 1 y = real 2 Destructor iniciar borra x borra y Métodos Virtuales. Una jerarquía de clases unidas por la herencia, con nombres de métodos comunes para operaciones que son similares conceptualmente, pero que realizan tareas diferentes. Como consecuencia, cuando diferentes objetos de las diferentes clases de la jerarquía reciben el mismo mensaje, éste provoca acciones totalmente distintas. Ejemplo: En el ejemplo 1, Posición, Punto y Círculo pueden recibir cada uno el mensaje saluda y responder de distinta forma, los procedimientos serían: a) posición saluda "Hola, soy posición"; b) punto saluda "Hola, soy punto"; c) círculo saluda "Hola, soy círculo" Se puede hacer algo más complejo como hacer procedimientos que mostrará el punto o mostrará el círculo. Sobreposición de Operadores. Es una característica de un lenguaje de programación que permite que el mismo operador sea utilizado con tipos diferentes. Dicho de otra forma, si se tiene una aritmética definida con ciertos operadores, sería deseable que permita utilizar la misma notación para los nuevos tipos de operadores que se definan. Ejemplo: En el ejemplo 2 de números complejos se tienen los operadores aritméticos un ejemplo de sobrecarga de operadores sería: complejos operador +(complejo,complejo) PROFESOR JAVIER JIMÉNEZ PACHECO
  9. 9. 9 complejos operador *(complejo,complejo) Lenguajes de Programación Orientada a Objetos Para explotar el paradigma de la orientación a objetos se necesitan lenguajes idóneos. Existen dos tipos diferentes de lenguajes de Programación Orientada a Objetos: Puros e Híbridos. Los lenguajes puros son aquellos en los que casi todo es un objeto, es decir, tienen las propiedades específicas de la programación orientada a objetos. Entre ellos se tienen SIMULA (basado en ALGOL), SMALLTALK y SMALLTALK V (que es el más difundido), ACTOR y EIFFEL. Los lenguajes híbridos son los lenguajes que añaden a las propiedades tradicionales estructuradas, características orientadas a objetos. Representantes de este grupo son C++ descendiente de C, TURBO PASCAL. Características de algunos lenguajes SMALLTALK Es el primer lenguaje con orientación a objetos. Descendiente de SIMULA-67 fue desarrollado por XEROX´5 es el lenguaje puro de POO por excelencia. El entorno SMALLTALK está disponible en muchas plataformas, entre ellas DOS, OS/2 y WINDOWS. TURBO / QUICK / OBJECTIVE-PASCAL Borland International y Microsoft simultáneamente lanzaron versiones orientadas a objetos de PASCAL. Borland utilizó la filosofía de C++ y Microsoft la filosofía de SMALLTALK en sus versiones. Sin embargo, Borland ha evolucionado su producto con versiones 5.5 / 6.0 y 7.0 incluyendo una biblioteca de clases llamada Turbo Vision está disponible en DOS, WINDOWS y OS/2. C++ C++ es el híbrido más popular, existen versiones para las plataformas: DOS, OS/2, WINDOWS, UNIX, XENIX, etc. y muchos fabricantes, como AT&T, Borland, etc. Es descendiente de C ANSI. Ejemplos con C++ Ejemplo 1: Figuras geométricas #include <iostream.h> /* *************** clase posicion ******************* */ class posicion { private: int X,Y; public: // caracteristica de lenguaje hibrido void iniciar (int iniciarX, int iniciarY) { X = iniciarX; Y = iniciarY; }; int leerX(); int leerY(); virtual void mensaje(){ cout << "Hola estoy en posicionn";}; }; // fin posicion PROFESOR JAVIER JIMÉNEZ PACHECO
  10. 10. 10 int posicion::leerY() { return Y; } int posicion::leerX() { return X; } /* *************** clase punto ********************** */ class punto : public posicion { int visible; public: virtual void mostrar(); virtual void ocultar(); int EsVisible(); virtual void saluda(){ cout << " Hola soy un punton";}; }; // fin punto void punto::mostrar() { visible = 1; }; void punto::ocultar() { visible = 0; }; int punto::EsVisible() { return visible; } /* *************** clase circulo ********************** */ class circulo : public punto { int radio; public: void iniciar (int iniciarX, int iniciarY, int IniciaRadio) { punto::iniciar(iniciarX, iniciarY); radio = IniciaRadio; }; void expandir(int ExpandirPor); void comprimir(int ComprimirPor); virtual void saluda(){ cout << " Hola soy un circulon";}; }; void circulo::expandir(int ExpandirPor) { radio = radio + ExpandirPor; }; PROFESOR JAVIER JIMÉNEZ PACHECO
  11. 11. 11 void circulo::comprimir(int ComprimirPor) { radio = radio - ComprimirPor; } /* *************** fin clase circulo ********************** */ void main (void) { int Z; circulo posicionA; posicionA.iniciar(16,3,35); posicionA.ocultar(); if (posicionA.EsVisible()) { Z = posicionA.leerX(); cout << "n valor visible de X " << Z; posicionA.saluda(); } else cout << "n valor X no visible " ; } Ejemplo 2: Sistema de los números complejos #include <iostream.h> class complex { private: double r,i; public: void create (double, double); complex (double, double); // crea un objeto tipo complejo // constructor crea un complejo complex operator +( complex ); // sobrecarga de operadores // polimorfismo void suma(complex); complex suma(complex, complex); complex operator *(complex ); // sobrecarga de operadores // polimorfismo void producto(complex); complex producto(complex,complex); complex operator =(complex ); /* // sobrecarga de operadores complex operator -(complex ); complex operator /(complex ); */ PROFESOR JAVIER JIMÉNEZ PACHECO
  12. 12. 12 double real(void); double imag(void); void escritura(void); }; // fin complex void complex::create (double re= 0, double im= 0) { r= re; i= im; } void complex::complex (double re= 0, double im= 0) { r= re; i= im; } complex complex::operator +(complex a) { complex t; t.create (a.r + r, a.i+i); return t; } // constructor // sobrecarga de operadores complex complex::suma (complex a, complex b) // suma de dos complejos { complex t; t.create (a.r + b.r, a.i+b.i); return t; } void complex::suma (complex a) { r+= a.r; i+= a.i; } // suma de 2 complejos complex complex::producto (complex a, complex b) { complex t; t.create (a.r * b.r - b.i * a.i , a.i * b.r + a.r * b.i); return t; } void complex::producto (complex a) { r = a.r * a.r - a.i * a.i; i = 2 * a.i * a.r; } complex complex::operator *(complex a) { complex t; r = a.r * a.r - a.i * a.i; i = 2 * a.i * a.r; t.create(r,i); PROFESOR JAVIER JIMÉNEZ PACHECO
  13. 13. 13 return t; } complex complex::operator =(complex a) { r = a.r; i = a.i; return *this; } double complex::real (void) { return r; } double complex::imag (void) { return i; } void complex::escritura(void) { cout << " ( " << r << " , " << i << " )" << "n"; } void main (void) { complex z1, z2,z3; z1.create (2.0,3.0); z2.create (1.0,4.0); z3 = z3.suma(z1,z2); // z3.suma(z3); z3 = z1 + z2; z3.escritura(); // cout << z3.real() << endl; // cout << z3.imag() << endl; z3 = z3.producto(z1,z2); z3.escritura(); // z2.producto(z2); // z2.escritura(); } Comparación del paradigma de la Programación Orientada a Objetos contra otros paradigmas. El paradigma de la programación orientada a objetos difiere de las tradiciones históricas de la programación procedimental. La programación procedimental se centra en los datos y procedimientos sin limitaciones acerca de los procedimientos que pueden actuar sobre dichos datos. PROFESOR JAVIER JIMÉNEZ PACHECO
  14. 14. 14 procedimiento 1 procedimiento 2 procedimiento 3 datos paradigmas tradicionales En el paradigma de la orientación a objetos los programas son conjuntos de una única entidad básica, el objeto, el cual combina los datos con los procedimientos que actúan sobre ellos, además los objetos reciben las peticiones e interactúan enviando mensajes a cada uno de los demás. datos Métodos mensaje datos Métodos mensaje datos datos Métodos Métodos Paradigma de la orientación a objetos • Con el paradigma procedimental es más difícil modelar el mundo real • Con el paradigma orientado a objetos se beneficia al desarrollo del software proporcionando una forma natural de modelar el fenómeno del complejo mundo real. Esto es, ofrece realmente un modelo más natural del mundo real. • Las características comunes entre dos entes quedan explícitas en la Programación Orientada a Objetos mientras que en la Programación tradicional no es así. • Los lenguajes orientados a objetos benefician el desarrollo de software modular, esto quiere decir que el programador no necesita examinar todo el código para ver si los cambios locales causarán problemas en cualquier otra parte del sistema. Por el contrario, con los lenguajes tradicionales, siempre existe la posibilidad de que una actualización de una subrutina o elemento de datos afecte a alguna rutina que se halle físicamente muy alejada de la actualización. • El apartado anterior implica que se facilita la reutilización del código creando una biblioteca de clases que están perfectamente probadas. • La herencia, que no tienen los lenguajes tradicionales, es una de las características más importantes y más potentes de la programación orientada a objetos, le permite a los programadores crear nuevas clases programando solamente las diferencias con las clases "padres". • El encapsulamiento facilita la comunicación entre programadores. • Se han hecho pruebas y se ve que un programa escrito con orientación a objetos no es muy más grande ni lento que uno similar usando programación tradicional. PROFESOR JAVIER JIMÉNEZ PACHECO
  15. 15. 15 Conclusiones Un objetivo de esta plática es que la Academia de Computación considere esta técnica como una materia dentro del currículo de la carrera. Que los maestros se interesen en difundirla considerando como un lenguaje apropiado "C++" que es un descendiente directo de C ANSI y que es una materia que ofrece la misma Academia. Se propone "C++" por lo estándar de C y por el número de plataformas que lo soportan teniendo por lo mismo un amplio futuro. Otro objetivo es de que la población de la escuela en general conozca esta forma de programar que se adecua más a los fenómenos físicos de la ingeniería, y el que los analistas y estudiantes generen sus propias librerías de clases y éstas les permitan atacar problemas de una manera más rápida y confiable. PROFESOR JAVIER JIMÉNEZ PACHECO

×