2014
AUTORA: Evelyn Simba
DOCENTE: Ing. Andrés Morales Ambato-Ecuador 2014-2015
En este breve documento describiremos el paradigma de programación que usa los objetos en sus interacciones, para diseñar aplicaciones y programas informáticos.
La03-PC09 INTRODUCCION A LA PROGRAMACION ORIENTADA A OBJETOS 22/11/2014
Tabla de Contenidos Tabla de Contenidos ............................................................................................................................ 1 Introducción ........................................................................................................................................... 2 Desarrollo................................................................................................................................................ 3 ¿Qué es la Poo?.......................................................................................................................................3 Fundamentos……………………………………………………………………………………………...…4 ¿QUÉ ES UN OBJETO?.........................................................................................................................5 ¿QUÉ ES UNA CLASE?..........................................................................................................................6 Clases en POO…………………………………………………………………………………………………8 Subclases……………………………………………………………………………………………………….10 Herencia…………………………………………………………………………………………………………12 Características asociadas al POO………………………………………………………………...........13 Lenguajes de Programación Orientado a Objetos………………………………………….......15 Análisis y diseño Orientado a objetos………………………………………………………………16 Conclusión……………………………………………………………………………………………………….17 Bibliografía………………………………………………………………………………………………………18
1
Introducción
En el universo de la programación actual, es de amplio consenso que la programación orientada a objetos es el mejor paradigma disponible para enfrentar las cada vez más complejas tareas de la programación. Sin embargo, no todos los programadores tienen claro los fundamentos de este paradigma, y tienden a confundir la programación usando objetos con la programación orientada a objetos. Es importante aclarar desde un principio la diferencia que existe entre programación orientada a objetos y un lenguaje orientado a objetos. La programación orientada a objetos es una “filosofía”, un modelo de programación, con su teoría y su metodología, que conviene conocer y estudiar antes de nada. Un lenguaje orientado a objetos es un lenguaje de programación que permite el diseño de aplicaciones orientadas a objetos. Dicho esto, lo normal es que toda persona que vaya a desarrollar aplicaciones orientadas a objetos aprenda primero la “filosofía” (o adquiera la forma de pensar) y después el lenguaje, porque “filosofía” sólo hay una y lenguajes muchos. En este documento veremos brevemente los conceptos básicos de la programación orientada a objetos desde un punto de vista global, sin particularizar para ningún lenguaje de programación específico.
2
Desarrollo ¿Qué es la POO? “Un método de implementación en el que los programas se organizan como colecciones cooperativas de objetos, cada una de las cuales representan una instancia de alguna clase, y cuyas clases son todas miembros de una jerarquía de clases unidas mediante relaciones de herencia” Booch. La POO es un paradigma de la programación de computadores; esto hace referencia al conjunto de teorías, estándares, modelos y métodos que permiten organizar el conocimiento, proporcionando un medio bien definido para visualizar el dominio del problema e implementar en un lenguaje de programación la solución a ese problema. Anterior al paradigma de objetos, está el paradigma algorítmico o de procesos, el cual se fundamenta en los procesos o funciones que se llevan a cabo en el mundo real dentro del dominio del problema analizado. Se refiere a lo que entra, como lo maneja el proceso, y lo que sale del proceso. La programación tradicional la sustentan los procesos, algoritmos, bloques de construcción modulares cuya abstracción va de lo general a lo particular, mientras que en la POO tiene como marco de referencia conceptual el objeto, el cual pertenece a una clase que agrupa a todos compañeros con las mismas características y un comportamiento similar. Una ventaja de la POO frente al paradigma algorítmico es la facilidad que brinda a través de sus herramientas, de concebir, analizar, modelar, diseñar e implementar el mundo real de manera fiel a como se presenta en la realidad; el paso que hay desde la concepción y asimilación del problema hasta la implementación del mismo es un proceso que se hace de manera casi natural. Esto porque el mundo está lleno de objetos reales, los cuales se puede representar como tales en una solución computarizada. Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir nuestros programas en términos de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base que permita soltarnos un poco con este tipo de programación. La POO no es difícil, pero es una manera especial de pensar, a veces subjetiva de quien la programa, de manera que la forma de hacer las cosas puede ser diferente según el programador. Aunque podamos hacer los programas de formas distintas, no todas ellas son correctas, lo difícil no es programar orientado a objetos sino programar bien. Programar bien es importante porque así nos podemos aprovechar de todas las ventajas de la POO.
3
Objeto: Componente o código de software que contiene en sí mismo tanto sus características como sus comportamientos se accede a través de su interfaz o signatura.
Fundamentos
Campo: Es una característica de un objeto, que ayuda a definir su estructura y permite diferenciarlo de otros objetos. Se define con un identificador y un tipo, el cual indica los valores que puede almacenar
Método: Es la implementación de un algoritmo que representa una operación o función que un objeto realiza. El conjunto de los métodos de un objeto determinan el comportamiento del objeto.
4
¿QUÉ ES UN OBJETO? Un objeto no es más que un conjunto de variables (o datos) y métodos (o funciones) relacionados entre sí. Los objetos en programación se usan para modelar objetos o entidades del mundo real (el objeto hijo, madre, o farmacéutica, por ejemplo). Un objeto es, por tanto, 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. La siguiente figura muestra una representación visual de un objeto.
Modularidad Proceso de crear partes de un todo que se integran perfectamente entre sí para que funcionen por un objetivo general, y a las cuales se les pueden agregar más componentes que se acoplen perfectamente al todo, o extraerle componentes sin afectar su funcionamiento. En el caso que se requiera actualizar un módulo, no hay necesidad de hacer cambios en otras partes del todo. Un ejemplo clásico es un conjunto de módulos que, al integrarlos conforman un armario, el cual puede agregarle más funcionalidad si se le agregan más módulos, o al contrario. También se puede cambiar su finalidad si se acomodan esos módulos para darle otro objetivo: volverlo una mesa. Esto ayuda a la descomposición de problemas en subproblemas, es decir, a la solución de problemas por composición de soluciones a subproblemas.
Reutilización Capacidad de usar un mismo código para varias implementaciones o necesidades (desarrollos); para esto se debe tener en cuenta: Polimorfismo: Esta propiedad indica que un elemento puede tomar distintas formas. Podemos definirlo como el uso de varios tipos en un mismo componente o función. Por ejemplo, una función que sume dos operandos, la cual maneja, o dos números o
5
dos cadenas, para retornar un total de una suma o de una concatenación. También se denomina subsumption (más delante de detalla este concepto). Genericidad: Usar algoritmos genéricos para resolver varias situaciones, como acceso a varios motores de bases de datos de forma transparente, como el PEAR de PHP. Consiste en parametrizar una función con varios tipos de datos donde ella misma en su cuerpo decida cómo operar, como la ut0110.4gl. Operaciones Relacionadas: Todas las operaciones de un módulo deben estar dentro de él, como parte de su cuerpo ... Caja negra: Saber qué entra y qué sale (la interfaz del módulo: signatura) y no cómo lo hace (su implementación), como la co0020.4gl. Sobrecarga: Modalidad de herencia que permite usar el mismo módulo para diferentes implementaciones de una operación, es decir, usando diferente signatura: una función que pueda recibir un parámetro, o dos, o ninguno; pero opera correctamente con cualquiera de ellos con que se lo invoque, está sobrecargada; por ejemplo, la función saludar(), cuando va sin parámetros retorna la cadena “Hola”, cuando se invoque con un nombre, (saludar(var_nombre)), retorna “Hola $var_nombre”, y así sucesivamente. Esto debe manejarse por código dentro de la función.
Visión POO La visión POO se basa en la siguiente analogía: Construcción de un modelo mecánico de un sistema físico a partir de objetos concretos. Los objetos aquí serían, en un modelo de una pista de carreras: los autos, las carreteras, las llegadas, las graderías, espectadores, etc. En un modelo de un sistema planetario, tenemos los objetos concretos: los planetas, los órbitas, el sol, la energía, etc. Construcción de un modelo algorítmico de un sistema físico a partir de objetos de software. Los objetos aquí serían: rutinas de conexión a DB, shorts, validación de acceso, despliegue, impresiones, etc.
¿QUÉ ES UNA CLASE? Normalmente en el mundo real existen varios objetos de un mismo tipo, o como diremos enseguida, de una misma clase. Por ejemplo, mi bicicleta es una de las muchas bicicletas que existen en el mundo. Usando la terminología de la programación orientada a objetos, diremos que mi bicicleta es una instancia de la clase de objetos conocida como bicicletas. Todas las bicicletas tienen algunos estados o atributos (color, marcha actual, cadencia actual, dos ruedas) y algunos métodos (cambiar de marcha, frenar) en común. Sin embargo, el estado particular de cada bicicleta es independiente del estado de las demás bicicletas. La particularización de estos atributos puede ser diferente. Es decir, una bicicleta podrá ser azul, y otra roja, pero ambas tienen en común el hecho de tener una variable “color”. De este modo podemos definir una plantilla de variables y métodos para todas las bicicletas. Las plantillas para crear objetos son denominadas clases. Una clase es una plantilla que define las variables y los métodos que son comunes para todos los objetos de un cierto tipo.
6
En nuestro ejemplo, la clase bicicleta definiría variables miembro común a todas las Bicicletas, como la marcha actual, la cadencia actual, etc. Esta clase también debe declarar e implementar los métodos o función miembro que permiten al ciclista cambiar de marcha, frenar, y cambiar la cadencia de pedaleo, como se muestra en la siguiente figura:
Después de haber creado la clase bicicleta, podemos crear cualquier número de objetos bicicleta a partir de la clase. Cuando creamos una instancia de una clase, el sistema reserva suficiente memoria para el objeto con todas sus variables miembro. Cada instancia tiene su propia copia de las variables miembro definidas en la clase.
7
Clases en POO Las clases son declaraciones de objetos, también se podrían definir como abstracciones de objetos. Esto quiere decir que la definición de un objeto es la clase. Cuando programamos un objeto y definimos sus características y funcionalidades en realidad lo que estamos haciendo es programar una clase. En los ejemplos anteriores en realidad hablábamos de las clases coche o fracción porque sólo estuvimos definiendo, aunque por encima, sus formas.
Propiedades en clases Son las características de los objetos. Cuando definimos una propiedad normalmente especificamos su nombre y su tipo. Nos podemos hacer a la idea de que las propiedades son algo así como variables donde almacenamos datos relacionados con los objetos.
Métodos en las clases Son las funcionalidades asociadas a los objetos. Cuando estamos programando las clases las llamamos métodos. Los métodos son como funciones que están asociadas a un objeto.
8
En el mundo real, normalmente tenemos muchos objetos del mismo tipo. Por ejemplo, nuestro teléfono celular es sólo uno de los miles que hay en el mundo. Si hablamos en términos de la programación orientada a objetos, podemos decir que nuestro objeto celular es una instancia de una clase conocida como "celular". Los celulares tienen características (marca, modelo, sistema operativo, pantalla, teclado, etc.) y comportamientos (hacer y recibir llamadas, enviar mensajes multimedia, transmisión de datos, etc.).
Cuando se fabrican los celulares, los fabricantes aprovechan el hecho de que los celulares comparten esas características comunes y construyen modelos o plantillas comunes, para que a partir de esas se puedan crear muchos equipos celulares del mismo modelo. A ese modelo o plantilla le llamamos CLASE, y a los equipos que sacamos a partir de ella la llamamos OBJETOS.
Esto mismo se aplica a los objetos de software, se puede tener muchos objetos del mismo tipo y mismas características. Por otro lado, una instancia de una clase es otra forma de llamar a un objeto. En realidad no existe diferencia entre un objeto y una instancia. Sólo que el objeto es un término más general, pero los objetos y las instancias son ambas representación de una clase.
9
Subclases Es la descripción de una clase basada en la estructura de otra clase, la cual se denomina superclase. Se puede mirar como una extensión de la superclase, donde se pueden tomar las características de la superclase, y adicionarle nuevas características. Este concepto suele confundirse con el concepto de herencia, pero no siempre puede decirse que una subclase es una herencia, ya que ésta puede redefinir (override) todo lo de su superclase, luego no heredaría nada. En la herencia se reciben las definiciones de la superclase y se usan conjuntamente con nuevas definiciones; heredar es compartir atributos entre una clase y sus subclases; si no comparte, no hay herencia.
Ejemplo:
// Definición de la subclase recell SubClass reCell of Cell is var backup:integer:=0; override set (n:integer) is self.backup:=self.contents; super.set(n); end; method restore() is Self.contents:=self.backup; end; end; // Creación de objetos tipo reCell: objRecell1 new reCell; objRecell2 new reCell;
Con self tenemos acceso a los atributos de la clase desde su interior; para acceder a los atributos de la clase padre, se usa super. La subclase es un mecanismo para evitar reescribir las definiciones de una clase que queremos usar en esa subclase. De acuerdo a esto tenemos que una subclase es mayor (o igual) que la superclase, ya que la subclase contiene todo lo que tenga su superclase y aún más. Por esto, se dice que una subclase es una especialización de la superclase; de forma análoga, una superclase es una generalización de una subclase (más pequeño es más específico, más grande es más general). Sea c una superclase y c’ una subclase suya, se cumple: Si c’ <: c y o : c’ entonces o : c; Esto se lee: Si "c prima" es subclase de "c" y "o" es un objeto de “c prima”, entonces "o" también es un objeto de "c". Esta ley también aplica para los tipos de datos convencionales o primitivos, ya que como sabemos un real es más que un entero, lo que significa que un entero puede manejarse como real (pero al revés por que se truncarían los fracciones; habría coerción):
10
Real <: integer, lo que indica que un int se puede incluir entre los reales, osea que los reales son un subtipo de los integer ... Con esto se concluye que una subclase es lo mismo que un subtipo, y cuando se implementa un método que puede procesar transparentemente un valor, el cual puede ser real o integer, se dice que tiene la propiedad de polimorfismo o subsumption. Eso se logra por esa relación de clase/subclase y tipo/subtipo, ya que de otra forma fallaría, pues el método esperaría un dato exactamente del tipo con que se definió trabajar. O sea, que si yo soy del tipo A, y A es mayor que el tipo B, entonces yo también soy del tipo B, así: Si a : A y A <: B entonces a : B. En el caso de nuestro ejemplo, de la superclase Cell y la subclase reCell, se puede decir que un objeto de tipo reCell (obj1reCell) es del mismo tipo que un objeto Cell (obj1Cell), por lo tanto puedo usar una función para cualquiera de los dos objetos siempre que esta función acepte objetos del tipo reCell (donde cabrá también el tipo Cell) y no solamente del Cell (donde solo cabrá el Cell). La reutilización es la principal característica de la POO, la cual se logra mediante: Encapsulación de información: Ocultamiento de información, datos o funciones especiales a los usuarios. En el caso de la programación, el encapsulamiento es lo que permite que tanto la estructura (campos) como el comportamiento (métodos) se encuentren dentro del mismo cuerpo de código de la clase con la que se crean los objetos. Dentro de la clase se deben agrupar tanto la información o datos de los campos como las operaciones o métodos o funciones que operan sobre esta información. Herencia: Propiedad que permite a los objetos ser construidos a partir de otros; es recibir de un módulo superior sus características, tales como atributos o funciones (campos y métodos o comportamientos), para usarlos en el módulo actual. Heredar es compartir atributos. Sobreescritura ( override ): Posibilidad de heredar un método de un módulo y cambiarle el comportamiento en el heredero, con la opción de poder usar el original, si se desea. Métodos unidos a los objetos: los métodos de un objeto son inseparables y siempre formarán parte de su cuerpo, como un todo. Noción de self : unicidad de los objetos; son únicos y no se repiten, aunque sean de la misma clase. Así como se puede definir varias variables del tipo INT cada una de las cuales es única, se puede crear o instanciar varios objetos de una misma clase.
11
Herencia La herencia es uno de los conceptos más cruciales en la POO. La herencia básicamente consiste en que una clase puede heredar sus variables y métodos a varias subclases (la clase que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los atributos y métodos heredados de la superclase. De esta manera se crea una jerarquía de herencia. Por ejemplo, imaginemos que estamos haciendo el análisis de un Sistema para una tienda que vende y repara equipos celulares.
En el gráfico vemos 2 Clases más que posiblemente necesitemos para crear nuestro Sistema. Esas 2 Clases nuevas se construirán a partir de la Clase Celular existente. De esa forma utilizamos el comportamiento de la SuperClase. En general, podemos tener una gran jerarquía de Clases tal y como vemos en el siguiente gráfico:
12
Envío de Mensajes Un objeto es inútil si está aislado. El medio empleado para que un objeto interactúe con otro son los mensajes. Hablando en términos un poco más técnicos, los mensajes son invocaciones a los métodos de los objetos.
Características asociadas al POO Abstracción La abstracción consiste en captar las características esenciales de un objeto, así como su comportamiento. Por ejemplo, volvamos al ejemplo de los automóviles, ¿Qué características podemos abstraer de los automóviles? O lo que es lo mismo ¿Qué características semejantes tienen todos los automóviles? Todos tendrán una marca, un modelo, número de chasis, peso, llantas, puertas, ventanas, etc. Y en cuanto a su comportamiento todos los automóviles podrán acelerar, frenar, retroceder, etc. En los lenguajes de programación orientada a objetos, el concepto de Clase es la representación y el mecanismo por el cual se gestionan las abstracciones. Por ejemplo, en Java tenemos: public class Automovil { // variables // métodos }
13
Encapsulamiento El encapsulamiento consiste en unir en la Clase las características y comportamientos, esto es, las variables y métodos. Es tener todo esto es una sola entidad. En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstracción y el ocultamiento que veremos a continuación. La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesará será conocer qué hace la Clase pero no será necesario saber cómo lo hace.
Ocultamiento Es la capacidad de ocultar los detalles internos del comportamiento de una Clase y exponer sólo los detalles que sean necesarios para el resto del sistema. El ocultamiento permite 2 cosas: restringir y controlar el uso de la Clase. Restringir porque habrá cierto comportamiento privado de la Clase que no podrá ser accedido por otras Clases. Y controlar porque daremos ciertos mecanismos para modificar el estado de nuestra Clase y es en estos mecanismos dónde se validarán que algunas condiciones se cumplan. En Java el ocultamiento se logra usando las palabras reservadas: public, private y protected delante de las variables y métodos.
14
Lenguajes de Programación Orientado a Objetos En 1985, E. Stroustrup extendió el lenguaje de programación C a C++, es decir C con conceptos de clases y objetos, también por esas fechas se creo desde sus bases el lenguaje EIFFEL. En 1995 apareció el más reciente lenguaje OO, Java desarrollado por SUN, que hereda conceptos de C++. El lenguaje de desarrollo más extendido para aplicaciones Web, el PHP 5, trae todas las características necesarias para desarrollar software orientado a objetos. Además de otros lenguajes que fueron evolucionando, como el Pascal a Delphi. Finalmente también otros lenguajes script como el ActionScript que si bien no es totalmente orientado a objetos pero sí posee las características.
15
Análisis y diseño Orientado a Objetos Para el desarrollo de software orientado a objetos no basta usar un lenguaje orientado a objetos. También se necesitará realizar un análisis y diseño orientado a objetos. El modelamiento visual es la clave para realizar el análisis OO. Desde los inicios del desarrollo de software OO han existido diferentes metodologías para hacer esto del modelamiento, pero sin lugar a duda, el Lenguaje de Modelamiento Unificado (UML) puso fin a la guerra de metodologías. Según los mismos diseñadores del lenguaje UML, éste tiene como fin modelar cualquier tipo de sistemas (no solamente de software) usando los conceptos de la orientación a objetos. Y además, este lenguaje debe ser entendible para los humanos y máquinas. Actualmente en la industria del desarrollo de software tenemos al UML como un estándar para el modelamiento de sistemas OO. Fue la empresa Racional que creó estas definiciones y especificaciones del estándar UML, y lo abrió al mercado. La misma empresa creó uno de los programas más conocidos hoy en día para este fin; el Racional Rose, pero también existen otros programas como el Poseidon que trae licencias del tipo community edition que permiten su uso libremente. El UML consta de todos los elementos y diagramas que permiten modelar los sistemas en base al paradigma orientado a objetos. Los modelos orientados a objetos cuando se construyen en forma correcta, son fáciles de comunicar, cambiar, expandir, validar y verificar. Este modelamiento en UML es flexible al cambio y permite crear componentes plenamente reutilizables.
16
Conclusión Para entender cómo funciona el paradigma de la programación orientada a objetos es necesario ver un programa como una colección de objetos que interactúan entre sí enviándose mensajes y cambiando su estado durante la ejecución. Resolver un problema bajo el paradigma de la programación orientada a objetos implica determinar y caracterizar los diferentes objetos que intervienen en el problema, definir sus propiedades y métodos y ponerlos a interactuar. La programación orientada a objetos permite la optimización del código generado gracias a que mediante técnicas de herencia, atributos astáticos entre otros permiten, que el código sea genérico de manera que sea reutilizable. Mediante las técnicas aprendidas en el presente curso podemos establecer una solución primitiva de un problema real, tan solo con relacionarlo con objetos lógicos que serán usados para el desarrollo del software. Podemos dar a conocer de una forma sencilla los mecanismos que se usan en este nivel de programación, a personas que deseen una explicación rápida y sencilla de lo que es la programación orientada a objetos. Tenemos los conocimientos necesarios como para enfrentar un problema real y desarrollo en otro lenguaje de programación, pues concebimos la idea de que el lenguaje C es la base de la programación. Al trabajar con la programación orientada a objetos sea esta desarrollada en otras plataformas de programación o en lenguaje C, sabemos las formas de lograr un mejor rendimiento del equipo a controlar y aplicar soluciones sencillas, de manera que sea fácilmente digeribles para el usuario y/o destinatario del trabajo final. Igualmente, programar bajo este paradigma trae muchas ventajas, pues fomenta la reutilización y extensión de código, permite crear sistemas más complejos, relaciona el sistema con el mundo real, facilita la creación de programas agradables visualmente, facilita el trabajo en equipo, y principalmente facilita el mantenimiento del software
17
BibliografĂa http://msdn.microsoft.com/es-es/library/bb972232.aspx http://www.desarrolloweb.com/articulos/499.php http://es.slideshare.net/maicksitico/programacion-orientada-a-objetos-poo http://www.luis.izqui.org/resources/ProgOrientadaObjetos.pdf http://www.ciberaula.com/articulo/tecnologia_orientada_objetos/ http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos
18