[CURSO] Programación orientada a objetos

Iniciado por MonkeyBoy, Agosto 12, 2018, 09:42:36 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Agosto 12, 2018, 09:42:36 PM Ultima modificación: Septiembre 13, 2018, 04:31:08 PM por MonkeyBoy
Introducción al paradigma de objetos


*Aquí les voy a ir compartiendo conocimientos que fui adquiriendo mediante estudios y tambien gracias a este gran foro. De esta manera,con aproximadamente 10 capitulos por unidad iré compartiendo sobre POO con Java y desarrollo de software entre otras cosas.

Capitulo 1


Objetivos:


  • Comprender qué es un paradigma de programación.
    Describir las características básicas del paradigma de programación orientada a objetos.
    Conocer las características básicas de una clase y sus componentes.



¿Qué es un paradigma de programación?

En el módulo Técnicas de Programación te presentamos a la programación estructurada, en donde se definen funciones y procedimientos. En este módulo nos dedicaremos al estudio de la Programación Orientada a Objetos (POO).

Definición de Paradigma de programación

Podemos definir a un paradigma de programación como un enfoque particular o criterio para la creación de software.

Hay diferentes paradigmas de programación, que determinan distintos estilos de programación y diferentes formas de resolver un problema.

Para mostrar más claro los diferentes enfoques de los paradigmas, te presentamos un mismo ejemplo abordado desde ambos paradigmas.

Supongamos que tenemos que guardar el nombre y la edad de un alumno. Ingresamos todos los datos por teclado y luego mostramos el nombre si la persona es mayor de edad.

PARADIGMA ESTRUCTURADO


Código: text
[i]SEUDOCÓDIGO[/i]
TIPOS
T_REG_PERSONA = REGISTRO
        NOMBRE : CADENA
        EDAD : ENTERO
FINREGISTRO

VARIABLES
       ALUMNO : T_REG_PERSONA

INICIO
    ObtenerPersona (ALUMNO)
    Si EsMayor (ALUMNO) entonces
          Mostrar (GetNombre(ALUMNO), " es mayor de edad")
    Finsi
FIN

PROCEDIMIENTO ObtenerPersona (ref P : T_REG_PERSONA)

INICIO
    Mostrar ("Ingrese nombre")
    Ingresar (P.NOMBRE)
    Repetir
         Mostrar ("Ingrese edad")
         Ingresar (P.EDAD)
    Hasta que P.EDAD > 0
FINPROCEDIMIENTO

FUNCIÓN EsMayor (ref P : T_REG_PERSONA) : Boolean

VARIABLES
    ES : BOOLEAN

INICIO
    ES <- FALSO
    Si P.EDAD > 18 entonces
        ES <- VERDADERO
    Finsi
    Devolver ES
FINFUNCIÓN

FUNCIÓN GetNombre (ref P : T_REG_PERSONA) : Boolean

INICIO
     Devolver P.NOMBRE
FINFUNCIÓN


[u][b]PARADIGMA ORIENTADO A OBJETOS[/b][/u]

[i]SEUDOCÓDIGO[/i]
CLASE Persona

  Atributos
      NOMBRE : CADENA
      EDAD : ENTERO

  Métodos
      Obtener ()
      EsMayor():BOOLEAN
      GetNombre():CADENA

  Implementación
      PROCEDIMIENTO Obtener ()
      INICIO
          Mostrar ("Ingrese nombre")
          Ingresar (NOMBRE)
          Repetir
              Mostrar ("Ingrese edad")
              Ingresar (EDAD)
          Hasta que EDAD > 0
      FIN

      FUNCIÓN EsMayor (): Boolean
      VARIABLES
          ES : BOOLEAN
      INICIO
          ES <- FALSO
          Si EDAD > 18 entonces
             ES <- VERDADERO
          Finsi
          Devolver ES
      FINFUNCIÓN

     FUNCIÓN GetNombre (): Boolean
     INICIO
          Devolver NOMBRE
     FINFUNCIÓN
FINCLASE

INICIO

    Alumno = nuevo Persona()
    Alumno.obtener()
    Si Alumno.EsMayor() entonces
       Mostrar (Alumno.GetNombre(), " es mayor de edad")
    Finsi
FIN


Analicemos a continuación cada uno de los paradigmas.....

En la versión estructurada, se realiza la definición de los datos, por medio de un registro y sus campos. Luego, se definen funciones y procedimientos que reciben al registro como parámetro para poder realizar su tarea. Es decir, que se definen los datos y su comportamiento de manera separada. Es por eso que hay que enviar los datos por parámetro. Si alguna definición de datos cambia, deberemos cambiar las rutinas definidas en el programa.

En cambio, en la versión de Objetos, habrás notado que hay algo nuevo. Hay una clase que contiene atributos y métodos. Es decir que, en este mismo componente, en la clase, vamos a tener los datos y la forma en que se manipulan esos datos. Luego, en el programa principal, se crea un objeto en base a una clase. También habrás notado que no hay llamadas a rutinas, sino que hay invocaciones a los métodos definidos en la clase Persona utilizando el objeto ALUMNO. Es decir que creamos un Objeto a partir de una clase y luego usamos el objeto para llamar a los métodos. En el mismo objeto se encuentran los datos y sus comportamientos, de tal manera que, ante un cambio en los datos, no se deberá cambiar nada del programa principal, sino que los cambios deberán realizarse solamente en la clase.

A partir de estas deferencias, entonces veamos qué es el paradigma de la Programación Orientada a Objetos y luego las diferencias que hay con la programación estructurada.



La Programación Orientada a Objetos (POO u OOP según sus siglas en inglés) define los programas por medio de "clases de objetos". Los objetos, por lo tanto, son el elemento fundamental del programa, ya que son entidades que combinan:

Estado: Los datos de los programas.
Comportamiento: Las acciones que pueden hacer los objetos.
Identidad: Un objeto que lo diferencia de los demás objetos del programa.

Así, la programación orientada a objetos define un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Como consecuencia, los programas y módulos te serán más fáciles de escribir, mantener y reutilizar.

Veamos a continuación la definición de Objeto y de Clase.....


Objetos
Antes de ver la definición de objeto, te pedimos que te tomes un momento para observar los objetos que hay a tu alrededor, por ejemplo, una mesa, una silla, tu perro, cualquier elemento.

Podrás notar que a cada objeto se le puede asociar un conjunto de características, por ejemplo: color, peso, dimensiones, raza, etc. También, cada objeto tendrá un comportamiento: el perro ladra, camina, salta, etc. Así, cada objeto tendrá sus propias características y comportamiento.

Esta misma idea es la de Objetos en la POO.



Un Objeto es un elemento que posee características, denominadas atributos, y comportamientos, denominados métodos, que puede interactuar con otros objetos del sistema, enviando mensajes, y tiene asociado una identidad que lo distingue entre todos los objetos del sistema.


Clases
Volvamos a los casos de los objetos de la vida real y tomemos el ejemplo de un perro.

Nosotros sabemos qué es un perro porque conocemos la idea de un perro. Todos los perros presentan las características y tienen el mismo comportamiento. Ahora bien, cada perro en particular se diferencia porque tiene diferentes atributos, por ejemplo, son de distinta raza, de distinto tamaño, de distinto peso, etc. Por lo tanto, la idea de un perro es el equivalente a una Clase.

Podemos ver a una clase como un modelo o plantilla que representa entidades o conceptos.


En una clase se definen los datos y el comportamiento que tendrá la entidad que representa. Los datos se denominan atributos, mientras que el comportamiento está definido por funciones y procedimientos que se denominan métodos. Una clase se utiliza para crear objetos, es por eso que también se dice que un objeto es una instancia de una clase.

Una clase es un modelo abstracto que define cómo será un objeto real.

Origenes de la POO


La programación orientada a objetos tomó posición como el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++ , una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para los cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos, también conocida como programación visual.

Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, y otros.
El agregado de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y a la capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros", por otra parte, carecían de las características que los programadores estaban acostumbrados a utilizar, por ejemplo definiciones de variables globales y un uso excesivo de funciones y procedimientos poco reutilizables.

Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características imperativas de maneras "seguras".

El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos, pero luego fue reemplazado por Java, en gran parte debido a la aparición de Internet y a la implementación de la máquina virtual de Java en la mayoría de los navegadores.

¿Cuáles son las diferencias de la POO con el paradigma estructurado?


La principal diferencia con la programación estructurada tradicional es que ahora deberás pensar simultáneamente en el conjunto de atributos que tendrá una clase y en los métodos para poder tratarlos. Es decir, que los datos son tan importantes como su comportamiento y deben ir íntimamente entrelazados.
En cambio, en el paradigma estructurado, los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida.

Cuando programás de forma estructurada, lo que hacés es pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esas rutinas manejan. En la programación estructurada se escriben funciones y después se les pasan datos. Ahora, cuando programes con objetos, definirás los objetos con sus datos y sus métodos relacionados.

Conceptos básicos de la POO


Como habrás notado, la POO es una nueva forma de programar que trata de encontrar soluciones  a los problemas de la programación clásica estructurada.

Es por eso que la POO introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos se destacan los siguientes: 

OBJETO
Es una entidad provista de un conjunto de atributos (datos) y de comportamiento (métodos). Los objetos se corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa).

CLASE
Es el modelo en el que se definen las propiedades y comportamiento de un tipo de objeto.

METODO
Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

EVENTO
Es un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento a la reacción que puede desencadenar un objeto, es decir, la acción que genera.

MENSAJE
Una comunicación dirigida a un objeto que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

PROPIEDAD O ATRIBUTO

Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto, y cuyo valor puede ser alterado por la ejecución de algún método.

ESTADO INTERNO

Es una propiedad invisible de los objetos, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos).

COMPONENTE DE UN OBJETO

Atributos, identidad, relaciones y métodos.

REPRESENTACIÓN DE OBJETOS

Un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes.




Eso es todo por hoy, próximamente el capitulo 2.

MonkeyBoy














Mientras tanto,en la isla Mono...

Agosto 23, 2018, 11:59:32 AM #1 Ultima modificación: Septiembre 13, 2018, 04:32:15 PM por MonkeyBoy
Características de la POO


Capitulo 2


Dentro de las características más importantes podemos destacar a las siguientes:


Abstracción
Cada objeto en el sistema puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. El objeto tendrá una parte pública que es la que permitirá la comunicación con el resto de los objetos, dejando de manera privada los detalles de implementación de la parte pública.

Encapsulamiento
También llamado "ocultación de la información". Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz (parte pública) a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de manera inesperada, eliminando efectos secundarios e interacciones no previstas.

Polimorfismo
Comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre; al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando.

Herencia
Las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes, tal como sucede con los objetos de la vida real.




Diseño de clases

Una clase es un modelo, un esqueleto para generar objetos. La clase está compuesta por atributos (datos, variables), también llamadas variables de instancia, que nos indican en qué estado se encuentra cada objeto,  y métodos (funciones) que indican cuál es el comportamiento que posee el objeto.

Las clases habitualmente se denotan con nombres generales como Animal, Factura.

Toda clase está compuesta por atributos y métodos. Los atributos son características de los objetos. Cuando definas un atributo tendrás que especificar su nombre y su tipo. En definitiva, la definición de un atributo no es más que la declaración de una variable.



Habitualmente, a los atributos se los denomina variables miembro de la clase, que por lo general son privadas al objeto (siguiendo las directrices de diseño del Principio de ocultamiento de la información) y su acceso se realiza mediante los métodos que se definan para manejar esos atributos.

También dentro de las clases tendrás que definir e implementar la funcionalidad asociada al objeto. Los métodos son el equivalente a las funciones en los lenguajes estructurados. Se diferencian de ellos en que es posible acceder a las variables de la clase de forma implícita. Por eso cuando se desea realizar una acción sobre un objeto, se dice que se le manda un mensaje invocando a un método que realizará la acción.

Veamos un ejemplo de una clase y su ejecución y a partir del ejemplo iremos mostrando sus componentes...

Ejemplo de diseño de una clase


Comenzamos con un ejemplo muy simple, en el que definimos una clase denominada PERSONA.
Dentro de sus componentes podemos identificar 2 atributos y 5 métodos.
   
Código: text
CLASE PERSONA
CLASE Persona
Atributos
   Nombre : cadena
   Edad : entero

Métodos
   Persona ( )
   setNombre (valor :  cadena)
   getNombre ( ) : cadena
   getEdad ( ) : entero


Atributos y Métodos


Atributos
Con los atributos estamos definiendo que los datos de una PERSONA serán su nombre y su domicilio.

Los atributos nombre y domicilio se denominan atributos de clase. Cada vez que se genere un objeto de la clase PERSONA tendrá una copia de estos atributos. Por eso, también se los denomina atributos de instancia.


En nuestro ejemplo de la Clase Persona, los atributos son Nombre y Edad.


Métodos

Con los métodos estamos definiendo el comportamiento que tendrá una PERSONA.


En nuestro ejemplo, los métodos son 5: Persona, setNombre, setEdad, getNombre y getEdad.
Cuando se crea un objeto se genera una copia de los métodos en cada objeto creado. A esto se lo denomina método de instancia.

Es importante que sepas que junto con el nombre del método, la declaración lleva información del tipo de retorno del método, el número y el tipo de los parámetros necesarios, y qué otras clases y objetos pueden llamar al método.

Los métodos pueden poseer argumentos (parámetros) o no. En caso de no tenerlos solo se escriben los paréntesis vacíos, en caso de tenerlos se define el conjunto de argumentos de cualquier método en una lista de declaraciones de variables delimitadas por comas donde cada declaración de variable es un par nombre / tipo.


Que es el metodo constructor?

Si observás la lista de métodos verás que hay uno que tiene el mismo nombre de la clase.  En nuestro ejemplo, es el método Persona. Este es un método especial que se denomina constructor. El constructor es el método invocado en el momento en que se crean las instancias de las clases, es decir, los objetos. Los constructores no deben retornan un valor, pero sí pueden tener o no argumentos.

Que son los metodos Stters y Getters?


Seguramente habrás notado que los métodos de la clase comienzan con la palabra set o get. A estos se los denomina getters y setters. Por lo general suele haber uno para atributo definido.


Los setters comienzan con la palabra set, es un método que no retorna nada, y que posee como argumento un dato cuyo tipo de dato es el mismo del atributo que se trata. En nuestro ejemplo tenemos setNombre cuyo argumento es una cadena debido a que el atributo Nombre es de tipo cadena. El método setter lo que hará es asignar el valor del parámetro al atributo correspondiente.

En cambio, los getters, no poseen argumento alguno, pero devuelven un dato. En nuestro ejemplo tenemos getEdad que no tiene argumentos pero devuelve un entero debido a que el atributo Edad es de tipo entero. El método getter lo que hará es devolver el valor del atributo correspondiente.

I - Alcance de atributos y métodos

El alcance es una característica fundamental de la POO ya que te permitirá definir el encapsulamiento de la información y del comportamiento. Los métodos, atributos y clases deben tener un solo alcance, también lo llamamos tipo de acceso.

Cuando diseñes clases, es importante que pienses en términos de quién debe tener acceso a qué.
Qué cosas son parte de la implementación privada y deberían ocultarse (y en qué grado) y qué cosas forman parte de la interface y deberían ser públicas.


Podrás definir alguno de los siguientes cuatro tipos de acceso:

ALCANCE
Privado

Si un atributo o método tiene alcance de tipo privado, este solo podrá ser accedido por los métodos miembros definidos en la misma clase. Es importante que sepas que las clases no pueden declararse como privadas.

Público

Si un atributo o método tiene un acceso de tipo público es accedido desde cualquier clase, no tiene restricciones de ningún tipo (no respeta la ocultación de la información). Las clases solo pueden tomar dos tipos de modificadores público o de paquete. Las clases no pueden declararse ni protected, ni private.

Protegido
Este alcance es muy importante cuando se utilizan relaciones de herencia entre las clases, y significa que los atributos y métodos serán accesibles desde las clases heredades. El concepto de herencia lo veremos en la siguiente unidad, así que volveremos a mencionar este acceso cuando te expliquemos qué es la herencia.


Paquete

Las clases tienen un comportamiento definido para quienes las usan, conformado por los elementos que tienen un acceso público, y una implementación oculta formada por los elementos privados, de la que no tienen que preocuparse los usuarios

II - Alcance de atributos y métodos


Las clases tienen un comportamiento definido para quienes las usan, conformado por los elementos que tienen un acceso público, y una implementación oculta formada por los elementos privados, de la que no tienen que preocuparse los usuarios de la clase. 
Con respecto a los métodos, por lo general, aquellos que definas dentro de la clase tendrán un especificador de acceso público, que muestra la interface que provee la clase. En el caso de querer definir un método y que este no forme parte de la interface, lo que tendrás que hacer es declararlo como privado. Este método privado puede ser invocado dentro de cualquier otro método de la misma clase.

Ahora que ya te contamos el tipo de alcance que podrás aplicar a cada atributo o método, es momento de modificar la clase PERSONA para agregar el acceso.

La clase modificada quedará de la siguiente manera:

Código: text
CLASE PERSONA
CLASE Persona
Atributos
   [privado] Nombre : cadena
   [privado] Edad : entero

Métodos
   [público] Persona ( )
   [público] setNombre (valor :  cadena)
   [público] setEntero (valor : cadena)
   [público] getNombre ( ) : cadena
   [público] getEntero ( ) : entero



Atributos de clase

Hasta el momento, cuando hemos definido atributos dentro de la clase, hemos dicho que se denominan atributos de instancia, porque cuando se crea un objeto en memoria ese objeto tendrá una copia tanto de los atributos como también de sus métodos.

Existe un modificador que aplicado a las variables hace que el atributo de instancia se convierta en atributo de clase. La diferencia que existe con el anterior es que al momento de crear un objeto ese atributo de clase no se crea en el objeto, por lo que si se llegaran a crear más objetos ninguno de ellos tendría una copia del original sino que todos compartirían el mismo atributo. Esto implica que si un objeto modifica el valor de ese atributo, se verá reflejado el cambio en todos los objetos.

Para poder definir un atributo de clase tendrás que utilizar la palabra estático, anteponiéndola al nombre del atributo.



Métodos de clase

Si aplicás la palabra estático a los métodos, se los denomina método de clase. Los métodos de clase permiten acceder a código cuando no se tiene una instancia en particular de un objeto.

Al definir un método de clase, tenés que tener en cuenta que no pueden acceder a atributos que no están definidos como estáticos.


Proximamente capitulo 3.

Saludos!
Mientras tanto,en la isla Mono...

Agosto 23, 2018, 04:55:09 PM #2 Ultima modificación: Septiembre 13, 2018, 04:33:08 PM por MonkeyBoy
Herencia

Los objetivos de este nuevo capitulo será:

  • Definir la herencia y sus funciones.
  • Diferenciar herencia de composición.


¿Qué es la herencia?

Seguramente, al haber leído la palabra herencia, te habrá venido a la mente lo que sucede con una persona que puede heredar algunos rasgos físicos o personales de sus padres o abuelos. La herencia es la característica por la cual los padres transmiten algunas características a sus hijos. Del mismo modo que en biología, en el plano económico, una persona le puede heredar sus bienes a otra persona, es decir que se los puede traspasar a otra persona por medio de una relación de jerarquía.



Pasando a nuestra materia, te presentamos un ejemplo de lo que sería la herencia, partiendo de la clase Persona que definimos en capitulos anteriores.
Recordemos cómo está definida la clase Persona.

Código: text
CLASE PERSONA
CLASE Persona

Atributos
   Nombre : cadena
   Edad : entero

Métodos
   Persona ( )
   setNombre (valor :  cadena)
   getNombre ( ) : cadena
   getEdad ( ) : entero



Ahora bien, proponemos que pienses qué agregados deberías hacer si queremos, además, que nuestro programa registre la información de un alumno.


Seguramente habrás pensado que un alumno tiene un nombre, una edad y algún dato propio por ser alumno, por ejemplo, la matrícula. Esto se debe a que un alumno, ante todo, es una persona y luego tiene datos y comportamientos propios que le corresponde por ser un alumno. De esta manera, podemos decir que un alumno debe tener todos los atributos de una persona (ya que es una persona) y, además, agregar atributos propios.


¿Cómo resolvemos esto sin tener que repetir todo lo de una persona en un alumno?


Es en este momento donde deberás hacer uso de la herencia. Es así como nuestra nueva clase quedaría con el siguiente modelo.

Código: text
CLASE ALUMNO
CLASE Alumno

Atributos
   Matrícula : cadena

Métodos
   Alumno ( )
   setMatrícula (valor :  cadena)
   getMatrícula ( ) : cadena


Como habrás notado, utilizamos la herencia para transmitir los datos y atributos de una clase a otra. De esta manera podemos decir que :

La herencia es una propiedad esencial de la Programación Orientada a Objetos que consiste en la creación de nuevas clases a partir de otras ya existentes.


Subclases y superclases


En nuestro ejemplo, la clase Persona es una Superclase de la clase Alumno. Y del mismo modo, la clase Alumno es una subclase de la clase Persona.
Un lenguaje orientado a objetos permite heredar a las clases características y conductas, es decir los atributos y métodos, de una o varias clases denominadas superclases, clases bases o padres. A las clases que heredan de otras clases se las denominan subclases, clases derivadas o hijas. Las clases derivadas, a su vez, pueden ser clases bases para otras clases derivadas. De esta manera podrás establecer una clasificación jerárquica similar a la existente en Biología con los animales y plantas.


La herencia te permitirá lograr una de las principales características de la programación, que es la reutilización de código. 

   
Una vez que una clase ha sido probada, el código fuente de dicha clase no necesita modificarse. Su funcionalidad se puede cambiar derivando una nueva clase que herede la funcionalidad de la clase base y le añada otros comportamientos. De esta manera podrás reutilizar el código existente, ahorrando tiempo y dinero, ya que solamente tendrás que verificar la nueva conducta que proporciona la clase derivada.



Sintetizando...
La herencia es un mecanismo mediante el cual una clase hereda todo el comportamiento y atributos de otra clase. La clase que hereda se denomina clase hija, clase derivada o subclase. La clase que provee la herencia se llama clase padre, base, o superclase.

La herencia está dada por la relación "es un".


Un ejemplo de herencia:


Veamos cómo implementamos nuestro ejemplo de herencia en pseudocódigo.


Código: text
SEUDOCÓDIGO
CLASE Persona
Atributos
NOMBRE : CADENA
        EDAD : ENTERO
Métodos
        Persona ()
        EsMayor():BOOLEAN
        GetNombre():CADENA
Implementación
PROCEDIMIENTO Obtener ()
        INICIO
              Mostrar ("Ingrese nombre")
              Ingresar (NOMBRE)
              Repetir
                    Mostrar ("Ingrese edad")
                    Ingresar (EDAD)
              Hasta que EDAD > 0
         FIN
FUNCIÓN EsMayor (): Boolean
         VARIABLES
               ES : BOOLEAN
INICIO
               ES <- FALSO
               Si EDAD > 18 entonces
                  ES <- VERDADERO
               Finsi
               Devolver ES
FINFUNCIÓN
FUNCIÓN GetNombre (): Boolean
INICIO
              Devolver NOMBRE
FINFUNCIÓN
FINCLASE

Código: text
CLASE Alumno extiende de Persona 
Atributos
     MATRICULA : CADENA
Métodos
     Obtener ()
     GetMatricula():CADENA
     SetMatricula(MAT:CADENA)
Implementación
     PROCEDIMIENTO Obtener ()
     INICIO
          Super.Obtener()
          Mostrar ("Ingrese matrícula")
          Ingresar (MATRICULA)
     FIN
     FUNCIÓN GetMatricula (): CADENA
     INICIO
         Devolver MATRICULA
     FINFUNCIÓN
     PROCEDIMIENTO SetMatricula (MAT: CADENA)
     INICIO
          MATRICULA <- MAT
     FIN
FINCLASE
INICIO
     Alu = nuevo Alumno()
     Alu.obtener()
     Si Alu.EsMayor() entonces
         Mostrar (Alu.GetNombre(), " es mayor de edad")
     Finsi
FIN


En la definición de la clase Alumno, se encuentra la palabra reservada extiende para especificar que es una clase que hereda de la clase Persona.

Clase Alumno extiende de Persona.

Si observas el algoritmo principal verás que ahora se crea un objeto de la clase Alumno. Lo primero que se hace es invocar al método Obtener.
¿Qué ocurre entonces? Se ejecuta el método Obtener de la clase Alumno, que realiza la siguiente acción: Super.Obtener(). En esta llamada se encuentra la palabra super que se utiliza para invocar a los métodos de la clase base.

Este mensaje invoca al método Obtener de la clase Base (en nuestro ejemplo, la clase Persona). Luego se ingresan los datos propios del alumno, en este caso, la matrícula.

Esto es la característica fundamental de la herencia, que logra la reutilización de código y la abstracción, ya que los detalles de implementación de la obtención de los datos de la persona quedan en la clase Persona.
La clase Alumno implementa los detalles propios de un alumno, de esta forma se logra la abstracción en cada una de las clases.


Hasta el proximo capitulo!
Mientras tanto,en la isla Mono...

Agosto 29, 2018, 04:25:20 PM #3 Ultima modificación: Septiembre 13, 2018, 04:33:35 PM por MonkeyBoy
Tipo de herencia: 1- Herencia Simple


Capitulo 4

En la POO existen dos tipos de herencia.

1- Herencia Simple


Como habrás notado, la clase Alumno de nuestro ejemplo anterior hereda de una sola clase. Este es el caso de una herencia Simple.

En este tipo de herencia, una clase puede extender las características de una sola clase, o sea sólo puede tener un padre.


2- Herencia Múltiple


Hay otro tipo de herencia y es en el caso en que una clase puede extender las características de varias clases, es decir, puede tener varios padres. En este aspecto hay discrepancias entre los diseñadores de lenguajes. Algunos de ellos han preferido no admitir la herencia múltiple por las posibles coincidencias en nombres de métodos o datos miembros.

Si una clase cualquiera tiene más de una superclase directa en la jerarquía de clases, se considera que existe herencia múltiple.

En términos concretos, una instancia de objeto de la clase hija poseerá todos los atributos y métodos de sus clases padres.

Especificadores de alcance


Ahora vuelvo a comentarte sobre los especificadores de alcance que hablamos en capítulos anteriores.

En el caso de la herencia, utilizamos los mismos especificadores que se utilizan para definir una clase, método o atributo; la única diferencia es el alcance que tienen en la clase derivada. Esto quiere decir que dependiendo del tipo de acceso que se especifique al componente en la clase base, será cómo se lo pueda utilizar en las clases derivadas.

En la siguiente tabla especificamos el alcance en la clase derivada según el alcance que tenga el componente en la clase base.


CLASE BASE   CLASE DERIVADA   ACCESO
Privado   Privado   Solo mediante métodos
Protegido   Público   Directo
Público   Público   Directo



Que indica entonces esta tabla?

• Que, si los datos en la clase base son privados, en la clase derivada también lo serán y que su acceso sólo será mediante los métodos

• Que, si los datos en la clase base son protegidos, en la clase derivada se convierten en públicos y que su acceso sólo será directo, o sea, no hará falta acceder mediante la invocación de ningún método.

• Que si los datos en la clase base son públicos en la clase derivada también lo serán y que su acceso sólo será directo, o sea, no hará falta acceder mediante la invocación de ningún método.


Como habrás notado, entonces, no es necesario, si vas a tener un esquema de herencia, poner en la clase base los atributos de la misma como privados, sino que los podés poner como atributos protegidos.

Que caracteristicas tienen en caso de ser protegidos?

Una es la que nombramos antes: que en la clase derivada tienen una visibilidad pública, pero en la clase base un atributo protegido es igual que un atributo privado, o sea que no puede ser accedido más que a través de métodos, es decir, que no se pierde el ocultamiento de la información en la clase base.


Composición


Ahora te presento otro tipo de relación que se puede establecer entre Clases, y para eso te propongo agregar a nuestro modelo de clases la información del domicilio de una persona.
Podemos modelar el domicilio como una clase, por lo tanto, tendríamos la siguiente definición de clase.
Para simplificar el ejemplo, definiremos solamente los métodos para mostrar y para obtener el domicilio.

Código: text
CLASE DOMICILIO
CLASE Domicilio

Atributos
   Calle : cadena
   Piso : entero
   Departamento : cadena
   Localidad : cadena
   Provincia : cadena

Métodos
   Domicilio ( )
   Obtener ( )
   Mostrar ( )
 


Ahora bien...

Como se relaciona el domicilio con la persona?

Una Persona NO es un Domicilio, tampoco un Domicilio es una Persona. Por lo tanto, no podemos definir una relación de herencia, tendremos que buscar algún otro tipo de relación.
Podemos decir que una Persona está compuesta por un Domicilio, ya que de los atributos de Persona (nombre y edad), además tenemos el domicilio. De esta manera podemos agregar el domicilio a la persona

Eso es todo por ahora. Seguimos en el proximo capitulo.



Mientras tanto,en la isla Mono...

Agosto 29, 2018, 05:15:01 PM #4 Ultima modificación: Septiembre 13, 2018, 04:34:11 PM por MonkeyBoy
Algoritmo de la composición


En nuestro algoritmo, a la clase Persona la definiremos así:

Código: text
SEUDOCÓDIGO
CLASE Persona
Atributos
     NOMBRE : CADENA
     EDAD : ENTERO
     DOM : objeto Domicilio
Métodos
     Persona ()
     EsMayor(): BOOLEAN
     GetNombre(): CADENA
FINCLASE

CLASE Domicilio
Atributos
     CALLE : CADENA
     PISO : ENTERO
     DEPARTAMENTO : CADENA
     LOCALIDAD : CADENA
     PROVINCIA : CADENA
Métodos
     Domicilio ()
     Obtener()
     Mostrar()
FINCLASE


Si observamos el código tenemos dos clases: Clase Domicilio que es solo una clase que contiene los atributos propios de un domicilio, y la Clase Persona que contiene sus propios atributos como Persona además de un objeto de la Clase Domicilio.

La inclusión de este objeto hace que haya composición, o sea que la Clase Persona está compuesta por la clase Domicilio. A diferencia de la herencia, ahora, si querés acceder a los datos de la Clase Domicilio lo debés hacer mediante el objeto, invocando sus métodos.



Luego de haber analizado este ejemplo podemos decir que:


Existe composición cuando una clase está compuesta por un objeto de otra clase. En este caso, el rol de la relación es "tiene un" o "está compuesto por".

En la composición no se habla ni de clase base ni de derivada.



Herencias vs. Composición


Seguramente te estarás preguntando:

¿En qué situación utilizar le herencia o la composición?



Te comentamos nuestras conclusiones para ayudarte a tomar esa decisión.

Las dos técnicas fundamentales para construir nuevas clases a partir de otras ya existentes son la herencia y la composición. Es importante que entiendas que ambos tipos de relaciones pueden existir al mismo tiempo en un problema en donde hay varias clases y diversos tipos de relaciones.


Sintetizando....

La herencia permite construir una clase derivada a partir de una clase base. La clase derivada hereda todas las propiedades de la clase base, es decir, sus atributos (datos), y su comportamiento (métodos). Todas las nuevas características que quieras dar a la clase derivada se las tendrás que brindar por medio de nuevos atributos y métodos.

La composición de clases es un concepto distinto al de la herencia, ya que expresa el hecho de que se pueden componer o constituir clases nuevas a partir de objetos de otras clases. Esto lo podés notar en el mundo real, en donde podés observar objetos formados por otros objetos: por ejemplo, computadoras formadas por teclado y pantalla; vehículos formados por motor, transmisión y chasis, etc.
En ambas técnicas, el código de las clases originales o clases bases no presenta ningún tipo de modificación.


La cláusula final
A veces tenemos la necesidad de evitar que una clase sea derivada o bien un método sea implementado en otra clase derivada.

Por ejemplo, pensemos en una clase que define un método AumentarSueldo. Sería lógico que ninguna otra clase pueda implementarla, por lo tanto, necesitaremos indicar de alguna manera que ese método solamente será definido por la propia clase. Para eso, la POO, tiene la característica de las clases o métodos finales.

Veamos el siguiente ejemplo:


Código: text
SEUDOCÓDIGO
CLASE Empleado
     Publico Final AumentarSueldo()
FINCLASE

Final CLASE Ejecutivo extiende Empleado
FINCLASE


En este ejemplo, la clase Ejecutivo, clase derivada de Empleado no podría reescribir el método aumentarSueldo, y por tanto cambiar su comportamiento, ya que este método está definido como final en la clase Empleado.
Por lo tanto, solamente será implementado en la misma clase Empleado.

Por otro lado, evitamos que se pueda seguir extendiendo el árbol jerárquico, es decir, que la Clase Ejecutivo no puede derivarse. Esto se debe a que la clase Ejecutivo la definimos como clase final.
Mientras tanto,en la isla Mono...

Septiembre 13, 2018, 04:29:44 PM #5 Ultima modificación: Septiembre 28, 2018, 10:51:39 AM por MonkeyBoy
Polimorfismo

¿Qué es el polimorfismo?

Comenzamos y lo primero que me propongo es explicarte qué es el concepto de polimorfismo. Veremos, entonces, los conceptos básicos de esta propiedad.
Además, te cuento qué es una Interface y cómo se implementa. 


Comencemos...



¿Qué es el polimorfismo?


Seguramente, te estarás preguntando qué es este concepto de polimorfismo. Esta palabra está relacionada con la idea de tener muchas formas. Si consultamos el diccionario de la Real Academia Española, nos dirá que una de las acepciones de polimorfismo es

"Cualidad de lo que tiene o puede tener distintas formas"


Ahora bien, ¿qué tiene que ver esto con la Programación a Objetos?

Te lo cuento con un simple ejemplo.

Volvamos a la actividad que te planteo en capitulos anteriores, en donde definimos una jerarquía de clases con la clase Vehículo como base y las clases Avión y Auto como clases derivadas.

Un método de la clase Vehículo es arrancar(). Esto significa que todos los objetos vehículos podrán arrancar.

Pero,¿como lo haran?

La implementación de este método no podrá definirse en la clase Vehículo, ya que todos los vehículos no tienen la misma forma de arrancar.


Un avión tendrá una manera de arrancar distinta a la de un auto, por ejemplo en el auto habrá que colocar una llave y girarla.

Por lo tanto, en cada clase derivada se deberá implementar el método arrancar.

¿Entonces? ¿Qué tiene que ver todo esto con el polimorfismo?
¿Cómo funciona el polimorfismo?


Ahora es donde aparece la magia del polimorfismo, ya que podremos tener en nuestro programa un objeto que sea un Vehículo, sin importar a qué clase derivada pertenezca, e invocar al método arrancar. El objeto por ser un vehículo tiene el método arrancar, y este objeto podrá ser un Avión o un Auto, y se resolverá en el momento de la ejecución a qué método se invoca (si al del Auto o al del Avión).

De esta manera, en la POO, se denomina polimorfismo a la capacidad que tiene un objeto de responder al mismo mensaje que se encuentra en distintas clases.




Polimorfismos, sobrecarga y sobre escritura
Una de las características del polimorfismo es que no se habla de sobrecarga de métodos, sino de sobre escritura.



Veamos, ahora, la definición de cada concepto.

La sobrecarga se produce dentro de una misma clase sobre un método que tiene igual nombre, pero distintos parámetros. Dependiendo de los parámetros que se encuentren en la invocación será el método que se termine llamando.

La sobre escritura se produce con métodos de distintas clases, donde se encuentra definido un método con el mismo nombre y con los mismos parámetros. Dependiendo del objeto que invoque al método será la clase que resolverá ese llamado.


Clases abstractas

El polimorfismo es la habilidad que tiene un objeto de tomar diferentes formas en tiempo de ejecución. Nosotros vamos a representar el polimorfismo con la palabra reservada "abstracto", la cual puede ser utilizada tanto en clases como en métodos.

Es importante que entiendas, también, que para que exista polimorfismo tiene que haber una jerarquía de clases.



Si un método tiene antepuesto a su definición la palabra "abstracto", entonces decimos que es un método abstracto, es decir que su cabecera se encuentra en la clase base y su implementación se encuentra en alguna clase derivada.

Una clase que posee, al menos, un método abstracto se denomina clase abstracta.

Una clase abstracta, por lo tanto, tendrá que derivarse, ya que no podrá hacerse un nuevo objeto de esa clase abstracta.


Ejemplo 1 de polimorfismo
  Veamos cómo implementamos nuestro ejemplo de polimorfismo en pseudocódigo.

Código: text
[i]


SEUDOCÓDIGO
Abstracto CLASE Persona
Atributos
    NOMBRE : CADENA
    EDAD : ENTERO
Métodos
    Persona ()
    EsMayor():BOOLEAN
    GetNombre():CADENA
    Abstracto presentarse()

Implementación
    PROCEDIMIENTO Obtener ()
    INICIO
        Mostrar ("Ingrese nombre")
        Ingresar (NOMBRE)
        Repetir
            Mostrar ("Ingrese edad")
            Ingresar (EDAD)
        Hasta que EDAD > 0
    FIN
   
    FUNCIÓN EsMayor (): Boolean
    VARIABLES
        ES : BOOLEAN
    INICIO
        ES <- FALSO
        Si EDAD > 18 entonces
            ES <- VERDADERO
        Finsi
        Devolver ES
    FINFUNCIÓN

    FUNCIÓN GetNombre (): Boolean
    INICIO
        Devolver NOMBRE
    FINFUNCIÓN
FINCLASE


CLASE Alumno extiende de Persona
Atributos
    MATRICULA : CADENA
Métodos
    Obtener ()
    GetMatricula():CADENA
    SetMatricula(MAT:CADENA)

Implementación
    PROCEDIMIENTO
    INICIO
        Super.Obtener()
        Mostrar ("Ingrese matrícula")
        Ingresar (MATRICULA)
    FIN

    FUNCIÓN GetMatricula (): CADENA
    INICIO
        Devolver MATRICULA
    FINFUNCIÓN

    PROCEDIMIENTO SetMatricula (MAT: CADENA)
    INICIO
        MATRICULA <- MAT
    FIN
   
    PROCEDIMIENTO Presentarse ()
    INICIO
        Mostrar ("Soy el alumno " NOMBRE)
        Mostrar ("Mi matrícula es " MATRICULA)
    FIN
FINCLASE


CLASE Docente extiende de Persona
Atributos
    LEGAJO : CADENA
Métodos
    Obtener ()
    GetLegajo():CADENA
    SetLegajo(MAT:CADENA)

Implementación
    PROCEDIMIENTO Obtener ()
    INICIO
        Super.Obtener()
        Mostrar ("Ingrese legajo")
        Ingresar (LEGAJO)
    FIN
   
    FUNCIÓN GetLegajo (): CADENA
    INICIO
        Devolver LEGAJO
    FINFUNCIÓN

    PROCEDIMIENTO SetLegajo (MAT: CADENA)
    INICIO
        LEGAJO <- MAT
    FIN

    PROCEDIMIENTO presentarse ()
    INICIO
        Mostrar ("Soy el docente " NOMBRE)
        Mostrar ("mi legajo es " LEGAJO)
    FIN
FINCLASE

VARIABLES
    Pers = Persona
INICIO
    Pers = nuevo Alumno()
    Pers.presentarse()
    Pers = nuevo Docente ()
    Pers.presentarse()
FIN[/i]





A la jerarquía original le agregamos la clase Docente, derivada de Persona para que quede más claro cómo funciona el polimorfismo.

Habrás notado que la clase Persona, ahora es una clase abstracta, ya que tiene un nuevo método que es abstracto, denominado presentarse.

Esto significa que cada persona se podrá presentar, pero en nuestro programa, las personas serán alumnos o docentes. Es decir que los objetos serán instancias de las clases Alumno o Docente, no tendremos objetos de Personas.

Ahora bien, cada uno de los objetos se podrá presentar. Un alumno se presentará con su matrícula, mientras que un docente lo realizará con su legajo. Por lo tanto ante el mismo mensaje, las clases responderán con acciones diferentes.

Aquí es donde tenemos que utilizar el polimorfismo para simplificar el desarrollo.

Para eso, definimos un objeto que será Persona, llamado Pers. Este es el objeto polimórfico, ya que en principio será un Alumno y luego lo instanciaremos como un Docente.

Seguramente te habrás dado cuenta que estamos realizando la misma llamada

Pers.presentarse()


Ese es el momento en que dinámicamente, en tiempo de ejecución, se resuelve a qué clase se estará invocando.

En la primera llamada se invocará al método presentarse de la clase Alumno, ya que Pers es un Alumno.
En la segunda llamada se invocará al método presentarse de la clase Docente, ya que Pers es un Docente


De esta manera es como, ante el mismo llamado del mismo objeto, puede responder de manera distinta ya que el objeto Pers es polimórfico.

Hasta el proximo capitulo!



Mientras tanto,en la isla Mono...

Sintaxis de Java

Tipos de datos
En Java, los tipos de datos se pueden dividir en dos categorías:

los primitivos, que son aquellos tipos de datos que provee el compilador y
los abstractos, que son los creados por el programador.

A continuación te detallamos los tipos de datos primitivos que posee Java:





Habrás notado que todos los tipos de datos primitivos en Java se escriben en minúsculas. Esto se debe a que el lenguaje es "Case sensitive" (sensible a mayúsculas), lo que significa que el lenguaje hace diferencias entre mayúsculas y minúsculas, es decir, que no es lo mismo int que Int o inT.


Ahora te explico con más detalle cada uno de los tipos de datos.

Datos Lógicos:

Son variables que pueden almacenar dos tipos de valores true o false (verdadero o false). Por lo general los utilizarás para almacenar resultados de evaluaciones lógicas.

Datos Textuales:

Son variables en las cuales se almacenan caracteres. Al asignar sus valores, deben encerrarse entre apóstrofes ("'"). Los usarás para almacenar caracteres simples.

Datos Integrales:


Son variables en las cuales se almacenan valores numéricos de tipo entero con signo (+/-). Dentro de ellas podrás almacenar valores en cualquiera de las siguientes formas:

Decimal: los literales decimales aparecen como números ordinarios sin ninguna notación especial.
Hexadecimal: los hexadecimales (base 16) aparecen con un 0x ó 0X inicial, notación similar a la utilizada en C y C++.
Octal: los octales aparecen con un 0 inicial delante de los dígitos.
Por ejemplo, un literal entero para el número decimal 12 se representa en Java como 12 en decimal, como 0xC en hexadecimal, y como 014 en octal.


En Java, la definición de una variable es muy sencilla, primero se declara el tipo y luego el nombre de la misma.

Ejemplo:

int numero;

Cada definición de variables se termina con un punto y coma (";"). En caso de querer definir más de una variable del mismo tipo se utiliza la coma (",") como separador


int numero, exponente, base;


También se puede dar un valor inicial a las variables en el momento de definirlas:


int numero, exponente = 1;



Operador de asignación
Dentro de los operadores podemos encontrar cinco diferentes tipos, los cuales te detallamos a continuación:



1. Operador de asignación
El operador de asignación es el signo igual "=". Mediante este operador podrás asignar valores a las variables.


2. Operadores matemáticos: Binarios

Son los operadores que te permiten realizar operaciones matemáticas.
Dentro de este grupo existen dos tipos de operadores matemáticos: los binarios y los unarios.




El tipo de los datos devueltos por una operación aritmética depende del tipo de sus operandos. Por ejemplo, si se suman dos enteros, se obtiene un entero como tipo devuelto, con el valor de la suma de los dos enteros.


Estos operadores los debés utilizar con operandos del mismo tipo, o si no, realizar una conversión de tipos de uno de los dos operandos al tipo del otro.

Cada uno de los operadores que te muestro en la tabla anterior tiene a su vez una forma abreviada a utilizar conjuntamente con el operador de asignación. A continuación los describo y te muestro sus equivalentes.





3. Operadores relacionales

También llamados operadores de comparación. A estos operadores los utilizarás al momento de evaluar condiciones lógicas.

En la siguiente tabla te detallo los operadores que existen y sus significados:





4. Operadores lógicos
Estos operadores sirven para realizar condiciones compuestas de tipo lógico. También se los llama conectores lógicos.

Veamos cuáles son y sus correspondientes tablas de verdad asociadas.

Código: text
(A > 0) && (B > 0)
// Será true cuando A sea mayor a 0 y también B sea mayor a 0

(A > 0) || (B > 0)
// Será true cuando A sea mayor a 0 o cuando B sea mayor a 0








5. Operadores de bits

Son los operadores que se utilizan a nivel BIT (comparaciones entre ceros y unos). Esos operadores se utilizan para expresiones avanzadas





Hasta el próximo capitulo!
Mientras tanto,en la isla Mono...