Download PROGRAMACION ORIENTADA A OBJETOS
Document related concepts
Transcript
PROGRAMACION ORIENTADA A OBJETOS Vivimos en un mundo de Objetos. Cada objeto tiene sus atributos y operaciones..... El texto anterior es parte una definicion de objetos, de los que hablaremos a lo largo de este Tutorial. Pretende ser un herramienta de ayuda al alumno principalmente, en el area Técnica de la computación. Dentro de este ciberespacio de información abordaremos temas como: ¿Qué es un Objeto?, ¿Qué es una clase?, ¿Qué es una clase Base?. Y dejaremos completamente claro y bien definido el objeto y sus partes principales, asi como la abstraccion de datos. Posteriormente hablaremos de como utilizar estas clases de objetos creando programas fuente que son explicados línea a línea para mayor comprensión de la tarea que ejecutan. También hablaremos de los tipos de funciones de la Programación Orientada a Objetos, como lo son los Constructores, Destructores, Funciones Amigas, Espacios de nombres, Funciones Virtuales y Operadores Amigos. Las practicas de programas y código fuente estan orientadas al lenguaje de programación C++, ya que es un lenguaje que incluye todo el soporte para desarrollo de objetos, pero claro, existen otros lenguajes orientados a objetos como lo es: Eiffel, SmallTalk, Pascal, ObjetiveC, etc.. Esperamos que este ciberviaje, te ayude sobre todo como apoyo a tus estudios de programación.... ¿ Que es la programación orientada a objetos?. La Programación Orientada a Objetos (POO) es una forma de enfocar la tarea de programación. Los enfoques de la programación han cambiado drásticamente desde la invención de las computadoras, la creciente complejidad de los programas, antes se realizaban mediante una consola las instrucciones máquina en binario. Esto funcionaba porque los programas sólo tenían unos pocos cientos de instrucciones. Cuando crecierón los programas, se invento el lenguaje ensamblador para que el programador pudiera manejar programas más largos y complejos usando una representación simbólica de las instrucciones máquina. Los lenguajes de alto nivel aparecierón para proporcionar al programador más herramientas con las cuales gestionar esa complejidad. En los años sesenta nace la programación estructurada, este es el método alentando por varios lenguajes como pascal, y C. Con los lenguajes estructurados fue posible escribir programas moderadamente complejos de una forma bastante sencilla. Sin embargo, usando incluso la programación estructurada, cuando los proyectos Alcanzan cierto tamaño, su complejidad se vuelve demasiado difícil para ser controlada por un programador. La Programación Orientada a Objetos toma las mejores ideas de la programación estructurada la combina con nuevos y poderosos conceptos que animan o alientan una nueva visión de la tarea de la programación. La Programación Orientada a Objetos permite descomponer fácilmente un problema en subgrupos de partes relacionadas. Entonces, puede traducir estos subgrupos en unidades autocontenidas llamadas Objetos. Evolución de la programación POO (Programación Orientada a Objetos)es un importante conjunto de técnicas que se pueden utilizar para hacer el desarrollo de programas más eficientes mientras se mejora la facilidad de los programas resultantes. En esencia, POO es un nuevo medio de enfocar el trabajo de programación. Sin embargo, a fin de comprender lo que es la POO,es necesario comprender sus raíces. Así pues, comenzaremos por examinar la historia del proceso de programación analizada cómo evolución POO y deduciendo, en consecuencia, por qué es tan importante este concepto. Programación lineal. Los lenguajes de programación lineal (BASIC,COBOL Y FORTRAN) no tenían facilidad para reutilizar el código existente de programas. De hecho se duplicaban segmentos de software cada vez más en muchos programas. Los programas se ejecutaban en secuencias lógicas, haciendo la lógica difícil de comprender. El control de programas era difícil y se producían continuos saltos a lo largo del referido programa. Aún más, los lenguajes lineales no tenían capacidad de controlar la visibilidad de los elementos llamados datos. Programación Modular El soporte más elemental de la programación Modular llegó con la aparición de la subrutina. Una subrutina ha creado una secuencia de instrucciones a las que se les da un nombre independiente; una vez que se ha definido, la subrutina se puede ejecutar simplemente incluyendo el nombre del programa siempre que se requiera. Las subrutinas proporcionan una división natural de las tareas; diferentes programas utilizan. Aunque las subrutinas proporcionan el mecanismo básico de la programación Modular, se necesita mucha disciplina para crear software bien estructurado. Sin esta disciplina, es facil escribir programas compilados y tortuosos difíciles de modificar y comprender, así como imposible de mantener. Esta ha sido la panoramica durante muchos años en el desarrollo del software. Programación Estructurada. Un concepto importante en campo de la programación Estructurada: Abstracción, ya que la Abstracción se puede definir como la capacidad de examinar algo sin preocuparse de los detalles internos. En un programa estructurado, es suficiente conocer que un procedimiento sea fiable, para que se pueda utilizar sin tener que conocer cómo funciona su interior. Esto se conoce como una Abstracción funcional y es el núcleo de la programación estructurada. Hoy casi todos los lenguajes de programación tienen construcciones que facílitan la programación estructurada. OBJETO ¿Que es la progamación en POO? La respuesta a esta pregunta es que cualquier entidad lógica del mundo real que se pueda imaginar, como: Objetos fisicos Automóviles Aviones Animales Mamíferos Los objetos soportan una serie de características especificas de los mismos: Se agrupan en grupos denominados clases Contienen datos internos que definen su estado actual. Soportan ocultamiento de datos. Pueden heredar propiedades de otros objetos. Pueden comunicarse con otros objetos enviando o pasando mensajes. Tienen métodos que definen su comportamiento Un objecto es una entidad lógica que contiene datos y un código especial que indica como manipular los datos. El uso de un objeto impone a veces castigos al momento de la ejecucion que en ocaciones pueden degradar seriamente el diseño de un programa. Los objetos son construcciones de programación que se obtienen a partir de cosas llamadas clases. El programador tiene la responsabilidad absoluta de crear clases propias, pero también puede tener acceso a las clases desarrolladas por otros. Ejemplo: diseño de un Objeto. Clase Objeto class nomina {nomina empleado; char nombre[30]; float salario; }; (nomina es una clase ) (empleado es un objeto) Los objetos son ejemplos de clases. Una clase es un tipo especial de datos, y esta orientada a la creación de objetos y que consta de unos miembros que pueden ser datos o funciones privadas o publicas. Componentes de una Clase Para poder definir una clase se debe tomar en cuenta que consta de dos partes: una declaración y una implementación. La declaración lista los miembros de la clase. La implementación o cuerpo define las funciones de la clase. Clase Objeto class nomina {nomina empleado; char nombre[30]; float salario; }; (nomina es una clase ) (empleado es un objeto) Declaración de una clase class contador{ long cuenta; public: void leervalor(long); long obtenervalor( ); }; funciones miembro Implementación de una clase void { contador::leerValor(long valor) cuenta = valor, } long Contador::obtenerValor( ) { return cuenta;} } Componentes de una definición de una clase CLASE Una clase es un tipo de dato que contiene uno o más elementos dato llamados miembro dato, y cero, una o más funciones que manipulan esos datos (llamados miembro función o funciones miembros). Una clase se puede definir con una estructura (estruct), una unión (unión) o una clase class. La sintaxis de una clase es: class nombre_clase { miembro_1; //lista miembro miembro_2; miembro_3; funcion_miembro_1( ); // funciones miembro conocidas funcion_miembro_2( ); //funciones como métodos }; Los objetos o instancias de una clase se definen así: Nombre_class_instancia_1; Un puntero o referencia a un objeto proporciona medios indirectos para acceder a un objeto, sin embargo, el puntero o la propia referencia no es una instancia de una clase. Y una clase es sintacticamente igual a una estructura, con la única diferencia de que en el tipo class todos los miembros son por defecto privados mientras que en el tipo struct son por defecto publicas. Así la estructura fecha antes declarada, se puede declarar con class: class fecha{ int día; int mes; int anyo; }; MENSAJES: Activación de Objetos La comunicación con el objeto se realiza a través del paso de mensajes. <<El envío de un mensaje a una instancia de una clase produce la ejecución de un método ( función miembro en C++) >>. El paso de mensajes es el termino utilizado para referirnos a la invocación o llamada de una función miembro de un objeto. La noción de paso de mensajes es fundamental en todos los lenguajes de programación Orientada a Objetos. Algunos ejemplos típicos de clases en las interfaces gráficas de usuarios, son los populares botones en interfaces Windows. A diferencia de los métodos tradicionales, cuyos elementos dato son pasivos, los objetos pueden ser activados mediante la recepción de mensajes es simplemente una petición de un objeto a otro objeto para que este se comporte de una determinada manera, ejecutado uno de sus métodos. La técnica de enviar mensajes se conoce como paso de mensajes. Estructuralmente, un mensaje consta de tres partes: la identidad del objeto receptor, cuya ejecución se ha solicitado y cualquier otra información adicional que el receptor pueda necesitar para ejecutar el método requerido. Esta información suele darse en forma de parámetros. "T1 Imprimir Hola Mundo" receptor método parámetros En el caso de C++, la notación utilizada es Nombre_del_objeto.función_miembro o método Así en el caso de un objeto T1 (miembros dato: nombre de un alumno y curso en que esta matriculado; miembro función: leerNombre, obtiene el nombre del alumno e imprimir, visualiza el citado nombre), que recibe un mensaje Imprimir. Los mensajes juegan un papel vital en POO; sin ellos, los objetos que se definen no se podrían comunicar con otros objetos. Desde un punto de vista convencional, el paso de mensajes no es más que el sinónimo de llamada a una función. De hecho, esto es lo que sucede cuando un mensaje se envia a un programa POO. La herencia es propiedad que permite a los objetos construirse a partir de otros objetos. El concepto de herencia está presente en nuestras vidas diarias donde las clases se dividen en subclases. La herencia permite entonces describir entidades (clases) por diferencia entre ellas; por eso se dice que programar con orientación a objetos es programar para diferenciar. La utilidad de la herencia es múltiple. En primer lugar hay que analizar, diseñar, codificar y poner a punto, que en cuanto se tiene un concepto definido, jamás lo repetimos. Como muchos, si el concepto nuevo es muy parecido a uno anterior, se define el nuevo como la diferencia respecto al anterior. Si surge un error en la utilización de la nueva entidad, seguro que el error está en lo que se ha añadido por que lo que se ha heredado ya se había producido. Hay diferentes tipos de herencia: los más importantes son simples y múltiples. Con esto se quiere decir que, al contrario de la herencia biológica donde siempre se hereda de dos padres, en la programación orientada a objetos se puede heredar de uno, dos o más padres. La definición de cliente minorista a partir de cliente es un ejemplo de herencia simple. Y se podria definir un vehiculo anfibio como una herencia (subclase) de otras dos clases: coche y barco. Es posible que todas las descripciones anteriores sean interesantes, pero sólo los detalles que se ofrecen a traves de un programa real demuestran que es la herencia y como funciona. Además aquí se muestra un breve ejemplo de dos clases, donde la segunda de ellas hereda propiedades de la primera. class box{ public: int width,heigth; void SetWidth(int w) {width = w;} void SetHeigth(int h) {heigth = h; } }; class ColoredBox: public Box{ public: int color; void SetColor(int c) {coor =c;} }; La clase Box recibe el nombre de clase de base de la clase ColoredBox que a su vez recibe el nombre de clase derivada. A si mismo, las clases base denominadas a veces clases protegidas o primarias. La clase ColoredBox se declara solo con una función, pero también hereda dos funciones y dos variables de su clase base. Así, se puede crear el codigo siguiente: //haga una instancia de ColoredBox cb; Void main( ) { //utilice funciones miembro en ColoredBox cb.SetColor(5) // no hereda cb.SetWidth(3); // heredadas cb.SetHeigth(50); // heredadas Observe como las funciones heredadas se utilizan exactamente como no heredadas. La clase ColoredBox ni siquiera tuvo que mencionar el hecho de que las funciones Box::SetWidth( ) Box::SetHeigth() fueron heredadas. Esta uniformidad de expresión es una carácteristica formidable de C++. La carácteristica de polimorfismo de la POO permite que las instancias de diferentes clases reaccionen de una forma particular al llamado de una función. Por ejemplo, en una jerarquia de formas graficas (punto, linea, cuadro,rectangulo, etc.), cada forma tiene una función >Draw responsable de contestar adecuadamente a peticiones del trazo de esa forma. El polimorfismo permite que las instancias de diferentes clases respondan a la misma función en forma adecuada para cada clase. El ejemplo anterior de los clientes se podría forzar que toda subclase de clente tuviera una operación (servico o método) de calculo_descuento, definiendo una operación diferida o (virtual) en la clase abstacta cliente. Es decir, que cliente pasa a ser una especie de plantilla de todos los clientes donde hay algunas cosas definidas (nombre, DNI) y otras pendientes a definir en cada subclase (calculo_descuento). En caso de que esto suceda, podriamos garantizar que todo cliente tendría una operación de calcular descuentos asociados sea el tipo de cliente que sea. Si nos encontramos en esta situación estaremos en disposición de usar lo que se llama polimorfismo, que significa que muchos programas se hacen extensibles a nuevos tipos sin necesidad de recompilarlos. El origen del termino polimorfismo es simple: ya que describe la capacidad de codigo de C++ de comportarse de diferentes maneras dependiendo de situaciones que se presenten al momento de la ejecución. Este comportamiento a menudo escapa del control directo del programador. El polimorfismo no es tanto una carácteristica de objetos como lo es de funciones miembro de una clase. Se implanta a traves de la arquitectura de clases; sin embargo, solo las funciones miembro de la clase puede ser polimorficas, y no la clase completa Considere una serie de clases que se emplean para implantar una base de datos que lleve el registro de obras maestras de arte. Las clases están organizadas en una jerarquía, con la intensión de permitir al programador tener acceso a cualquier objeto de la base de datos sin que sepa de que tipo de objeto se trata Cualquier carácteristica común en la base de datos pertenece al nodo más alto posible del árbol. Todos y cada uno de los nodos de la base de datos tiene un autor y una fecha. Otra información puede variar entre clases, como el método que se emplea para desplegar información acerca de un objeto. Esta función de presentación es un candidato para el polimorfismo y se implanta con el mecanismo de las funciones virtuales. Ejemplo: Invocación deliverada de una función virtual pura. class a { public: virtual void printOn( ) =0; }; //una función virtual void main( ) { A*b; a-> printOn( ); } //aqui hay graves problemas.. La llamada a la función main( )es declarada por el sistema durante la ejecución, produciendo el mensaje de error. Anormal program termination (Terminación anormal del programa) El mensaje es más bien genérico, pero otros compiladores de C++ son aun menos elegantes en el manejo de este tipo de errores durante la ejecución y puede hechar a perder todo. EVALUACION unidad ii Una abstracción de datos de cualquier lenguaje de programación, es la capacidad de crear tipos de datos definidos por el usuario. La abstacción se define como la <<extracción de propiedades esenciales de un concepto>>. Con la abstracción de datos, las estructuras de datos e ítems se pueden utilizar sin preocuparse sobre los detalles exactos de la implementación. La abstacción de datos permite no preocuparse de los detalles no esenciales. La abstacción de datos existe en casi todos los lenguajes de programación. Las estructuras de datos y tipos de datos son un ejemplo de abstacción. Los procedimientos y las funciones son otro ejemplo. Sin embargo, solo recientemente han emergido lenguajes que soportan sus propios tipos abstactos de datos TAD (Tipos de datos abstactos), como Pascal, Ada, Modula-2 y naturalmente C++. En C++ TAD (Tipos de datos abstactos), es posible incluir en el, ademas de los datos, funciones que manipulan a esos datos. TADs se pueden implementar C++, con los tipos de estructura (struct) y clase (class). En C++ un tipo de dato definido por el usuario se declara con una estructura: struct fecha { int dia; int mes; int anyo; }; Esta estructura tiene tres miembros día, mes y anyo, a veces esta definición se sitúa an un archivo de cabecera y se incluye al principio de todos los programas que utiliza la estructura. Se desea declarar una variable que tenga el formato de la estructura, y se hace de la siguiente manera: fecha hoy; //declara una variable estructurada Una clase es un tipo especial de datos, y esta orientado a creación de objetos y que consta de unos miembros que pueden ser todas o funciones privadas o publicas. Una clase es un tipo de dato que contiene uno o más elementos llamados dato miembro, y cero, una o más funciones que manipulan esos datos (llamados función miembro). Una clase se puede definir con una estructura (struct), una unión (unión) o una clase (class). La sintaxis de una clase es: class nombre_clase { miembro_1; //lista de miembros miembro_2 miembro_3 funcion_miembro_1( ); // funciones miembro conocidas funcion_miembro_2 ( ); // funciones como métodos Para usar una clase, primero tiene que declarala, como se hace en el caso de las estructuras. La declaración de una clase puede aparecer sólo una vez en un programa, tal y como las estructuras. Esta es una declaración de una clase simple: class counter { long count; public: void SetCount(long); long GetValue( ); }; La palabra clave class introduce una declaración de clase. Después aparece el nombre de la clase. El cuerpo de una clase debe de encerrarse en corchetes, seguido de un punto y coma. Las clases contienen no sólo declaraciones de funciones, sino también definiciónes de funciones completas. Las funciones contenidas en clases pueden ser tan largas y complejas como uno desee que lo sean. Se considera que las variables declaradas dentro de una clase pertenecen a esa clase. En ciertas circunstancias, las variables pueden compartirse entre las diferentes instancias de una clase. Existe garantía de que los identificadores de variables y funciones contenidos en una clase no chocan con los identificadores que se usan en otras. Básicamente una clase es un mundo con identificadores propios únicos. CUERPO DE UNA CLASE La variable count se define dentro del cuerpo de la clase. Por lo tanto, count recibe el nombre de variable miembro de la clase. Cualquier variable definida en una clase tiene campo de acción. El campo de acción de la clase no esta disponible es decir que este punto de declaración de una variable final de la declaración de la clase. Es un error intentar el accceso a una variable miembro después de la declaración de la clase, como se puede apreciar en el código siguiente: class counter { long count; public: count = 3; //error: count no esta definida aqui. USO DE UNA CLASE Para usar una clase se debe definir un objeto con ella. Las variables de una clase se definen tan solo como variables de tipo estructura o variables escalares. Para definir la variable de la clase people de tipo counter, se utiliza esta notación: Counter people Las variables instanciadas a partir de clases son los objetos. En general, es imposible usar una clase directamente. Las contadas excepciones a este regla se ilustran más adelante. Para el objeto people, esta es la forma en que lo podría utilizar un programa: Void main ( ) { counter people; //inicialice el objeto people.SetValue(0); // verifique que se borre long value = people.GetValue( ); } EVALUACION