🎧 New: AI-Generated Podcasts Turn your study notes into engaging audio conversations. Learn more

NOTAS APOYO POO TEMA 1 ENERO2022.docx

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Full Transcript

### Introducción El tema 1 **"Introducción al paradigma de la programación orientada a objeto**s" tiene como objetivo principal explicar los elementos básicos de la programación orientada a objetos (POO). Concretamente, veremos qué es una clase y cuáles son los miembros de una clase --los atributos...

### Introducción El tema 1 **"Introducción al paradigma de la programación orientada a objeto**s" tiene como objetivo principal explicar los elementos básicos de la programación orientada a objetos (POO). Concretamente, veremos qué es una clase y cuáles son los miembros de una clase --los atributos y métodos--, qué es un objeto, qué significa instanciar, qué son el estado y el comportamiento de un objeto, y qué es un mensaje. Dentro de este módulo explicaremos, mediante diferentes ejemplos, cómo estos elementos se relacionan con el mundo real haciendo así más sencillo y natural el diseño de aplicaciones. Simultáneamente se introducirá el lenguaje de modelado de sistemas de software, UML (*Unified Modeling Language*). Concretamente, utilizaremos UML para representar gráficamente una clase de manera formal (Diagrama de clase). **Competencia:** La Competencia especifica es comprender, describir y modelar los conceptos principales del paradigma de programación orientado a objetos y aplicarlos a situaciones de la vida real Concretamente: 1. 2. 3. 4. 5. ### 1.Definiendo los conceptos *objeto* y *clase* #### 1.1. El objeto es el elemento principal de la programación orientada a objetos y alrededor del cual gira este paradigma, de ahí el nombre. En este punto lo más lógico sería preguntarse:  ***¿*Qué es un «objeto»?,** **¿Qué se entiende por «objeto» en la POO?** Para responder a estas preguntas lo haremos de manera formal e informal. La formal nos lleva a la siguiente definición. Un objeto en POO representa alguna entidad de la vida real, es decir, alguno de los objetos únicos que pertenecen al problema con el que nos estamos enfrentando, y con el que podemos interactuar. Cada objeto, de igual modo que la entidad de la vida real a la que representa, tiene: - **Un estado** (es decir, unos atributos con unos valores concretos) y - **Un comportamiento** (es decir, tiene funcionalidades o sabe hacer unas acciones concretas). Informalmente, podemos decir que un objeto es cualquier elemento único del mundo real con el que se pueda interactuar. #### 1.2 ¿Qué es una clase? El concepto *clase* está íntimamente relacionado con el concepto *objeto*. Podemos definir informalmente una clase como una plantilla (o esqueleto o plano) a partir de la cual se crean los objetos. Por ejemplo, en el mundo hay millones de televisores de la misma marca y modelo. Cada uno de esos televisores ha sido montado a partir de un mismo plano/esqueleto/plantilla y, consecuentemente, todos ellos tienen los mismos componentes, conexiones y funcionalidades. Ese plano/esqueleto/plantilla es, en términos de programación orientada a objetos, una clase. Por consiguiente, una clase describe las características y el comportamiento de un conjunto de objetos similares en un contexto determinado. #### 1.3. Relación entre la clase y los objetos En este punto tiene que quedar claro que, cuando hablamos de objeto, hacemos referencia a una estructura que hay en un momento determinado de la ejecución del programa, mientras que cuando hablamos de clase hacemos referencia a una estructura que representa a un conjunto de objetos. Esto implica que: El tipo de un objeto, en vez de ser de un tipo básico (por ejemplo, int, char, float, etc.), es una clase concreta definida por el programador (TIPO DE DATO ABSTRACTO / TIPO DE DATO DEFINIDO POR EL PROGRAMADOR). Ejemplo: Si estamos en una reunión familiar, cada **persona** de la familia es única y se puede interactuar con ella. Es decir, cada **persona** de esa reunión es un **objeto**. Así pues, *Marina*, su madre *Elena* y su padre *David* son, cada uno de ellos, objetos. Es más, si el bisabuelo y el abuelo paternos de *Marina* se llaman ambos *Manuel*, cada uno de ellos es un objeto diferente, puesto que, si bien se llaman igual, no son la misma persona (es decir, el mismo objeto). El bisabuelo y el abuelo, así como el resto de integrantes de la familia, son elementos con los que se puede interactuar de manera individual. Eso sí**, todas los miembros de la familia son del mismo tipo *Persona* (que es la clase a la que pertenecen).** Qué significa soñar con Familia? Así pues, si tenemos la clase Persona, en ella están representadas las propiedades que caracterizan a una persona (entidad del mundo real), mientras que los diferentes objetos (por ejemplo, Elena, Marina y David) representan a personas concretas. La siguiente clase llamada Persona agrupa las características comentadas en la clase: **public** **class** Persona { //Persona TDA= [tipo] [de] [dato] [definido] [por] el [usuario] / [Tipo] [de] [dato] [Abstracto] // [características] [esenciales]= [atributos]= [dato] [miembro] // [ambito] [tipo] [de] [dato] [identificador] **private** String [nomPer]; **private** String [apePer]; **private** **byte** [edadPer]; **private** **char** [gnePer]; **private** String [tiposanPer]; } Finalmente, veamos dos ejemplos que deberían servir para acabar de entender qué es un objeto y una clase, así como la relación entre los dos. Otro Ejemplo: Cuando vamos a una tienda de electrodomésticos a comprar un televisor, lo más probable es que nos encontremos no con una tele, sino con más de una. Cada uno de esos televisores es un objeto, aunque pertenezcan a la misma marca y al mismo modelo. ![](media/image2.png) Pensemos que dos televisores del mismo modelo, aunque aparentemente parezcan idénticos, no tienen por qué ser iguales. Simplemente hay que pensar que uno puede estar encendido --porque está en el aparador-- y el otro apagado porque está dentro del embalaje. Es decir, tienen estados diferentes. Es más, aunque ambos estén apagados y, por consiguiente, tengan el mismo estado, ¡puedes tocarlos y ver que son dos objetos diferentes! Eso sí, ambos televisores pertenecen a la clase Televisor. Lo mismo ocurre con la clase Televisor y con los objetos miTelevisor, tuTelevisor, elTelevisorDelVecino, etc. Por un lado, la clase Televisor representa el concepto abstracto de televisor (es decir, las características y acciones comunes de los televisores), mientras que los tres objetos declarados --miTelevisor, tuTelevisor y elTelevisorDelVecino-- son televisores concretos. #### #### 2.2. Miembros de una clase Como hemos visto, una clase está formada por unas variables y unas funciones. Estrictamente hablando en términos de POO, a las variables se les llama **atributos** y a las funciones se les llama **métodos**. A su vez, al binomio formado por los atributos y los métodos se le denomina **miembros de una clase**. Así pues, tanto un atributo como un método son miembros de la clase. ##### 2.2.1. Atributos Los atributos, también llamados campos, son variables que codifican el estado de un objeto. Si tenemos la clase *Persona* con los atributos: **private** String [nomPer]; **private** String [apePer]; **private** **byte** [edadPer]; **private** **char** [gnePer]; **private** String [tiposanPer]; Cada objeto que se defina del tipo *Persona* tendrá estos atributos. **El [estado] de cada objeto *Persona* [dependerá de los valores que se les asigne a estos atributos], tal como se ve en la figura siguiente**. **EstadoObjeto1 (tío) Estado Objeto2(Abuelo)** **Como podemos ver en la clase Persona, cada objeto *Persona* tiene estados diferentes, es decir, valores distintos para cada atributo.** **Aunque dos objetos compartan el mismo estado --es decir, mismos valores para todos sus atributos--, estos dos objetos son diferentes. Solo hay que pensar que puede haber dos personas llamadas *Carlos* de edad *45* años en el mundo y, obviamente, son personas (u objetos) diferentes en algunos de sus estados.** ##### 2.2.2. Métodos Los métodos implementan el comportamiento de un objeto o, dicho de otro modo, las funcionalidades que un objeto es capaz de realizar. Haciendo una analogía con la programación estructurada, los métodos serían como funciones (devuelvan algo o no). De ahí que un método, además de por el nombre, se caracteriza por los argumentos (o también llamados parámetros) de entrada que recibe y por el valor de retorno que resulta de ejecutar el comportamiento que implementa. La descripción de estos elementos se conoce como **firma del método o signatura del método**. En pseudocódigo sería: ##### 2.3.1. Constructor El constructor se llama de forma automática cuando se crea un objeto para situarlo en memoria e inicializar los atributos declarados en la clase. En la mayoría de lenguajes, el constructor tiene las siguientes características: **1)** Normalmente, el nombre del constructor es el mismo que el de la clase. **2)** El constructor no tiene tipo de retorno, ni siquiera *void*. **3)** Puede recibir parámetros (o también llamados argumentos) con el fin de inicializar los atributos de la clase para el objeto que se está creando en ese momento. **4)** En general suele ser público, pero algunos lenguajes permiten que sea privado. En el lenguaje java permiten crear más de un constructor, en estos casos, al constructor sin parámetros/argumentos se le suele llamar **constructor por defecto o predeterminado o vacío**, mientras que aquellos que tienen parámetros se les llama **constructores con argumentos o constructor parametrizado**. Como se puede apreciar, decir «constructor por defecto» y «con argumentos» es lo mismo que decir que se hace una sobrecarga del constructor. Debido a la sobrecarga, la única limitación cuando se quiere (y se puede) crear más de un constructor es que no pueden declararse varios constructores con el mismo número y el mismo tipo de argumentos. ##### 2.3.2. Destructor El destructor es el método que sirve para eliminar un objeto concreto definitivamente de memoria. Hay que tener en cuenta que: **1)** No todos los lenguajes necesitan implementar un método destructor, este es el caso de Java **2)** Por norma general, una clase tiene un solo destructor. **3)** No recibe parámetros. En Java, se usa el método especial *finalize()* que no devuelve nada (en este caso, sí tiene tipo de retorno, concretamente *void*). El compilador de Java no obliga a implementar el método *finalize()*. Así pues, solo se debe codificar si realmente es necesario. #### 3.1. Instancia Como ya hemos comentado, los objetos son ejemplares de una clase. Así pues, a la hora de crear un objeto, debemos seguir los siguientes pasos: **1)** Declarar el objeto. 1. **2)** Instanciar el objeto (crear un objeto a partir de una clase). 1. Para instanciar/crear un objeto nuevo debemos escribir la palabra *new* seguida de uno de los constructores de la clase. En este caso, hemos usado uno de los dos constructores con argumentos, pero también podríamos haber usado el constructor por defecto. **3)** En este momento ya tenemos el objeto *persona1* del tipo *Persona* creado en memoria. Así pues, ya podemos acceder a sus atributos y métodos. Los pasos 1 y 2 se pueden agrupar en un único paso: 1. Debido a que la acción de crear un objeto a partir de una clase se le llama *instanciar*, muchas veces a los objetos se les llama *instancia*. Así pues, *persona1* es una instancia o un objeto de *Persona*. #### 3.2. Estado y comportamiento Como hemos leído en la definición formal de **objeto**, todo objeto en la POO tiene un estado y un comportamiento. Esto es así porque los objetos (o entidades) de la vida real comparten estas dos características. Debemos entender que el **estado** de un objeto viene definido por los valores que toman en un instante determinado los atributos que definen ese objeto. Por su parte, el **comportamiento** del objeto se puede entender como las funcionalidades que ese objeto es capaz de realizar. Estas funcionalidades que definen el comportamiento de un objeto las define la clase a la que pertenece dicho objeto mediante los métodos de la clase. Veamos varios ejemplos para entender mejor estos dos conceptos y ver cómo cualquier entidad (u objeto) de la vida real tiene un estado y un comportamiento: - - - - - - Así pues, si un televisor concreto (el objeto) tiene el atributo *canal actual* igual a 5, ese televisor está en un estado diferente a si tuviera el *canal actual* igual al número 6. Si nos fijamos en los ejemplos anteriores, nos daremos cuenta de que hay dos tipos de métodos: **1)** Aquellos que hacen acciones que realiza la entidad real (por ejemplo, ladrar en el caso del perro, calcular el área de un rectángulo, la acción de encenderse de un televisor, etc.). **2)** Aquellos que operan directamente sobre los atributos del objeto. Por un lado, están los métodos que modifican el valor de los atributos del objeto (por ejemplo, modificar el número de teléfono de un contacto o el canal actual de un televisor) y que, por consiguiente, cambian el estado del objeto. Por otro lado, están los métodos que consultan el valor de los atributos del objeto (por ejemplo, consultar el número de teléfono de un contacto o el canal actual de un televisor). Estos métodos de modificación y consulta son llamados ***setter*** y ***getter***, respectivamente. #### 3.3. Mensaje Cuando los objetos quieren interactuar entre ellos utilizan **mensajes**. Un mensaje es la manera que existe de acceder a los atributos y métodos de un objeto. La forma de un mensaje, en la mayoría de lenguajes, sigue la siguiente sintaxis: **variable\_del\_objeto.miembro;** donde *miembro* es un atributo o un método de la clase. #### #### #### 3.4. Viendo el mundo de otra forma Es hora de hacer un descanso y detenernos un momento para reflexionar. Da igual dónde estés, aparta la mirada de esta página y mira a tu alrededor, ¡pero vuelve, que tienes que seguir leyendo! ¿Qué ves? Quizás respondas: *cosas*. Bueno, no está mal, pero intentemos usar una palabra más rica. Digamos: *entidades*. No está mal, pero ¿qué tal si buscamos una palabra que no sea ni tan vulgar ni tan culta y que, además, haya aparecido en estos apuntes? ¿Qué tal si decimos que lo que ves a tu alrededor son *objetos*? A partir de este momento, ya no mirarás el mundo que te rodea de igual manera. Ahora deberías estar viendo *objetos* --incluidos los seres vivos-- que interactúan entre ellos. Pongamos que estás en el lugar donde estudias o, mejor, en el sofá del comedor (el estudio no es incompatible con la comodidad). Seguramente verás objetos muy diferentes, unos más simples y otros más complejos. Por ejemplo, la lámpara que tienes al lado seguramente solo tiene dos estados (encendido y apagado) y dos comportamientos (encender y apagar). Otros, en cambio, como el televisor, tienen más estados y comportamientos. Es más, un objeto puede ser tan complejo que puede incluso estar formado/compuesto por otros objetos. Sin ir más lejos, un televisor tiene un mando a distancia, que es otro objeto. O, si no lo ves claro, un coche tiene un volante, cuatro ruedas, etc. y cada uno de ellos es un objeto (cada rueda es un objeto independiente). O, para verlo aún más claro, un teléfono inteligente es un objeto que dentro tiene una lista de apps, donde cada app es un objeto. Quizás en este momento has levantado la mirada y te has dado cuenta de que, en tu cuarto, hay una lámpara en el techo además de la lámpara fluorescente que hay encima de tu mesa. ¡Ostras, dos objetos «lámpara»! Hum Mmmm\..., tienen características y comportamientos similares. ¡Ambos objetos son del tipo Lámpara! O mejor, ¡ambos objetos son de la clase Lámpara! Tras leer sobre el paradigma de programación orientada a objetos (POO), tu forma de mirar el mundo debería haber cambiado. Si no lo ha hecho todavía, tranquilo/a, que cuando empieces a programar siguiendo la POO, este *clic mental* lo harás irremediablemente. ### ### ### ### Bibliografía **Booch, G.; Jacobson, I.; Rumbaugh, J.** (1999). *El lenguaje de modelado unificado UML*. Madrid: Addison-Wesley Iberoamericana. **Joyanes, L.** (1998). *Programación orientada a objetos*. Madrid: McGraw-Hill. **Meyer, B.** (1997). *Object-oriented software construction*. Santa Bárbara: Prentice Hall. **Rumbaugh, J.; Blaha, M.; Premernali, W.; Eddy, F.; Lorensen, W.** (1996). *Modelado y diseño orientado a objetos*. Madrid: Prentice Hall. **Sommerville, I.** (2005). *Ingeniería del software*. Madrid: Pearson-Addison Wesley.

Use Quizgecko on...
Browser
Browser