Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

1.1. Sistema de Control de Versionamiento (VCS)

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 124

1.1.

  Sistema de control de versionamiento (VCS)

     El control de versiones es un sistema que registra los cambios realizados sobre
un archivo o conjunto de archivos a lo largo del tiempo, de modo que puedas
recuperar versiones específicas más adelante. El control de versiones es útil para
guardar cualquier documento que cambie con frecuencia, como código fuente,
documentación o ficheros de configuración.

Sistemas de control de versiones locales

     Un método de control de versiones usado por muchas personas es copiar los
archivos a otro directorio (quizás indicando la fecha y hora en que lo hicieron, si
son ingeniosas). Este método es muy común porque es muy sencillo, pero
también es tremendamente propenso a errores. Es fácil olvidar en qué directorio te
encuentras y guardar accidentalmente en el archivo equivocado o sobrescribir
archivos que no querías. Para hacer frente a este problema, los programadores
desarrollaron hace tiempo VCSs locales, que contenían una simple base de datos
en la que se llevaba el registro de todos los cambios realizados sobre los archivos,
como muestra la figura 1.

Figura 1. Diagrama de control de


versionamiento local.

Fuente: https://git-scm.com/book/es/v1/Empezando-Acerca-del-control-de-versiones

Sistemas de control de versiones centralizados

     El siguiente gran problema que se encuentra la gente es que necesita


colaborar con desarrolladores en otros sistemas. Para solventar este problema, se
ejecutaron los sistemas de control de versiones centralizados (Centralized Version
Control Systems o CVCSs en inglés). Estos sistemas, como CVS, Subversion y
Perforce, tienen un único servidor que contiene todos los archivos versionados y
varios clientes que descargan los archivos de ese lugar central. Durante muchos
años, este ha sido el estándar para el control de versiones (figura 2).

Figura 2.  Diagrama de control de versionamiento centralizado.

Fuente: https://git-scm.com/book/es/v1/Empezando-Acerca-del-control-de-versiones

    Esta configuración ofrece muchas ventajas, especialmente frente a VCSs


locales. Por ejemplo, todo el mundo sabe hasta cierto punto en qué está
trabajando el resto de gente en el proyecto. Los administradores tienen control
detallado de qué puede hacer cada uno; es mucho más fácil administrar un CVCS
que tener que lidiar con bases de datos locales en cada cliente. Sin embargo, esta
configuración también tiene serias desventajas. La más obvia es el punto único de
fallo que representa el servidor centralizado. Si ese servidor se cae durante una
hora, entonces durante esa hora nadie puede colaborar o guardar cambios
versionados de aquello en que están trabajando. Si el disco duro en el que se
encuentra la base de datos central se corrompe y no se han llevado copias de
seguridad adecuadamente pierdes absolutamente todo, toda la historia del
proyecto, salvo aquellas instantáneas que la gente pueda tener en sus máquinas
locales. Los VCSs locales sufren de este mismo problema cuando tienes toda la
historia del proyecto en un único lugar, te arriesgas a perderlo todo.

Sistemas de control de versiones distribuidos

     Es aquí donde entran los sistemas de control de versiones distribuidos


(Distributed Version Control Systems o DVCSs en inglés). En un DVCS (como Git,
Mercurial, Bazaar o Darcs), los clientes no solo descargan la última instantánea de
los archivos, replican completamente el repositorio. Así, si un servidor muere y
estos sistemas estaban colaborando a través de él, cualquiera de los repositorios
de los clientes puede copiarse en el servidor para restaurarlo. Cada vez que se
descarga una instantánea, en realidad se hace una copia de seguridad completa
de todos los datos como indica la figura 3.

Figura 3. Diagrama de control de


versionamiento distribuido.

Fuente: https://git-scm.com/book/es/v1/Empezando-Acerca-del-control-de-versiones

     Es más, muchos de estos sistemas se las arreglan bastante bien teniendo
varios repositorios con los que trabajar, por lo que puedes colaborar con distintos
grupos de gente de maneras distintas simultáneamente dentro del mismo
proyecto. Esto te permite establecer varios tipos de flujos de trabajo que no son
posibles en sistemas centralizados, como pueden ser los modelos jerárquicos.

1.1.1. Software VCS: Git, GitHub


     Git es un software de control de versiones diseñado por Linus Torvalds. La
pregunta es: ¿qué es control de versiones? Pues bien, se define como control de
versiones a la gestión de los diversos cambios que se realizan sobre los
elementos de algún producto o una configuración de este, y para los que aún no
les queda claro del todo, control de versiones es lo que se hace al momento de
estar desarrollando un software o una página web. Exactamente es eso que haces
cuando subes y actualizas tu código en la nube o le añades alguna parte o
simplemente le editas cosas que no funcionan como deberían o al menos no como
tú esperarías.

    Git fue creado pensando en la eficiencia y la confiabilidad del mantenimiento de


versiones de aplicaciones cuando estas tienen un gran número de archivos de
código fuente, es decir, Git nos proporciona las herramientas para desarrollar un
trabajo en equipo de manera inteligente y rápida. Por trabajo nos referimos a algún
software o página que implique código, el cual necesitemos hacerlo con un grupo
de personas.

     Algunas de las características más importantes de Git son:

 Rapidez en la gestión de ramas, debido a que Git nos dice que un cambio
será fusionado mucho más frecuentemente de lo que se escribe
originalmente.
 Gestión distribuida. Los cambios se importan como ramas adicionales y
pueden ser fusionados de la misma manera como se hace en la rama local.
 Gestión eficiente de proyectos grandes.
 Realmacenamiento periódico en paquetes.

     GitHub es un sistema de gestión de proyectos y control de versiones de código,


así como una plataforma de red social diseñada para desarrolladores. Pero, ¿para
qué se usa GitHub? Bueno, en general, permite trabajar en colaboración con otras
personas de todo el mundo, planificar proyectos y realizar un seguimiento del
trabajo.

     GitHub es una compañía sin fines de lucro que ofrece un servicio de hosting de
repositorios almacenados en la nube. Esencialmente, hace que sea más fácil para
individuos y equipos usar Git como la versión de control y colaboración.

     La interfaz de GitHub es bastante fácil de usar para el desarrollador novato que
quiera aprovechar las ventajas del Git. Sin GitHub, usar un Git generalmente
requiere de un poco más de conocimientos de tecnología y uso de una línea de
comando.

     GitHub es tan fácil de usar, que incluso algunas personas lo usan para
administrar otro tipo de proyectos, como escribir libros.
Además de esto, cualquier persona puede inscribirse y alojar un repositorio de
código público completamente gratuito, el cual hace que GitHub sea
especialmente popular con proyectos de fuente abierta.

    Como compañía, GitHub obtiene dinero vendiendo alojamiento para repositorios


de código privado, al igual que otros planes enfocados para negocios, lo que hace
más fácil que las organizaciones administren a los miembros de su equipo y su
seguridad. Utilizamos GitHub de forma extensiva aquí en Kinsta para administrar y
desarrollar proyectos internos.

Ejemplo de uso de GitHub

     Tenemos que tener instalado Git en nuestro ordenador que estará en la página
oficial (https://git-scm.com/).

Figura 4. Descarga.

Fuente: Pablo Pärra

Figura 5.  Descarga.

Fuente: Pablo Parra

     Luego procederás a instalar. El siguiente paso es tener una cuenta en GitHub.
En la página oficial podemos crear una cuenta (https://github.com/), creamos un
repositorio para nuestros códigos.
Figura 6. Repositorio.

Fuente: Pablo Parra

Figura 7.  Crear repositorio.

Fuente: Pablo Parra

     El siguiente paso es tener un código fuente listo para subir, que es un
programa que sume dos números enteros, como se muestra en la figura 8.
Figura 8. Ejemplo de
código.

Fuente: Pablo Parra

      Nos dirigimos a la barra de herramientas y seguimos estos pasos:

Figura 9.  Ejemplo.

Fuente: Pablo Parra

     Buscamos donde está nuestro proyecto y damos clic en OK.


Figura 10. Guardar proyecto.

Fuente: Pablo Parra

     El siguiente paso es dar clic derecho en nuestro proyecto.

Figura 11. Ejemplo.

Fuente: Pablo Parra

     Buscamos la opción Git y le damos clic en Add.


Figura 12.  Add.

Fuente: Pablo Parra

     Hacemos el mismo paso pero esta vez damos clic en Commint.
Figura 13.  Commint.

Fuente: Pablo Parra

     Esta opción nos agrega todos los archivos del proyecto, todo lo que utiliza el
paquete de Java para poderlo subir. Le damos clic en Commint.

Figura 14. Commint.

Fuente: Pablo Parra

     Después le volvemos a dar clic derecho al proyecto con lo siguiente:


Figura 15. Push.

Fuente: Pablo Parra

     Damos clic en Push. En esta opción necesitamos la url del repositorio en el que
vamos a subir el archivo. Inicialmente al crear un repositorio nos da un enlace,
tenemos que copiar el enlace y pegarlo, nos pedirá nuestro usuario y contraseña.
Una vez que hemos llenado esos campos le damos clic en siguiente.

Figura 16. Copiar URL.

Fuente: Pablo Parra

Figura 17.  Añadir URL.

Fuente: Pablo Parra

     Seleccionamos el combo box y damos clic en siguiente y finalizar.


Figura 18. Siguiente.

Fuente: Pablo Parra

     Actualizamos nuestro repositorio y ya está el proyecto creado en el repositorio.

Figura 19. Repositorio.

Fuente: Pablo Parra

     Le damos clic en nuestro proyecto.

Figura 20. Código en Git.

Fuente: Pablo Parra

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0
1.2. Paradigmas de programación
    Es un estilo de desarrollo de programas, es decir, un modelo para resolver
problemas computacionales. Los lenguajes de programación necesariamente se
encuadran en uno o varios paradigmas a la vez, a partir del tipo de órdenes que
permiten implementar algo que tiene una relación directa con su sintaxis.

Principales paradigmas de programación

 Imperativo. Los programas se componen de un conjunto de sentencias que


cambian su estado. Son secuencias de comandos que ordenan acciones a
la computadora.
 Declarativo. Opuesto al imperativo. Los programas describen los
resultados esperados sin listar explícitamente los pasos a llevar a cabo para
alcanzarlos.
 Lógico. El problema se modela con enunciados de lógica de primer orden.
 Funcional. Los programas se componen de funciones, es decir,
implementaciones de comportamiento que reciben un conjunto de datos de
entrada y devuelven un valor de salida.
 Orientado a objetos. El comportamiento del programa es llevado a cabo
por objetos, entidades que representan elementos del problema a resolver y
tienen atributos y comportamiento.

Transición de paradigmas

     Es el paso de un paradigma de programación a otro a partir de las


características que presentan cada uno de estos

Figura 21. Transición de paradigmas.

Fuente: https://culturacion.com/wp-content/uploads/2011/05/Image1.jpg

1.2.1. Transición de paradigma


     Un paradigma de programación indica un método de realizar cómputos y la
manera en que se deben estructurar y organizar las tareas que debe llevar a cabo
un programa.

  Los paradigmas fundamentales están asociados a determinados modelos de


cómputo. También se asocian a un determinado estilo de programación; los
lenguajes de programación suelen implementar a menudo, de forma parcial, varios
paradigmas.
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir
igual 4.0

1.3. Revisión de conceptos generales del paradigma orientado a


objetos

    Es una forma de construir, pensar, diseñar e implementar programas basados


en objetos que combinan estados, comportamientos e identidades. El estado está
compuesto por datos, el comportamiento es una serie de acciones que se realizan
y son llamados métodos, y la identidad es una identidad del objeto que lo
diferencia del resto de los objetos. Las tareas se realizan con estos objetos,
basadas en su colaboración y relación entre ellos. El objetivo de esto es mantener
diversas partes del código separadas entre sí, llegando de esta forma a tener una
unidad de código fácil de mantener y de reutilizar en otros proyectos. La
comunicación entre los diversos objetos se realiza mediante mensajes entre ellos.
Estos mensajes son llevados  a cabo mediante el llamado método de un cierto
objeto.

    La programación orientada a objetos (POO) nace en los años 60 en el


Norwegian Computing Center con la implementación de dos lenguajes de
programación de simulación (Simula 1 y Simula 67), desarrollados por Kristen
Nygaard y Ole Johan Dahl.

    Simula 67 introdujo por primera vez los conceptos de clases, objetos, herencia,
subclases, corrutinas y funciones virtuales. Es por esta razón que Simula es
considerado el primer lenguaje orientado a objetos.

    A continuación, se modelará el consumo de agua de un usuario al momento de


abrir el grifo de su hogar.

 Usuario abre el grifo.


 El grifo libera la presión y el agua fluye desde la cisterna hasta el grifo.
 Como el usuario abrió el grifo, este deja fluir el agua, lo que bajó el nivel del
agua que mantiene la cisterna. Está activa la bomba de alimentación, que
deja ingresar agua hasta completar el nivel máximo.
 Se detendrá el ingreso de agua a la cisterna.
     Como se puede ver, los objetos interactúan entre ellos, ha habido un análisis
funcional que ha conducido a la creación de los diferentes objetos, su realización y
su puesta en relación.

Figura 22. Interacción de
objetos.

Fuente: Pablo Parra

      El código del programa al modelar los objetos va a seguir esta realidad,


proponiendo tantos objetos como se han descrito con anterioridad, pero definiendo
entre estos objetos los métodos de intercambio adecuados, que conducirán al
funcionamiento esperado.
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir
igual 4.0

1.3.1. Principios generales de la POO


     La programación orientada a objetos (POO) es un paradigma de programación
que, como su nombre indica, usa objetos, basado en un ambiente real (todo lo que
nos rodea, como son útiles escolares, cuadernos, personas, entre otros, como
muestra la figura 23), para diseñar aplicaciones y programas de computadoras.
Figura 23.  Niño con útiles escolares.

Fuente
https://previews.123rf.com/images/dualororua/dualororua1706/dualororua170600527/80388651-ni
%C3%B1o-de-dibujos-animados-corriendo-y-llevando-un-material-escolar.jpg

     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, cada objeto
tiene una responsabilidad y el resultado es el producto de la colaboración de todos
los objetos en la solución del problema. Las acciones en programación orientada a
objetos se producen como respuesta a las peticiones de acciones, que se llaman
mensajes. Un objeto puede aceptar un mensaje y como respuesta puede realizar
una acción y devolver un valor. Está basado en varias técnicas, incluyendo
herencia, abstracción, polimorfismo y encapsulamiento, que sirven como pilares
de la POO (figura 24).
Figura 24.  Pilares de la programación
orientada a objetos.

Fuente https://elvex.ugr.es/decsai/builder/intro/oop/pilares.gif

 Abstracción. Captar las características principales de un objeto, así como


su comportamiento. En la figura 25 se muestra un ejemplo de abstracción
en la cual sacamos características principales de un objeto llamado bus.
Todo bus tiene un número de placa, un color y número de llantas. Son
características propias que caracterizan al objeto.

Figura 25. Programación orientada a objetos.

Fuente: http://1.bp.blogspot.com/-
l3aZgFckxJY/VOEUXEtWVQI/AAAAAAAAAHA/Jb3TzvMPAEI/s1600/image008.png

 Encapsulamiento. Un principio fundamental de la POO es la ocultación de


la información que es el proceso de ocultar dentro de sí mismo todos los
secretos de un objeto que no contribuyan a sus características esenciales.
Se maximiza la reutilizabilidad, se reduce la dependencia de los datos y se
minimiza el tiempo de depuración. 
Figura 26.  Encapsulamiento.

Fuente: http://ygalicia.cs.buap.mx/POO.pdf

     En otras palabras, es la capacidad de esconder los detalles de cómo funciona


algo, detrás de una interfaz. Solo se necesita conocer la interfaz para poder usar
alguna cosa. El usuario no se ve afectado si se cambia o se mejora al
funcionamiento interno de algo, mientras se mantenga la interfaz.

Ejemplo de encapsulamiento

    Consiste en restringir el acceso y ocultar el proceso de cada uno de los datos


miembro de una clase y solo podrán cambiar mediante las operaciones definidas
para ese espacio. El aislamiento protege contra la modificación y garantiza el flujo
del programa. Una clase y un método funcionan como cápsula. En una pantalla,
nosotros solo vemos la imagen y no conocemos lo que se procese dentro (figura
27).
Figura 27.  Ejemplo de encapsulamiento.

Fuente http://paginawebleon.mx/wp/programacion-orientada-a-objetos-poo/

 Polimorfismo. Es la habilidad que adquieren los objetos de responder en


forma diferente al mismo mensaje, es decir, el mismo mensaje se envía a
muchos tipos de objetos, toma muchas formas.

        Es la habilidad de esconder diferentes implementaciones tras una sola


interfaz.

Figura 28. Polimorfismo.

Fuente: http://agrega.juntadeandalucia.es/repositorio/02122016/da/es-
an_2016120212_9103251/Polimorfismo.jpg

 Herencia. Las clases no se encuentran aisladas, sino que se relacionan


entre sí, formando una jerarquía de clasificación. Es el proceso mediante el
cual un objeto hereda las propiedades a una subclase, la cual contiene las
características de la clase primaria, nos ayudan a reutilizar el código
existente. En la figura 29 se muestra un ejemplo.

Figura 29. Introducción al paradigma orientado a objetos.

Fuente http://www.itnuevolaredo.edu.mx/takeyas/Apuntes/POO/Apuntes/01.-%20Introduccion%20a
%20la%20POO.pdf

      Semánticamente, la herencia denota una relación “es un”, por ejemplo, un oso
es un mamífero, una casa es un bien inmueble. Los objetos en sí disponen de una
clase, atributo y método.

    El enfoque orientado a objetos dispone de sus respectivas diferencias con el


enfoque estructurado que se pueden observar en el siguiente cuadro:

Figura 30. Cuadro comparativo: enfoque


estructurado y enfoque orientado a objetos.

Fuente:
https://image.slidesharecdn.com/cuadrocomparativodeenfoqueestructuradoyenfoqueorientado-
131123193238-phpapp01/95/cuadro-comparativo-de-enfoque-estructurado-y-enfoque-orientado-2-
638.jpg?cb=1385235348
     A partir de las diferencias previamente establecidas para los dos paradigmas,
se puede determinar las ventajas y desventajas de que dispone la POO.

Tabla 1

Ventajas y desventajas de la Programación orientada a objetos.

Ventajas Desventajas

La implementación es detallada,
Curva de aprendizaje
puntual y coherente.

Se puede reutilizar el código en


La ejecución es más lenta.
distintas fases del programa.

La clase hija puede heredar código


Es fácil de modificar.
que no se usará.

Los datos son fáciles de proteger. La fase de diseño requiere tiempo.

Permite hallar fácilmente los errores El tamaño del programa


al dividir el problema en partes.

Las clases son independientes entre


sí.

Beneficios en diseño

Mantenimiento de software
Amplia documentación

Fuente https://ferestrepoca.github.io/paradigmas-de-programacion/poo/poo_teoria/index.html

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0
Unidad de Educación a Distancia

1.3.2. Definición de objeto, clase, atributo y método

     Objeto    

     Un objeto es el elemento básico de la POO. Todo objeto contiene un conjunto


de propiedades o atributos (datos que se almacenarán del mismo) y de
comportamientos que se conocen como métodos que representan las acciones
que se pueden hacer con el objeto.

     En el mundo de la programación orientada a objetos (POO), un objeto es el


resultado de la instanciación de una clase.

     Los objetos poseen características propias que los distinguen entre sí.

     Todos los objetos tienen acciones denominadas métodos asociados a ellos.

Ejemplo de objeto

   En la siguiente imagen podemos observar que hay cuatro perros, a estos perros
podemos ver como un objeto, ya que tienen características y acciones propias:

     Características        Acciones
     - Raza                         - Ladrar
     - Nombre                     - Comer
     - color                          - Ladrar
Figura 31.  Conjunto de perros.

Fuente: https://previews.123rf.com/images/ghenadie/ghenadie1704/ghenadie170400037/76873629
-conjunto-de-perros-de-perrito-de-dibujos-animados-simple-ilustraci%C3%B3n-vectorial.jpg

Características

     - Nombre
     - Edad
     - Genero
     - Estatura
     - Peso

Acciones

      - Saludar
      - Hablar
      - Comer
Figura 32.  Objeto.

Fuente: http://micanalsamuelc.blogspot.com/

Clase
    Es un modelo que permite la creación de un objeto, formado a partir de un
conjunto de variables y métodos. Puede ser utilizado en cualquier punto del
programa, basado en un nombre que las identifica, sus atributos y los métodos
que disponen. Las clases son la base del diseño orientado a objetos.

     Una clase no es un objeto, es solo una planilla, plano o definición para crear
objetos.

     A partir de una clase se pueden crear muchos objetos independientes con las
mismas características.

Figura 33. Paradigmas de programación.


Fuente: http://ferestrepoca.github.io/paradigmas-de-
programacion/poo/poo_teoria/images/philosophy.png

    Un objeto es declarado a partir de una clase, los datos y funciones son
encapsulados, un objeto es una instancia de una clase.

Figura 34.  Curso de programación POO

Fuente:
http://cdn.simplesite.com/i/5e/50/285415631240056926/i285415639416338167._szw480h1280_.jp
g

     Cada clase tendrá atributos y métodos propios específicos que darán
funcionalidad a los objetos creados. Tomemos como ejemplo un objeto vehículo el
cual será representado con el siguiente molde:

Figura 35. Programación orientada a objetos, POO.

Fuente: http://paginawebleon.mx/wp/programacion-orientada-a-objetos-poo/

     En un segundo ejemplo vamos a modelar a un profesor:


Figura 36.  Ejemplo de clase.

Fuente: https://www.google.com/url?
sa=i&source=images&cd=&cad=rja&uact=8&ved=2ahUKEwjO7M_j6J3nAhWrslkKHYXTA90QjB16
BAgBEAM&url=https%3A%2F%2Fslideplayer.es%2Fslide
%2F12956428%2F&psig=AOvVaw0rdNfRkfsp2V0TgasWRQwQ&ust=1580007455295209

Instanciar

      Es la creación o manifestación concreta de un objeto a partir de su clase.

Atributo
     Se trata de las propiedades que tiene un objeto, consideradas como tal las
características de las que dispone la clase como el nombre, el color, el modelo,
entre otras.

     Son controlados a través de la declaración de variables. Es muy importante


identificar el tipo de dato. Se debe seleccionar solo aquellos atributos necesarios
para el modelo planteado (abstracción).

     Los atributos son los datos que se van a almacenar de los objetos. Se declaran
de la siguiente manera:

     tipo nombreAtributo;

     int numero;

     float valorResultado;

     Dependiendo del lenguaje de programación se debe indicar el nivel de


accesibilidad de cada atributo, por concepto de encapsulamiento de la POO todo
atributo es privado. Más adelante se verán los niveles de accesibilidad.
Figura 37.  introducción a
la POO.

Fuente http://www.itnuevolaredo.edu.mx/takeyas/Apuntes/POO/Apuntes/01.-%20Introduccion%20a
%20la%20POO.pdf

Método
     Son mecanismos que permiten acceder a los atributos de un objeto. Son las
operaciones que es capaz de hacer un objeto, como en el caso de un automóvil se
puede acelerar, frenar, prender, moverse, abrirse, entre otros. En los métodos se
implementan los algoritmos, así mismo de cada método debe indicarse su nivel de
accesibilidad.

Figura 38. introducción a la POO.

Fuente http://www.itnuevolaredo.edu.mx/takeyas/Apuntes/POO/Apuntes/01.-%20Introduccion%20a
%20la%20POO.pdf

Ejemplos
      Se pide abstraer las características y métodos de los objetos presentados en
la siguiente imagen y representarlas en un molde.

Figura 39. Ejemplos de mesas.

Fuente: Pablo Parra

Figura 40. Modelado de mesa.

Fuente: Pablo Parra

     Los atributos son representados con un signo – esto quiere decir que son
privados, solo la clase los conoce.

     Los métodos son representados con un signo + que significa que son públicos.
     Se puede observar que son objetos mesas de los cuales podemos abstraer las
características que tienen: atributos: material, forma/modelo, color, entre otros.

     Métodos: moverla, ubicarObjetosSobre, ubicarObjetosBajo, crearMesa, entre


otros.

Figura 41.  Ejemplo de vasos.

Fuente: https://www.google.com/url?
sa=i&source=images&cd=&cad=rja&uact=8&ved=2ahUKEwjU--
ac7p3nAhVCj1kKHZe5CeQQjB16BAgBEAM&url=https%3A%2F%2Fwww.degaplast.com.ar
%2Fvaso-facetado-plastico-simil-vidrio-nair-320-color-x-72-unidades--det--
06010118&psig=AOvVaw1GPg4tfUVNGNxoUZmLMKu2&ust=1580011108608155

Figura 42.  Modelado de vaso.

Fuente: Pablo Parra

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0
Unidad de Educación a Distancia
2.1. Modelamiento de clases y objetos
     UML son las siglas de “Unified Modeling Language” o “Lenguaje Unificado de
Modelado”. Se trata de un estándar que han adoptado a nivel internacional
numerosos organismos y empresas para crear esquemas, diagramas y
documentación relativa a los desarrollos de software.

    UML no es un lenguaje propiamente dicho, sino una serie de normas y


estándares gráficos respecto a cómo se deben representar los esquemas relativos
al software.

   UML es una especificación de notación orientada a objetos. Se basa en las


anteriores especificaciones BOOCH, RUMBAUGH y COAD-YOURDON. Divide
cada proyecto en un número de diagramas que representan las diferentes vistas
del proyecto. Estos diagramas juntos son los que representan la arquitectura del
proyecto.

  UML permite describir un sistema en diferentes niveles de abstracción,


simplificando la complejidad sin perder información, para que tanto usuarios,
líderes y desarrolladores puedan comprender claramente las características de la
aplicación.

  UML se quiere convertir en un lenguaje estándar con el que sea posible modelar
todos los componentes del proceso de desarrollo de aplicaciones. Sin embargo,
hay que tener en cuenta un aspecto importante del modelo: no pretende definir un
modelo estándar de desarrollo, sino únicamente un lenguaje de modelado. Otros
métodos de modelaje como OMT (Object Modeling Technique) o Booch sí
definen procesos concretos. En UML los procesos de desarrollo son diferentes
según los distintos dominios de trabajo; no puede ser el mismo el proceso para
crear una aplicación en tiempo real, que el proceso de desarrollo de una aplicación
orientada a gestión, por poner un ejemplo.

Bloques básicos de construcción UML

Elementos. Abstracciones básicas e importantes del modelo.

          Elementos estructurales

          Elementos de comportamiento

          Elementos de agrupación


          Elementos de anotación

Relaciones que ligan elementos entre sí.

          Dependencia

          Asociación

          Generalización

          Realización

Diagramas. Agrupan colecciones interesantes de elementos.

          Clases                                       Estados

          Objetos                                      Actividades

          Casos de uso                             Componentes

          Secuencia                                  Despliegue

          Colaboración

Clasificación de diagramas

     Se dispone de dos tipos diferentes de diagramas: los que dan una vista estática
del sistema y los que dan una visión dinámica.

Figura 1. Clasificación de diagramas UML.

Fuente: Pablo Parra


2.1. Modelamiento de clases y objetos
     UML son las siglas de “Unified Modeling Language” o “Lenguaje Unificado de
Modelado”. Se trata de un estándar que han adoptado a nivel internacional
numerosos organismos y empresas para crear esquemas, diagramas y
documentación relativa a los desarrollos de software.

    UML no es un lenguaje propiamente dicho, sino una serie de normas y


estándares gráficos respecto a cómo se deben representar los esquemas relativos
al software.

   UML es una especificación de notación orientada a objetos. Se basa en las


anteriores especificaciones BOOCH, RUMBAUGH y COAD-YOURDON. Divide
cada proyecto en un número de diagramas que representan las diferentes vistas
del proyecto. Estos diagramas juntos son los que representan la arquitectura del
proyecto.

  UML permite describir un sistema en diferentes niveles de abstracción,


simplificando la complejidad sin perder información, para que tanto usuarios,
líderes y desarrolladores puedan comprender claramente las características de la
aplicación.

  UML se quiere convertir en un lenguaje estándar con el que sea posible modelar
todos los componentes del proceso de desarrollo de aplicaciones. Sin embargo,
hay que tener en cuenta un aspecto importante del modelo: no pretende definir un
modelo estándar de desarrollo, sino únicamente un lenguaje de modelado. Otros
métodos de modelaje como OMT (Object Modeling Technique) o Booch sí
definen procesos concretos. En UML los procesos de desarrollo son diferentes
según los distintos dominios de trabajo; no puede ser el mismo el proceso para
crear una aplicación en tiempo real, que el proceso de desarrollo de una aplicación
orientada a gestión, por poner un ejemplo.

Bloques básicos de construcción UML

Elementos. Abstracciones básicas e importantes del modelo.

          Elementos estructurales

          Elementos de comportamiento

          Elementos de agrupación

          Elementos de anotación

Relaciones que ligan elementos entre sí.

          Dependencia
          Asociación

          Generalización

          Realización

Diagramas. Agrupan colecciones interesantes de elementos.

          Clases                                       Estados

          Objetos                                      Actividades

          Casos de uso                             Componentes

          Secuencia                                  Despliegue

          Colaboración

Clasificación de diagramas

     Se dispone de dos tipos diferentes de diagramas: los que dan una vista estática
del sistema y los que dan una visión dinámica.

Figura 1. Clasificación de diagramas UML.

Fuente: Pablo Parra

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0
Unidad de Educación a Distancia
2.1.1. UML Diagrama de casos de uso
     Un caso de uso es una descripción de las acciones de un sistema desde el
punto de vista del usuario. Es una herramienta valiosa dado que es una técnica de
aciertos y errores para obtener los requerimientos del sistema, justamente desde
el punto de vista del usuario.

    Los diagramas de caso de uso modelan la funcionalidad del sistema usando


actores y casos de uso. Los casos de uso son servicios o funciones provistas por
el sistema para sus usuarios.

     Permiten facilitar la comprensión de la estructura y funcionamiento a cualquier


medio de manera gráfica.

Figura 2.  Simbología de casos de uso.

Fuente: http://www.antonionavas.info/blog/wp-content/uploads/2016/01/requerimientos6-
simbologia.jpg

Sistema

    El rectángulo representa los límites del sistema que contiene los casos de uso.
Los actores se ubican fuera de los límites del Sistema.

     A continuación, se analiza el caso de uso de un cliente en un restaurante de


comida. Como se aprecia, el crítico de comida (cliente) no prepara su comida.
Figura 3. Sistema de casos de uso.

Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/3.png

Caso de uso

    Se representa con óvalos. La etiqueta en el óvalo indica la función del sistema.

Figura 4.  Casos de uso.

Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/4.png

Actor 

    Un diagrama de caso de uso contiene los símbolos del actor y del caso de uso,
junto con líneas conectoras. Los actores son similares a las entidades externas;
existen fuera del sistema. El término actor se refiere a un rol específico de un
usuario del sistema.
Figura 5.  Actor que inicia el caso de uso.

Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/5.png

Relaciones

    Las relaciones entre un actor y un caso de uso se dibujan con una línea simple.
Para relaciones entre casos de uso, se utilizan flechas etiquetadas “incluir” o
“extender”. Una relación “incluir” indica que un caso de uso es necesitado por otro
para poder cumplir una tarea. Una relación “extender” indica opciones alternativas
para un cierto caso de uso.

Figura 6. Ejemplo de casos de uso.

Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/esta.png

Relaciones de los casos de uso


   Las relaciones activas se conocen como relaciones de comportamiento y se
utilizan principalmente en los diagramas de casos de uso. Hay cuatro tipos básicos
de relaciones de comportamiento: comunica, incluye, extiende y generaliza.

Figura 7. Relaciones entre los casos de uso.

Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/8.png

 Documentación de los casos de uso

     Existen dos formas principales de documentar un caso de uso:

 Un diagrama en UML
 Un documento detallado

      Documentar casos de uso no es una tarea fácil que se pueda dominar de un
día para otro, requiere de tiempo, disciplina y experiencia, sin embargo, podemos
definir una serie de pasos identificables para escribir los casos de uso.

Figura 8. Pasos para la


documentación de los casos de uso.

Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/9.png

Formato de la documentación de caso de uso para los actores que participen


Figura 9.  Documentación
de los actores dentro de los casos de uso.

Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/10.png?w=646&h=373

Documentación de un caso de uso

Figura 10. Documentación de los casos de


uso.

Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/11.png

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0
Unidad de Educación a Distancia
2.1.2.  UML Diagrama de clases
     En UML, una clase se representa con un rectángulo que posee tres divisiones:
nombre de la clase, atributos que tiene y métodos.

 En el primero de los cuadros se anota el nombre de la clase. Si es


abstracta, se escribe en letra cursiva o también se utiliza
un estereotipo como < > arriba del nombre de la clase.

 En la segunda parte van los atributos o variables de instancia; las


variables de clase van subrayados.

 En el último cuadro se escriben los métodos, es decir, las operaciones que


puede realizar.

     Debemos tener en cuenta que una clase que no tiene comportamiento no está
comunicando qué tipo de rol cumple en la solución, así que o está faltando definir
qué es lo que le puedo pedir, o entonces esa clase no debería estar en el
diagrama.

Figura 11.  Ejemplo de clases y objetos.

Fuente: https://2.bp.blogspot.com/-
GNHmDKzeqcI/WJj8EFzPbxI/AAAAAAAABZ8/iH9R4gmpdMUsYaOGLU3TYW_oB9nTyECXwCK4
B/s640/elementos.PNG

Relaciones

     Los tipos más importantes de relaciones entre clases son los siguientes:

Asociación

    Las relaciones de asociación, representan un conjunto de enlaces entre objetos


o instancias de clases. Es el tipo de relación más general y denota básicamente
una dependencia semántica. Por ejemplo, una persona trabaja para una empresa. 

     Cada asociación puede presentar elementos adicionales que doten de mayor
detalle al tipo de relación:
 Rol o nombre de la asociación, que describe la semántica de la relación en
el sentido indicado. Por ejemplo, la asociación entre persona y empresa
recibe el nombre de trabaja para, como rol en ese sentido.
 Multiplicidad, que describe la cardinalidad de la relación, es decir, especifica
cuántas instancias de una clase están asociadas a una instancia de la otra
clase. Los tipos de multiplicidad son: uno a uno, uno a muchos y muchos a
muchos.

Herencia

    Las jerarquías de generalización/especialización se conocen como herencia.


Herencia es el mecanismo que permite a una clase de objetos incorporar atributos
y métodos de otra clase, añadiéndolos a los que ya posee.

Agregación 

    La agregación es un tipo de relación jerárquica entre un objeto que representa


la totalidad de ese objeto y las partes que lo componen. Permite el agrupamiento
físico de estructuras relacionadas lógicamente. Los objetos “son-parte-de” otro
objeto completo. Por ejemplo, motor, ruedas, carrocería son parte de automóvil.

Composición 

    La composición es una forma de agregación donde la relación de propiedad es


más fuerte, e incluso coinciden los tiempos de vida del objeto completo y las
partes que lo componen. Por ejemplo, en un sistema de máquina de café́ , las
relaciones entre la clase máquina y producto o entre máquina y depósito de
monedas son de composición.

Dependencia

    Una relación de dependencia se utiliza entre dos clases o entre una clase y una
interfaz e indica que una clase requiere de otra para proporcionar alguno de sus
servicios.

Interfaces

     Una interfaz es una especificación de la semántica de un conjunto de


operaciones de una clase o paquete que son visibles desde otras clases o
paquetes. Normalmente, se corresponde con una parte del comportamiento del
elemento que la proporciona.

Paquetes

    Los paquetes se usan para dividir el modelo de clases del sistema de


información, agrupando clases u otros paquetes según los criterios que sean
oportunos. Las dependencias entre ellos se definen a partir de las relaciones
establecidas entre los distintos elementos que se agrupan en estos paquetes.
Notación general

     Las diferentes propiedades de la relación se pueden representar con la


siguiente notación:

 Multiplicidad. La multiplicidad puede ser un número concreto, un rango o


una colección de números. La letra ‘n’ y el símbolo ‘*’ representan cualquier
número.
 Orden. Se puede especificar si las instancias guardan un orden con la
palabra clave ‘{ordered}’. Si el modelo es suficientemente detallado, se
puede incluir una restricción que indique el criterio de ordenación.
 Navegabilidad. La navegación desde una clase a la otra se representa
poniendo una flecha sin relleno en el extremo de la línea, indicando el
sentido de la navegación.
 Rol o nombre de la asociación. Este nombre se coloca junto al extremo
de la línea que está unida a una clase, para expresar cómo esa clase hace
uso de la otra clase con la que mantiene la asociación.

Figura 12.  Notación


general.

Fuente: https://manuel.cillero.es/wp-content/uploads/2013/11/asociacion.png

Notaciones específicas

 Agregación. Se representa con un rombo hueco en la clase cuya instancia


es una agregación de las instancias de la otra.
 Composición. Se representa con un rombo lleno en la clase cuya instancia
contiene las instancias de la otra clase.
 Dependencia. Una línea discontinua con una flecha apuntando a la clase
cliente. La relación puede tener un estereotipo que se coloca junto a la línea
y entre el símbolo: << ... >>.
 Herencia. Esta relación se representa como una línea continua con una
flecha hueca en el extremo que apunta a la superclase.
Figura 13. Notaciones de clases.

Fuente: https://manuel.cillero.es/wp-content/uploads/2013/11/tipos-asociacion.png

Interfaces

     Una interfaz se representa como una caja con compartimentos, igual que las
clases. En la zona superior se incluye el nombre y el estereotipo <>. La lista de
operaciones se coloca en la zona inferior, igual que en las representaciones de
clases. La zona en la que se listan los atributos estará vacía o puede omitirse.

     Existe una representación más simple para la interfaz: un círculo pequeño


asociado a una clase con el nombre de la interfaz debajo. Las operaciones de la
interfaz no aparecen en esta representación; si se quiere que aparezcan, debe
usarse la primera notación.

     Entre una clase que implementa las operaciones que una interfaz ofrece y esa
interfaz se establece una relación de realización que, dependiendo de la notación
elegida, se representará con una línea continua entre ellas cuando la interfaz se
representa como un círculo y con una flecha hueca discontinua apuntando a la
interfaz cuando se represente como una clase.
Figura 14.  Interfaces.

Fuente: https://manuel.cillero.es/wp-content/uploads/2013/11/clase-interfaz.png

Paquetes

   Los paquetes se representan mediante un icono con forma de carpeta y las


dependencias con flechas discontinuas entre los paquetes dependientes.

Ejemplo

    Juanito necesita realizar un diagrama de clases que modele la reproducción de


un CD musical, si se conoce que el CD tiene un título y fecha de edición, y que
contiene canciones de las que se conoce el título y la duración de estas, así como
se puede obtener la duración total en un reproductor de CD que permite detener,
reproducir, adelantar y retroceder.

Solución

1. Extraer todos los sustantivos que aparecen en el enunciado, escríbelos en


singular, y que pueden ser, por lo tanto, una clase, es lo siguiente:
CD    Reproductor    CD      Canción        Juanito

2. Tras identificar todas las posibles clases que se extraen de forma directa
del enunciado pasamos a eliminar aquella que no aporta nada para modelar
el problema. 

a. En este caso se eliminaría a Juanito por no aportar ninguna característica al


problema.
b. Tras quedarnos con las clases candidatas se debe identificar los atributos
de la clase, para lo cual se debe observar los posibles valores.
c. El CD tiene atributos que son el título y fecha de edición para lo cual está
representada con el símbolo (-) que significa privado y el tipo de dato que
va a almacenar.

3. A continuación, recogemos las operaciones de una clase en nuestro


enunciado.

a. En la clase reproducción vemos que tenemos reproducir (), detener (),


adelantar (), retroceder.
b. A diferencia de los atributos, se ubica el símbolo + que significa público y el
tipo de método va a hacer y en el CD obtener duración total ().
c. A continuación, ubicamos las diferentes relaciones entre las clases
modeladas dependiendo de cada enunciado y comportamiento del mundo
real.
d. Luego, vemos cómo queda el respectivo diagrama de clases.
Figura 15. Ejemplo de paquete.

Fuente: Pablo Parra

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0
Unidad de Educación a Distancia

2.1.3. Identificar clases de un sistema. Uso correcto de


identificadores
Identificadores 

    Son los nombres que pueden tener las clases, los métodos y las variables y no
pueden contener espacios ni caracteres especiales.

Tabla 1

Tipos de identificadores

Tipo de identificador Convención Ejemplo

Clase Comienza con mayúscula. HolaMundoOO


Método Comienza con minúscula. mostrarSaludo ()

Variable Comienza con minúscula. Saludo

Fuente: http://www.cursodejava.com.mx/cursodejava105.html

    Si el identificador está formado por más de un vocablo, a partir del segundo las
iniciales deben ser mayúsculas. Además, se recomienda que los nombres de las
clases sean sustantivos, los de los métodos verbos y que las variables expresen
con claridad su contenido.

2.1.5. Implementación de clases


     Debemos crear una clase antes de poder crear objetos (instancias) de esa
clase. Al crear un objeto de una clase, se dice que se crea una instancia de la
clase o un objeto propiamente dicho.

     La implementación se compone de la declaración de la clase y el cuerpo de la


clase.

    La estructura de una clase es:

Figura 16. Estructura de
clase.

Fuente: Pablo Parra

Ejercicio 1

   Se desea crear una aplicación que permita jugar a dos jugadores, en la cual los
usuarios ingresan por teclado su userName, y cada jugador tiene un puntaje inicial
de 100 puntos.

   Su trabajo es acertar la raíz cuadrada de un número, en caso de que el usuario


digite incorrectamente la raíz del número a encontrar, el programa indica si el
número es menor o mayor y le resta 10 puntos de puntaje de cada jugador.
   El programa termina cuando uno de los dos jugadores ingresa la raíz correcta o
se queda sin puntaje.

Figura 17.  Ejemplo de estructura de clase.

Fuente: Pablo Parra

Ejercicio 2

   Se necesita realizar el modelado de una aplicación para los Cevichochos del Sur
que solicita realizar una aplicación que le permita conocer cuántos cevichochos
puede preparar si se conoce la cantidad de materia prima que dispone. Para
preparar se conoce lo siguiente:

     Que por cada tres platos de cevichochos necesita: 0,250 gramos de chochos,
0,100 gramos de especies (curtido, jugo tomates, chifles, cueros).

    Se considera que solo ocupan dos ingredientes.

Figura 18.  Ejemplo de estructura de clase.

Fuente: Pablo Parra

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0
Unidad de Educación a Distancia
3.1. Introducción
     Cuando hablamos de un programa en Informática, estamos haciendo
referencia a un software. Un programa es un conjunto de aplicaciones y recursos
que permite desarrollar diferentes tareas en una computadora (ordenador), un
teléfono u otros equipos tecnológicos.

    Para desarrollar un programa informático, se necesita usar un lenguaje de


programación que posibilita el control de las máquinas. A través de diversas reglas
semánticas y sintácticas, estos lenguajes especifican los datos que transmite el
software y que tendrá que operar la computadora.

    Un programa (sea informático o no) está compuesto por cuatro partes bien
diferenciadas:

Código. Es el conjunto de instrucciones en sí. Normalmente, el código está escrito


de forma que sea fácil de entender y manipular por una persona.

Memoria. Ofrece un espacio al programa para almacenar datos y recuperarlos


más tarde.

Entrada. Es el conjunto de datos que el programa recibe mientras se ejecuta y


que condicionan las acciones que este realiza y, en consecuencia, los resultados
que genera. Normalmente, los datos proceden del usuario (pulsaciones del
teclado, movimientos y pulsaciones del ratón, etc.), pero también pueden venir de
otros programas. En este último caso tenemos, por ejemplo, los datos enviados
por un servidor web a nuestro navegador.

Salida. Es el conjunto de datos generados en forma de resultado durante la


ejecución del programa. Estos datos pueden percibirse como acciones desde el
punto de vista del usuario. Los resultados pueden ser variopintos: un número, una
hoja de papel impresa, una imagen en la pantalla, etc.

Ejemplo

    Para entender mejor los conceptos anteriormente mencionados tomemos de


referencia a una lavadora:
Figura 1. Lavadora.

Fuente: https://es.123rf.com/photo_95127144_lavadora-de-dibujos-animados-y-lavander
%C3%ADa.html

    El código son las distintas acciones que la lavadora lleva a cabo, que
dependen, ni más ni menos, del programa elegido y de las entradas (la cantidad
de detergente, suavizante, lejía y la ropa sucia). La salida, en este caso, está
clara: la ropa lavada. Que esté más o menos limpia dependerá del tipo de ropa, de
cómo estaba de sucia, del programa que hayamos escogido y de la cantidad de
producto que hayamos usado, en fin, de las entradas. Por otro lado, la lavadora
también usa la memoria para saber en qué punto está dentro del programa
seleccionado, el tiempo que le queda para pasar al siguiente estadio de lavado,
etc.

    Para entender mejor el tema es necesario conocer una definición básica sobre
Java. Según el portal Definición, “Java es un lenguaje de programación orientado
a objetos que se incorporó al ámbito de la Informática en los años noventa. La
idea de Java es que pueda realizarse programas con la posibilidad de ejecutarse
en cualquier contexto, en cualquier ambiente, siendo así su portabilidad uno de
sus principales logros…”.
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir
igual 4.0
Unidad de Educación a Distancia

3.1.1. Lenguajes de programación más utilizados


Existen tres tipos de lenguajes claramente diferenciados: el lenguaje máquina, los
lenguajes de bajo nivel y los de alto nivel.

 El lenguaje máquina. Es el lenguaje de programación que entiende


directamente la máquina (computadora). Este lenguaje de programación
utiliza el alfabeto binario, es decir, el 0 y el 1. 
 Lenguajes de programación de bajo nivel. Son mucho más fáciles de
utilizar que el lenguaje máquina, pero dependen de la máquina o
computadora como sucedía con el lenguaje máquina. 
 Lenguajes de programación de alto nivel. Son más fáciles de aprender
porque se usan palabras o comandos del lenguaje natural, generalmente
del inglés.

Figura 2. Lenguajes de programación.

Fuente: https://codigoonclick.com/mejores-lenguajes-programacion-para-2018/

C++

    Es un lenguaje orientado a objetos, aunque también tiene las mismas


características que C, como por ejemplo, su eficiencia y el uso de punteros.

    Como es lógico, y debido a que se creó a partir de C, C++ cuenta con diversas
mejoras y avances respecto de C, lo que le hace un lenguaje más completo y es
por ello que los programadores tienden a programar más en este lenguaje. Un
programa en C++ soporta instrucciones escritas en C, pero un programa escrito en
C no nos permite ejecutar instrucciones de C++, por lo que viéndolo de esta forma
resulta más cómodo programar en C++.

    Es un lenguaje muy popular debido a la eficiencia y robustez de sus programas.


También nos permite realizar programas estructurados, lo cual nos da libertad a la
hora de programar.
    Es un lenguaje compilado, es decir, compila directamente al código que
entienden los ordenadores por lo que es uno de los lenguajes más rápidos. Es
portable al gran número de compiladores que permiten utilizar los programas en
diversos ordenadores con diferentes sistemas operativos.

    Soporta varios paradigmas de programación. Un paradigma de programación es


una forma de pensar a la hora de programar, el más utilizado es el paradigma de
programación orientada a objetos.

Java

    Java nace en 1991 con el nombre "OAK", posteriormente cambiado por Green
por problemas legales y finalmente con la denominación actual JAVA.

    Es un lenguaje orientado a objetos. Un objeto se compone de atributos (estado


del objeto) y métodos (comportamiento) que actúan sobre esos atributos. Para
comprender lo que es un objeto, relacionemos a este con una analogía del mundo
real. Al igual que en el mundo virtual, en el mundo real los objetos tienen un
estado y un comportamiento. Por ejemplo, un coche es un objeto que tiene una
serie de estados o atributos (matrícula, marca, modelo, color, marchas) y una serie
de comportamientos o métodos (corriendo, parado, aparcando, cambio de
marcha). Todos los objetos tienen un identificador único que los diferencia del
resto de objetos. En el ejemplo anterior el identificador del coche es la matrícula.

    Posee modularidad que permite dividir los programas en pequeños módulos
denominados clases, para reducir la complejidad del problema y, en caso de
producirse un fallo, este solamente afecta al módulo donde se produjo y no a todo
el programa.

    Es robusto, es decir, es un lenguaje de programación fiable que reacciona


adecuadamente ante situaciones excepcionales.

    Es un lenguaje de programación portable que nos permite utilizar los programas
desarrollados en Java en cualquier ordenador con cualquier sistema operativo.

    Es dinámico, podemos compilar y ejecutar los programas en tiempo real, y


seguro, ya que elimina los accesos ilegales a memoria que realizan los punteros
en C.

    En definitiva, Java es uno de los lenguajes más utilizados actualmente ya que
podemos reutilizar el código de los programas y su arquitectura neutral nos
permite utilizarlo en cualquier arquitectura y sistema operativo independientemente
de la máquina en que se realizó el programa. Es un lenguaje fácil de aprender lo
que reduce los tiempos de formación y aprendizaje de las personas que lo vayan a
utilizar.

Python
    Python fue creado a finales de los ochenta por Guido van Rossum en CWI en
los Países Bajos como un sucesor del lenguaje de programación ABC, capaz de
manejar excepciones e interactuar con el sistema operativo Amoeba. Van Rossum
es el principal autor de Python, y su continuo rol central en decidir la dirección de
Python es reconocido, refiriéndose a él como Benevolente dictador vitalicio o
Benevolent Dictator for Life (BDFL).

    Se dice que Python es un lenguaje multiparadigma ya que soporta diversos


tipos de paradigmas de programación como son la orientación a objetos, la
programación imperativa o, en menor medida, la programación funcional.

    En cuanto al código, es un lenguaje simple y sencillo con instrucciones claras y


fáciles de leer. Se utilizan clases y sentencias de control, sin embargo, no
presenta encapsulación. Se pueden escribir instrucciones en código C para poder
ejecutar el código de una manera más rápida, por lo que Python es compatible con
instrucciones de C. También cabe destacar que es un lenguaje interpretado por lo
que no es necesario compilar el código antes de ejecutarlo, lo cual reduce los
tiempos de espera.

    Es un lenguaje tipificado que cuenta con un gran número de librerías, tipos de
datos y funciones que sirven de mucha ayuda al programador y simplifican su
trabajo.

    Uno de los aspectos más importantes es que se trata de un lenguaje libre y
gratuito por lo que se pueden realizar copias del software y modificarlo como se
quiera con tal de mejorarlo. Como consecuencia de ello existen diversas versiones
de Python.

    Se utiliza con mucha frecuencia gracias a que es un lenguaje de propósito


general que nos permite realizar desde cualquier tipo de programa hasta
desarrollar páginas web.
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir
igual 4.0
Unidad de Educación a Distancia

3.2. Estructura de un programa

3.2. Estructura de un programa


    En el mundo de la programación, la estructura del programa consiste en un
conjunto de sentencias con su respectiva sintaxis que se aplica de manera general
al momento de la creación de un programa en cualquier lenguaje de
programación.
    Una sentencia es una unidad ejecutable más pequeña de un programa. En
otras palabras, una línea de código escrita es una sentencia. Especifica y controla
el flujo y orden de ejecución del programa. Una sentencia consta de palabras
clave o reservadas como cout, cin, for, while, if ... else, etc., expresiones,
declaraciones o llamadas a funciones. Si no existen sentencias específicas de
selección o salto, el programa se ejecuta de forma secuencial en el mismo orden
en que se ha escrito el código fuente (es el que podríamos considerar orden
"natural" de ejecución).

    Las sentencias se ejecutan evaluando la expresión. Todos los efectos


colaterales de la evaluación son tenidos en cuenta antes de ejecutar la próxima
sentencia. La mayoría de sentencias son asignaciones o llamadas a funciones. Un
caso especial es la sentencia nula; consiste en un punto y coma (;) aislado. Una
sentencia nula no hace nada, pero puede ser necesaria en situaciones en que la
sintaxis del lenguaje espere una sentencia pero nuestro programa no necesita
hacer nada.

    Pueden existir infinitas sentencias distintas e innumerables criterios para su


clasificación. Las clases de sentencia son:

 De etiqueta
 De expresión
 Compuestas
 De selección
 De iteración
 De salto
 De declaración
 Bloques de intento
 Sentencias de pre proceso
 Sentencias ensamblador

Sentencias de etiqueta

    Existen tres clases de sentencias etiquetadas: las etiquetas directas, las
sentencias case y las default, estas últimas se utilizan en conjunción con las
sentencias switch.

Sentencias de expresión

    Podríamos decir que son las que no pertenecen a ninguno de los otros grupos y
que, en la práctica, son las más abundantes. Generalmente son asignaciones o
invocaciones de funciones. Ejemplo:
          Figura 3. Sentencias.
Fuente: https://www.ecured.cu/Sentencias_(Programaci%C3%B3n)

Sentencias compuestas

    Las sentencias compuestas, también denominadas bloques, se utilizan en


aquellas situaciones en que la sintaxis espera una sentencia pero se necesita usar
varias. Ejemplo:

 
Figura 4. Sentencias.

Fuente: https://www.ecured.cu/Sentencias_(Programaci%C3%B3n)

    En caso de cumplirse la condición hay que incrementar x, lo que puede hacerse
en una sola sentencia, pero si la condición resulta falsa, se precisan dos
computaciones. Para que se comporten como una sola frente a else, se recurre a
englobarlas en un bloque entre llaves { ... }. Las sentencias dentro del bloque se
comportan como una sola y constituyen un ámbito léxico. Los identificadores
definidos en su interior eclipsan a los exteriores y las variables automáticas
creadas en él son destruidas al salir del ámbito.

Sentencias de iteración

    Las sentencias de iteración permiten repetir un conjunto de sentencias


ejecutando un bucle. En C++ existen tres formas de iteraciones: los bucles while,
do…while y for. Ejemplo:

Figura 5. Sentencias.

Fuente: https://www.ecured.cu/Sentencias_(Programaci%C3%B3n)

Sentencias de salto

    Las sentencias de salto permiten transferir el control del programa de forma
incondicional. Existen cuatro de estas sentencias: break, goto start, continue y
return. Ejemplo:

 
Figura 6. Sentencias.
Fuente: https://www.ecured.cu/Sentencias_(Programaci%C3%B3n)

Sentencias de declaración

    Este tipo de sentencias introducen uno o más identificadores en un bloque.


Ejemplo:

Figura 7. Sentencias.

Fuente: https://www.ecured.cu/Sentencias_(Programaci%C3%B3n)

Bloques de intento

    Estas sentencias deben estar seguidas de una sentencia catch y tienen la
forma:

Figura 8. Sentencias.

Fuente: https://www.ecured.cu/Sentencias_(Programaci%C3%B3n)
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir
igual 4.0
Unidad de Educación a Distancia

3.2.1. El lenguaje de programación Java


     El lenguaje Java, como la mayoría de lenguajes de programación, requiere una
estructura mínima que acoja el programa y sus componentes. En el caso concreto
de Java, a esta estructura mínima se le llama clase (estructura donde ocurren los
procesos lógicos del programa). A continuación, se muestra la estructura mínima
de una clase ejecutable.

Figura 9. Introducción a la programación.

Fuente: http://downloads.gvsig.org/download/documents/learning/collaborations/ce_1104_01/Progr
amacion_personalizacion_SIG_1.pdf

    En la figura 9, el código define una clase (class) llamada “Programa” con una
función “main”, que será la que se ejecutará al iniciar el programa. El nombre de la
clase ha sido escogido arbitrariamente (es decir, puede cambiarse); no así el
nombre de la función, que siempre deberá llamarse “main”. Las funciones son
simples agrupaciones (funcionales) de código. Este programa deberá guardarse
en un fichero que se llame como la clase más el sufijo .java; en este caso,
“Programa.java”. El código del programa deberá ir entre las llaves de la función
“main”.

En el siguiente programa:
 

Figura 10. Introducción a la programación.

Fuente: http://downloads.gvsig.org/download/documents/learning/collaborations/ce_1104_01/Progr
amacion_personalizacion_SIG_1.pdf

    El código de la figura 10 calcula la distancia recorrida por un vehículo a partir de


su velocidad y el tiempo que ha estado circulando. El texto precedido por doble
barra (//) son comentarios. Los comentarios son simples anotaciones que el
programador hace en el código del programa para facilitar su comprensión. Los
comentarios no se ejecutan. La última línea usa la función “System.out.println”
para escribir el resultado en la pantalla. Como puede apreciarse, todas las
variables se han declarado al inicio del código. A diferencia de otros lenguajes, en
Java las variables pueden declararse en cualquier parte del código, siempre y
cuando la declaración preceda a su uso. Sin embargo, es una práctica habitual
declararlas al principio del código para mejorar su legibilidad.

3.5. Tipos de datos, primitivos y referenciados

3.5. Tipos de datos, primitivos y referenciados


    Un tipo de dato representa un conjunto de valores que significan lo mismo, un
atributo el cual representa la clase de datos que se está utilizando, sin embargo,
hay algunos tipos que no representan valores en la aplicación que se ejecutan.

    Cuando se utilizan tipos entre los objetos estos no pueden intercambiarse,
bueno, o al menos no totalmente ya que pueden lograrse intercambiar de formas
muy limitadas.

    Un tipo de dato es una característica de datos que especifica cómo debe
trabajarse el mismo dentro de un entorno, esto incluye si se deben aplicar
restricciones o alguna operación específica para este tipo de dato.
    Se debe tener en cuenta que la buena comprobación de tipos impide que se
mezclen abstracciones.

    La manera de comprobar los tipos es agrupar en tres clases: estático, dinámico
y estricto, este último suele tratarse como un tipo estático.

Tipo estático

    Los datos de tipo estático son expresados en tiempo de compilación con esto se
dice que mediante un análisis de compilación puede determinarse el tipo de dato.

    El tipo de dato estático puede llegar a ser muy restrictivo, pero detecta
anomalías en tiempo de compilación.

    Los lenguajes que utilizan un tipado estático son C++, Java, C#.

Figura 45. Tipos de datos.

Fuente: https://laraveles.com/series/poo/tipos-datos-programacion-orientada-objetos/

    El tipo estático permite que los errores sean detectados antes de la ejecución,
haciendo así la aplicación más eficiente.

Tipo estricto

    Todas las expresiones son consistentes en tiempo de compilación, es decir,


asegura que no se asigne accidentalmente un tipo de valor incorrecto a una
variable, por esta razón es que suele tratarse como un tipo de dato estático. El tipo
de dato estricto también se encarga de que no se accedan a propiedades o
métodos que no pertenezcan al tipo de objeto.

Consistencia
    La consistencia es una cualidad que tiene un objeto que resiste sin corromperse
fácilmente.

    La consistencia se define a través de tres restricciones fundamentales:

 Restricción de declaración. Indica que todas las entidades deben tener un tipo
declarado.
 Restricción de compatibilidad: El tipo fuente debe ser compatible con el tipo de
destino.
 Restricción de llamada a característica. Para poder llamar a un atributo o método
X desde la clase Y, X tiene que estar definida en la clase Y o en sus antecesores.

Pesimismo

    Se llama así cuando se tienen operaciones con tipos las cuales creemos estar
seguros que funcionaran o serán válidas siempre, pero si no se está seguro es
preferible que no se permita.

Tipo dinámico

    En este tipo de dato las comprobaciones se realizan en tiempo real, es decir, en
tiempo de ejecución. Esto permite que una variable tome valores de tipos
diferentes en diferentes momentos. Los lenguajes que podemos mencionar que
utilizan este tipado son Phyton y PHP.

Figura 46. Tipos de datos.

Fuente: https://laraveles.com/series/poo/tipos-datos-programacion-orientada-objetos/

     En la siguiente tabla se resumen los tipos de datos en Java.


Figura 47. Tipos de datos Java.

Fuente: https://www.aprenderaprogramar.com/index.php?
option=com_content&view=article&id=419:tipos-de-datos-java-tipos-primitivos-int-boolean-y-objeto-
string-array-o-arreglo-variables-cu00621b&catid=68&Itemid=188
Tipo referenciado

    Los tipos de datos referencia o referenciados indican que vamos a trabajar con
instancias de clases, no con tipos primitivos. De esta manera, una variable de tipo
referencia establece una conexión hacia un objeto, y a través de esta conexión
podemos acceder a sus métodos y atributos.

    Las variables de tipo primitivo nos permiten almacenar valores primitivos como
números o caracteres. Las variables de tipo referencia NO almacenan valores,
sino que nos permiten acceder a métodos y atributos de un objeto.

    Además, algo importante a tener en cuenta es que el tipo de referencia debe ser
compatible al tipo de objeto al que se refiere.

Figura 48. Tipos de datos.

Fuente: http://ayudasprogramacionweb.blogspot.com/2012/12/tipos-de-datos-referencia-y-
ejemplos-java.html

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia


4.1. Introducción
    El presente capítulo se estudiará el paradigma de programación orientada a
objetos (POO). Lo primero que distingue a un lenguaje orientado a objetos de
otros lenguajes no orientados a objetos es el concepto de clase, definiéndola
como un nuevo tipo de dato. Cuando se define el dato o atributo de la clase, este
se lo utilizará para crear o instanciar objetos de dicho tipo de atributo. El objeto o
instancia es el segundo concepto que se puede distinguir a los lenguajes
orientados a objetos del resto.

    El programador por su habilidad debe utilizar el lenguaje que se centre en el


paradigma orientado a objetos, diseñando su trabajo en la abstracción y diseño de
clases con la utilización previamente de constructores, métodos de
encapsulamiento, que se observaré en el presente documento, como elementos
primordiales en la creación o definición de una clase que servirá para crear
posteriormente objetos o instancias.

   Mediante el correcto diseño de la clase, el programador describirá los atributos y


el comportamiento que tendrán todos los objetos pertenecientes a dicha clase, es
decir, que sean instancias de la misma.

4.3. Tipos de constructores


  Una clase puede contener uno o varios constructores, es decir, definir algunos
constructores diferentes por el número o tipo de parámetros que reciben.

    Los constructores pueden ser: vacío o por defecto, común o con parámetros y
de copia.

4.2. Constructores

4.2. Constructores
    Los constructores son métodos públicos especiales en Java que sirven para
inicializar valores en instancias de objetos que llevan el mismo nombre de la clase,
se invocan automáticamente al momento de crear o instanciar el objeto de la
clase. Las principales características de los constructores son:

• No devuelven nada, no siquiera void.


• Pueden existir uno o varios.
• Tienen el mismo nombre de la clase. 
• De entre los que se hayan creado, tan solo uno se ejecutará al crear una
instancia de un objeto de la clase.
    La función es de asignar memoria al objeto que se está creando e inicializar sus
datos como se muestra en la figura 1.

Figura 1. Constructores.

Fuente: Pablo Parra

    Es conveniente que haya al menos un constructor, si no existen se crea


por Default o por defecto sin parámetros que inicializan los atributos por defecto.

    Nota. Se puede usar para establecer valores iniciales para los atributos de
objeto.

    Pueden existir varios tipos de constructores en una clase, si tienen diferentes


listas de parámetros que se indicarán a continuación.

4.3.1. Constructor vacío o por defecto


    El constructor sin parámetros es llamado constructor vacío. Sino se define
ningún constructor, el compilado crea un constructor por defecto, por lo que se
debe proporcionar en el código valores iniciales según los tipos de datos de la
clase como se indica en la figura 2.
Figura 2.  Constructor sin parámetros.

Fuente: Pablo Parra

    Nota. La palabra reservada this hace referencia al objeto que realiza la


operación cuya implementación especifica el método.

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

4.3.2. Constructor común o con parámetros


    El constructor con parámetros se lo conoce como constructor parametrizado y
es aquel que recibe como datos primitivos y/o referencias de la clase sus propios
valores. Habitualmente se utilizan para iniciar los atributos como se muestra en la
figura 3.
Figura 3.  Constructor con parámetros.

Fuente: Pablo Parra

    Cuando se utilizan constructores con parámetros surge la necesidad de


inicializar algún atributo o campo perteneciente a la clase. En el caso de la figura
3, dentro del constructor se desea asignar valores a los campos de la clase. Para
tener total acceso a los campos de la clase se utiliza el vocablo this, al empezar la
sintaxis con lo cual se está haciendo alusión a los campos de la clase. (García
Hernández, E., 2017).

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

4.3.2. Constructor común o con parámetros


    El constructor con parámetros se lo conoce como constructor parametrizado y
es aquel que recibe como datos primitivos y/o referencias de la clase sus propios
valores. Habitualmente se utilizan para iniciar los atributos como se muestra en la
figura 3.
Figura 3.  Constructor con parámetros.

Fuente: Pablo Parra

    Cuando se utilizan constructores con parámetros surge la necesidad de


inicializar algún atributo o campo perteneciente a la clase. En el caso de la figura
3, dentro del constructor se desea asignar valores a los campos de la clase. Para
tener total acceso a los campos de la clase se utiliza el vocablo this, al empezar la
sintaxis con lo cual se está haciendo alusión a los campos de la clase. (García
Hernández, E., 2017).

4.3.3. Constructor de copia


    El constructor de copia es aquel que recibe como parámetros un objeto de la
misma clase del cual se realiza una copia exacta de sus datos. (Calva & Asanza,
2015).

   El constructor de copia solo tiene un argumento o parámetro, que es una


referencia a un objeto de su misma clase. En general, los constructores copia
tienen la siguiente forma para sus prototipos:
Figura 4. Constructor de copia.

Fuente: Pablo Parra

Figura 5. Constructor de copia.

Fuente: Calva & Asanza, 2015

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

4.3.4. Operador “this”


    Un método miembro de un objeto está asociado al objeto. Cuando este se está
ejecutando se debe usar this, para conseguir una referencia al objeto asociado.

    Dentro del método constructor, se usará this para acceder al nombre del objeto


asociado. La palabra clave this funciona igual dentro de un constructor como se
presenta en el siguiente ejemplo en la figura 6.
Figura 6.  Constructor con parámetros. Ejemplo.

Fuente:http://www.edu4java.com/es/java/constructores-palabra-clave-this.html

    En el método toString se usará this para acceder al campo nombre. En


realidad, no es tan necesario como se puede observar en la misma línea cuando
se accede al campo. Por defecto, el compilador entiende que es el campo del
objeto asociado.
Figura 7.  Constructor con parámetros.

Fuente: http://www.edu4java.com/es/java/constructores-palabra-clave-this.html

    Donde sí es necesario usar this es en Persona


(String nombres, String apellido, String dirección), donde existe un parámetro
llamado nombre. Si se escribe solo “nombre”, el compilador entiende que se
refiere al parámetro y no al campo. Por eso se utiliza this nombre=nombre
inicializando el atributo como se indica en figura 8.

Figura 8. Constructor un solo parámetro.

Fuente: http://www.edu4java.com/es/java/constructores-palabra-clave-this.html

    Otro caso interesante donde usar this es en el constructor Persona


(String nombre). Aquí se llama al constructor informando solo el nombre. Lo que
se quiere obtener es que los demás campos tengan el contenido por defecto dado
por el constructor vacío "No informado". Se usa this () para llamar al constructor
vacío public Persona (), desde el constructor Persona (String nombre). Esto
rellena todos los campos con "No informado” y luego actualiza el nombre con el
parámetro (Edu4, 2017). En la figura 9, presentamos la introducción a la
instanciación o creación de un objeto con o sin parámetros.
Figura 9. Utilización de constructores con y sin parámetros.

Fuente: http://www.edu4java.com/es/java/constructores-palabra-clave-this.html

     En el método main (principal), se puede ver cómo se crean tres objetos


personas, usando los diferentes constructores y después se imprime cada uno de
los objetos, usando el método toString ().

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

4.4. Instanciación

4.4. Instanciación
    Lainstanciación de una clase tiene por objetivo la creación de un objeto. Crear
un objeto significa reservar espacio de memoria para el mismo y establecer una
ligadura con una variable referencia. por lo que se puede concluir que instancia es
la estrecha relación entre el objeto y la clase.

Figura 10. Instancia.

Fuente: http://profejavaoramas.blogspot.com/2010/04/instancia.html

Clase

    La clase es la estructura de un objeto, es decir, la  descripción de los elementos


de los cuales está formado o hecho un objeto. Una clase está compuesta por dos
elementos:

- Atributos
    Se los denomina por lo general datos miembros, esto es los datos que se
refieren al estado del objeto como se puede observar en el figura 11.

- Métodos

    Se los denomina por lo general funciones miembros, aquellos que pueden


aplicarse al objeto, el comportamiento de estos objetos que pueden contener o no
parámetros.

Figura 11. Elementos de una clase.

Fuente: Pablo Parra

Objeto

     El objeto es una instancia (proceso de creación de un objeto de una clase)


mencionado anteriormente en la definición de una instancia de una clase. Por lo
tanto, un objeto es el resultado de una clase, en realidad es una instancia de una
clase, por lo que se pueden intercambiar los términos objeto o instancia. (Palmer,
2017)

    Un objeto está compuesto y al igual que los objetos del mundo real comparte
siempre características que son: estado (atributos) y comportamiento (funciones o
métodos).
Figura 12.  Instanciación de objetos

Fuente: https://www.albertopalmer.com/2017/08/02/que-es-una-clase-que-es-un-objeto/

     Nota. Una clase no es un objeto, pero se usa para construirla.

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

4.4.1. Instanciar
     Para instanciar(crear) objetos de una determinada clase se puede encontrar
con distintas formas que se deberá aplicar. Lo más habitual de ellas es utilizar la
palabra reservada, la cual nos proporciona la invocación de un constructor para
crear objetos en Java siguiendo el siguiente formato:

Figura 13. Palabra reservada new.

Fuente: https://javiergarciaescobedo.es/programacion-en-java/2-clases-y-objetos/218-
instanciacion-de-objetos
Figura 14. Palabra reservada new

Fuente: Javier García Escobedo, 2011

    Lo cual sería una llamada al método constructor (con o sin parámetros) de la


clase. El tipo de llamada nos devuelve una instancia u objeto de dicha clase. Una
vez creado el objeto, se podrá guardarlo en una variable dentro de cualquier
expresión compatible con la clase del objeto creado.

El proceso de declarar una variable que pueda contener el objeto de una


determinada clase se actúa de forma similar a la declaración de las variables
habituales, es decir, siguiendo la estructura como se muestra en la figura 15.

Figura 15. Creación de un objeto.

Fuente: https://javiergarciaescobedo.es/programacion-en-java/2-clases-y-objetos/218-
instanciacion-de-objetos
Figura 16. Variable contenedora del objeto

     Es habitual que a la vez que se declara una variable, se cree el objeto de la
misma clase y se le asigne a dicha variable, formando una sentencia completa de
la siguiente forma:

Figura 17.  Ejemplo creación de la instancia (objeto).

4.5. Métodos Getters y Setters


     En estos métodos, todo atributo de una clase es privado por el principio de
encapsulamiento además son métodos que se usan en las clases para
mostrar (get) o modificar (set) el valor de un atributo. El nombre del método
siempre será get o set y a continuación el nombre del atributo. Su modificador
siempre es public, ya que se quiere mostrar o modificar desde fuera la clase. Son
métodos de acceso lo que indica que son siempre declarados públicos.
    Los sets y gets son la forma de acceder a atributos de una clase.
Generalmente, se usan con los atributos privados, ya que a los públicos se puede
acceder directamente sin tener que acudir a ellos.

Figura 18.  Inicializamos los atributos.

Fuente: Pablo Parra

Conceptos generales

Getters. Del inglés Get, que significa obtener, nos sirve para obtener (recuperar o
acceder) el valor ya asignado a un atributo y utilizarlo para cierto método. Un tipo
de dato representa un conjunto de valores que significa lo mismo, un atributo el
cual representa la clase de datos que se está utilizando, sin embargo, hay algunos
tipos que no representan valores en la aplicación que se ejecutan.

Figura 19.  Formato de un getters.

Fuente: Pablo Parra

Setters. Del inglés set, que significa establecer, nos sirve para asignar un valor
inicial a un atributo, pero de forma explícita, además el setter nunca retorna nada
(siempre es void) y solo nos permite dar acceso público a ciertos atributos que se
desee que el usuario pueda modificar.

Figura 20.  Formato de una setters con su parámetro.


Fuente: Pablo Parra

Ejemplo práctico

     Aquí se realizará un ejemplo práctico de la vida real que nos ayuda a entender
mejor los conceptos getters y setters.

Programa

    Realizar una aplicación que dado dos números enteros realice las cuatro
operaciones básicas:

 Suma
 Resta
 Producto
 División

     En primera instancia se crearán tres clases que se detallan a continuación:

Clase 1: Número

    En esta clase se colocará todos los atributos y métodos utilizados en ella.

    Como se puede observar ahí, los métodos lo único que hacen es proporcionar
un acceso a unos atributos que son privados y que no serían accesibles desde
otras clases si no es por otros métodos.

Figura 21.  Construcción de los atributos y generado sus getters y setters.

Fuente: Pablo Parra

    Como se puede observar en la imagen, se creó atributos del objeto, que en este
caso solo tiene uno el cual es el atributo valor, además se colocó
los getters y setters de dicho atributo (clic Izq + insertarcodigo+getters y
setters).

Clase 2: Operaciones

Figura 22. Metodoscon con  getters y setters.

Fuente: Pablo Parra

    En esta clase se realizará los métodos necesarios para la solución del
problema, a continuación se detallará un método para la mejor comprensión.

Figura 23. Implementación de getters y setters.

Fuente: Pablo Parra

En la figura 24 se crea el método Suma con sus dos parámetros de tipo Número;


en la siguiente línea se crea un objeto de tipo Número que a su vez llevará una
variable del objeto; en la línea siguiente se observa la utilización del setters ya
que va a modificar el valor de la variable con la operación suma de dos
parámetros de tipo Número utilizando los getters para cada parámetro, porque lo
que se quiere es mostrar el valor de dichos parámetros y realizar la operación.

Clase 3: Principal
Figura 24.  Clase main() para ejecutar en programa. Fuente: Pablo Parra

    Esta clase principal llevará a cabo el llamado de las otras clases ya creadas
anteriormente con todos sus atributos y métodos respectivos que le pedirán los
datos al usuario.

    En la figura 25 se observa la ejecución del programa con todos los datos de la


solución del problema.

Figura 25.  Resultados del programa.

Fuente: Pablo Parra


Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir
igual 4.0

Unidad de Educación a Distancia

5.1. Lectura y escritura de datos por consola


     La entrada o lectura de datos en Java es uno de los conceptos más importantes
y fundamentales al momento de interactuar con el usuario de nuestro programa.
La entrada de datos en Java, a diferencia de otros lenguajes, es un poco
complicada (no demasiado) y existen diferentes formas de hacerlo, unas más
complejas que otras.

Lectura de entrada por teclado usando la clase Scanner

  La clase Scanner de la librería java.util es también muy sencilla para obtener


datos de entrada del usuario, a diferencia de BufferedReader, Scanner sí posee
un método para la lectura de números y para la lectura de texto que nos ayudará a
facilitar un poco las cosas. Veamos:

import java.util.Scanner;

public class EntradaJava2

    public static void main(String[] args)

    {

            int numero;

Scanner sc = new Scanner(System.in); //Se crea el lector

numero=sc.nextInt();//Se ingresa el número

if(numero%2==0)

System.out.println(“Numero Par“);

else
System.out.println(“Numero Impar“);

       }

     Con este código hemos podido realizar la lectura de datos del usuario muy
fácil, pues ya no nos tuvimos que preocupar por el tipo de dato, solo debemos
usar el método adecuado según sea entero, String, float, etc.

System.out.print

    Para mostrar un mensaje en consola,


escribimos System.out.println(“cadena”); dentro del paréntesis, además de
cadenas, podemos mostrar el valor de una variable, para ello, solo escribimos el
nombre de la variable sin comillas dobles, no importa el tipo de variable.

    También se puede incluir una cadena de texto más el valor de una variable,
para ello escribimos la cadena con comillas dobles, un signo + y el nombre de la
variable, recuerda poner un espacio entre una variable y una cadena de texto. Por
ejemplo, System.out.println(“El valor de la variable num es
“+num); o System.out.println(“El precio final es “+precio+” euros”);

Figura 1. Fuente: https://www.discoduroderoer.es/entrada-y-salida-de-datos-en-java/
Figura 2. Fuente: https://es.slideshare.net/cpavella/12-curso-de-poo-en-java-entrada-y-salida-de-
datos

Streams de bytes

    A través de un stream, podemos enviar y recibir todo tipo de datos. Desde bytes
hasta objetos.

Streams bufferizados

    Java provee clases que permiten almacenar temporalmente en memoria los


datos que quieres enviar o leer a través de un stream. El uso de estas clases
incrementa el rendimiento de nuestro programa porque ayuda a minimizar el
overhead generado por el uso de recursos como accesos a disco, actividad de
red, etc.

    El área de memoria temporal en el que se almacena la información que llega o


que se envía se llama buffer. Un programa puede escribir en un buffer pero
físicamente se leerá el stream cuando el buffer esté vacío.

    Las clases que permiten bufferizar son BufferReader, BufferWriter,


BufferInputStream y BufferedOutputStream.

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

public class EntradaJava2

{
    public static void main(String[] args) throws Exception

    {

            BufferedReader br=new BufferedReader(new FileReader(arg[0]));

            BufferedWriter bw=new BufferedWriter(new FileWriter(arg[1]));

            int c=br.read();

            while{

                        bw.write(c);

                        c=br.read();

bw.close();

            br.close();

    }

Cuadro de diálogo

    Se podrá ver en cualquier sitio que lo ejecutemos. Antes de escribir la linea de


código, debemos importar el paquete necesario para poder utilizar la clase
necesaria para el cuadro de diálogo.

   Antes de la linea public class “nombre_clase”, escribimos import


javax.swing.JOptionPane; después dentro del
main JOptionPane.showMessageDialog(null, “cadena”); por lo de null, no
debes preocuparte, lo entenderás más adelante y en la cadena podemos hacer lo
mismo que hemos mostrado antes.
Figura 3. Fuente: https://www.discoduroderoer.es/entrada-y-salida-de-datos-en-java/

Resultado

Figura 4. Fuente: https://www.discoduroderoer.es/entrada-y-salida-de-datos-en-java/

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

5.2. Arreglos
   Un arreglo es un conjunto finito e indexado de elementos, que se referencian por
un identificador común (nombre). La propiedad indexada significa que el elemento
primero, segundo, hasta el n-ésimo de un arreglo pueden ser identificados por su
posición ordinal.

   De manera formal se define un arreglo de tamaño n de los elementos de tipo A,


es un elemento del espacio n-dimensional del conjunto A, es decir,  X es arreglo
de tamaño n del tipo A si y solo si  XeAn.

Figura 5.
Fuente: https://rogersorianos.files.wordpress.com/2012/11/arreglos_java.png

Ambas definiciones reconocen los siguientes conceptos:

 Finita. Todo arreglo tiene un límite, es decir, debe determinarse cuál será el


número máximo de elementos que podrá formar parte del arreglo.
 Homogénea. Todos los elementos de un arreglo son del mismo tipo o naturaleza
(todos enteros, todos booleanos, etc.), pero nunca una combinación de distintos
tipos.
 Ordenada. Se debe determinar cuál es el primer elemento, el segundo, el
tercero… y el n-ésimo elemento.

Características

 Los arreglos pueden contener un mínimo de un elemento hasta un máximo


de n. Por tanto, si un arreglo tiene n elementos, la última localidad está dada por
n-1.
 Tienen un único nombre de variable, que representa todos los elementos.
 Contienen un índice, el cual diferencia a cada elemento del arreglo.
 Se pueden realizar ciertas operaciones como son: recorridos, ordenaciones y
búsquedas de elementos.
 El número total de elementos del arreglo (NTE) es igual al límite superior (LS),
menos límite inferior NTE = LS - LI + 1.
 El tipo de índice puede ser cualquier tipo ordinal.
 El tipo de los componentes puede ser cualquiera.
 Se utilizan [ ] para indicar el índice de un arreglo. Entre los [ ] se debe escribir un
valor ordinal (puede ser una variable, una constante o una expresión que dé como
resultado un valor ordinal).
 Si un arreglo tiene n componentes, la última localidad está dada por n-1.

Figura 6. Representación Arreglo en Java. https://www.incanatoit.com/2016/01/arrays-arreglos-


vectores-programacion-csharp-net.html

Los arreglos se clasifican en:

 Unidimensionales (Vectores): un solo índice


 Bidimensionales (Tablas o Matrices): dos índices
 Multidimensionales: más de dos índices

Concepto de multidimensionales

En Java es posible crear arrays con más de una dimensión, pasando de la idea de
lista, vector o matriz de una sola fila a la idea de matriz de m x n elementos,
estructuras tridimensionales, tetradimensionales, etc. La sintaxis será:

Tipo_de_variable[][]…[] Nombre_del_array=new Tipo_de_variable[dimensión1]


[dimensión2]…[dimensiónN];
Figura 7. https://i2.wp.com/dcodingames.com/wp-content/uploads/2017/02/matrices1.fw_.png?
resize=1005%2C485

Arreglos primitivos

    Los primeros lenguajes de programación no usaban objetos, solo variables. Una


variable podríamos decir que es un espacio de la memoria del ordenador a la
que asignamos un contenido que puede ser un valor numérico (solo números,
con su valor de cálculo) o de tipo carácter o cadena de caracteres (valor
alfanumérico que constará solo de texto o de texto mezclado con números).

   Consideraremos que las variables son entidades elementales: un número, un


carácter, un valor verdadero o falso… mientras que los objetos son entidades
complejas que pueden estar formadas por la agrupación de muchas variables y
métodos. Pero ambas cosas ocupan lo mismo: un espacio de memoria (que puede
ser más o menos grande).   

 Tabla 1

Tipos primitivos de datos 

NOMBR RANGO
  TIPO OCUPA
E APROXIMADO

Tipos primitivos byte Entero 1 byte -128 a 127

(Sin métodos; no
son objetos; no
necesitan una short Entero 2 bytes -32768 a 32767
int Entero 4 bytes 2*109

long Entero 8 bytes Muy grande

Decimal
float 4 bytes Muy grande
simple

Decimal
double 8 bytes Muy grande
doble
invocación para ser
creados)

Carácter
char 2 bytes ---
simple

Valor
boolean true o 1 byte ---
false

Fuente.https://www.aprenderaprogramar.com/index.php?
option=com_content&view=article&id=419:tipos-de-datos-java-tipos-primitivos-int-boolean-y-objeto-
string-array-o-arreglo-variables-cu00621b&catid=68&Itemid=188

Ejemplo

private TipoPrimitivoUObjeto [ ] nombreDelArray;   //Declaración: reserva


espacio de memoria

nombreDelArray = new TipoPrimitivoUObjeto [numero]; //Creación del arreglo

private int [ ] miArrayDeNumeros = { 2, -3, 4, 7, -10 }; //Sintaxis ejemplo declarar


y crear un arreglo en una línea

Ejemplo de uso con tipos

private int [ ] cochesHorasDelDia;

cochesHorasDelDia = new int [24]; // Creamos un arreglo de enteros con índices


entre el 0 y el 23
cochesHorasDelDia [9] = 4521; //Ejemplo de asignación

cochesHorasDelDia [23]++ ; //Ejemplo de asignación que equivale a


cochesHorasDelDia[23] +=1;

Declarar el array y crear el objeto en una misma línea

Tipo [ ] nombreDelArray = new Tipo [número];

Ejemplo con ingreso y entrada de salida de datos empleando un bucle for


para saber cu{antos datos ingresados son pares y cuantos impares.

     import java.util.Scanner;

public class EntradaJava2

    public static void main(String[] args)

    {

                int numero,contadorPares=0,contadorImpares=0;

                int [] numero=new int[5];

            Scanner sc = new Scanner(System.in);

System.out.println (“Ingrese 5 números”);

               for(int i=0;i<5;i++){

                numero[i]=sc.nextInt();

if(numero[i]%2==0)

                contadorPares++;

else        

                                                contadorImpares++;

                 }

System.out.println (“Existen ”+contadorPares+”  números pares y


”+contadorImpares+” números impares ”);

       }
}

Ejemplo de ordenamiento de un arreglo

Figura 8. https://www.discoduroderoer.es/formas-de-ordenar-un-array-en-java/

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

6.1. Definición
    Una excepción es cualquier incidente que no permite la terminación correcta de
un programa. En la mayoría de los casos se tratará de impedir la terminación de
los programas manejando las excepciones o lanzándolas hacia algún punto del
programa que pueda manejar dicha excepción.

    La excepción también es una forma de hacer que la aplicación continúe la


ejecución si se produce un error.
Figura 1. Manejo de excepciones.

Fuente: https://magicplsql.blogspot.com/2016/10/manejo-de-excepciones.html

    Un ejemplo es cuando se realiza un programa que permita dividir dos números.
Tengamos en cuenta que la división para cero nos genera un error y es ahí donde
se utiliza el manejo de errores. Vamos a restringir que cuando se realice la división
para cero se genere un mensaje diciendo “Error: No se puede dividir para cero”.

 
Figura 2. Manejo de excepciones.

Fuente: http://www.buscaminegocio.com/cursos-de-java/capturar-excepciones-java.html

Ventajas de usar una excepción

 Se usa para detectar situaciones inusuales en la ejecución.


 Se separa el código que controla los errores.
 Las utilidades de las excepciones ayudan a que el programa sea muy concreto y
preciso.
Figura 3. Manejo de excepciones.

Fuente: https://www.redeszone.net/2018/06/15/anadir-excepciones-windows-defender-windows-10/

Ejemplos

 No hay memoria disponible para asignar.


 Acceso a un elemento de un array fuera de rango.
 Leer por teclado un dato de un tipo distinto al esperado.
 Error al abrir un fichero.
 División por cero.
 Problemas de hardware.

Si la excepción no se trata, el manejador de excepciones realiza lo siguiente:

 Muestra la descripción de la excepción.


 Muestra la traza de la pila de llamadas.
 Provoca el final del programa.

Figura 4. Manejo de excepciones.


Fuente: http://www.elguille.info/colabora/ NET2005/Percynet_ControlExceptionsNet.html

 Jerarquía de clases

Figura 5. Manejo de excepciones.

Fuente: Pablo Parra

 Jerarquía de clases

    La clase java.lang. Throwable describe cualquier clase que pueda ser lanzada


como excepción.

    Existen dos tipos de clases Throwable que son:

 lang.Error. Representa errores de compilación y errores del sistema.


 lang.Exception. Representa las excepciones generadas por la aplicación.

    Existe un tipo especial de clases Exception que es:

 lang.RuntimeException. Representa excepciones generadas por la aplicación


cuya gestión no es obligatoria.
Figura 6. Manejo de excepciones.
Fuente: Pablo Parra

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

6.2. Excepciones y errores


    Según la página progra.usm.cl:

    No siempre los programas que escribiremos están correctos. Existen muchos


tipos de errores que pueden estar presentes en un programa.

   No todos los errores pueden ser detectados por el computador. Los errores más
comunes son:

Error de sintaxis

   Un error de sintaxis ocurre cuando el programa no cumple las reglas del
lenguaje. Cuando ocurre este error, significa que el programa está mal escrito. El
nombre del error es SyntaxError.

    Los errores de sintaxis siempre ocurren antes de que el programa sea


ejecutado. Es decir, un programa mal escrito no logra ejecutar ninguna instrucción.
Por lo mismo, el error de sintaxis no es una excepción.
Figura 7. Manejo de errores y excepciones.

Fuente: https://slideplayer.es/slide/166428/

Error de nombre

    Un error de nombre ocurre al usar una variable que no ha sido creada con
anterioridad.

Figura 8. Mensajes de error.

Fuente: Pablo Parra

Error de tipo

    En general, todas las operaciones en un programa pueden ser aplicadas sobre


valores de tipos bien específicos. Un error de tipo ocurre al aplicar una operación
sobre operandos de tipo incorrecto.
Figura 9. Excel por módulos: Mensajes de error en cálculos.

Fuente: http://minubeinformatica.com/cursos/excel-por-modulos/mensajes-de-error-en-calculos

Error de valor

    El error de valor ocurre cuando los operandos son del tipo correcto, pero la
operación no tiene sentido para ese valor.

Figura 10. Tipos de errores en Excel.

Fuente: https://www.gerencie.com/tipos-de-errores-en-excel.html

Error de división por cero

    El error de división por cero ocurre al intentar dividir por cero.


Figura 11. Evitar errores de división entre cero en Excel.

Fuente: https://exceltotal.com/evitar-errores-de-division-entre-cero-en-excel/

Error de desborde

    El error de desborde ocurre cuando el resultado de una operación es tan grande


que el computador no puede representarlo internamente.

Figura 12. Error 6 desbordamiento en visual basic.

Fuente: http://www.forosdelweb.com/f69/error-6-desbordamiento-visual-basic-954306/

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

6.3. Clases de excepciones


    Existen varios tipos fundamentales de excepciones que son los siguientes:

1. Error

    Excepciones que indican problemas muy graves, que suelen ser no


recuperables y no deben casi nunca ser capturadas. Este tipo de error tiene sus
propias derivadas que son:

 OutOfMemoryError. El lector ha agotado la memoria.


 InternalError. Error interno en tiempo de ejecución.
 UnknownError. Grave error desconocido.
 VerifyError. Se ha producido un error de verificación al cargar una clase.

2. IOException

    Excepciones no definitivas, pero que se detectan fuera del tiempo de ejecución.


Este tipo de error tiene sus propias derivadas que son:

 FileNotFoundException. Excepción cuando no se encuentra un archivo


seleccionado.
 MalFormedURLException. Excepción que se genera cuando una ubicación de un
archivo /página URL es incorrecta o está mal redactada.

3. RuntimeException

    Excepciones que se dan durante la ejecución del programa. Este tipo de error
tiene sus propias derivadas que son:

 NullPointerException. Se ha usado una referencia null para acceder a un campo.


 ArithmeticException. Error de cálculo (como división por cero...).
 ClassCastException. Intento de conversión inválida.
 NegativeArraySizeException. Intento de creación de un vector de tamaño
negativo.

Excepciones verificadas y no verificadas

- Excepciones verificadas

 Su tratamiento es obligatorio y el compilador así lo chequea.


 Todas aquellas clases hijas de lang.Exception que no lo sean
de java.lang.RuntimeException.

Excepciones no verificadas

 Su tratamiento no es obligatorio y el compilador no lo chequea.


 Todas aquellas clases hijas de lang.Error o de java.lang.RuntimeException.
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir
igual 4.0

Unidad de Educación a Distancia

6.4. Lanzamiento de excepciones

La cláusula Throws

    Barnes, D. dice: El primer requerimiento del compilador es que un método que


lanza una excepción comprobada debe declarar que lo hace mediante una
cláusula throws que se agrega en su encabezado. Por ejemplo, un método que
lanza una IOException comprobada del paquete java.io debe tener el siguiente
encabezado:

Figura 13. Manejo de excepciones.

Fuente: Barnes, D (2007): Programación orientada a  objetos con Java. Madrid: Pearson


Educación, S. A.

    Si bien se permite el uso de la cláusula throws para las excepciones no


comprobadas, el compilador no lo requiere. Recomendamos que se use una
cláusula throws solamente para enumerar las excepciones comprobadas que
lanza un método.

    Parte del tratamiento de una excepción puede incluir la propagación de la


misma para que también la traten los métodos llamantes. También puede suceder
que queramos que nuestro código lance una excepción en una situación
determinada. En ambos casos es necesario decir que el método puede lanzar una
excepción.
    Una función miembro que lanza una excepción tiene la declaración habitual que
cualquier otro método, pero se le añade a continuación la palabra reservada
throws seguida de la excepción o excepciones que pueden lanzar.

Throw

    La sentencia throw se utiliza para lanzar explícitamente una excepción. En


primer lugar, se debe obtener un descriptor de un objeto Throwable, bien mediante
un parámetro en una cláusula catch o se puede crear utilizando el operador
new. La forma general de la sentencia throw es:

throw ObjetoThrowable;

    El flujo de la ejecución se detiene inmediatamente después de la sentencia


throw y nunca se llega a la sentencia siguiente. Se inspecciona el bloque try que la
engloba más cercano, para ver si tiene la cláusula catch cuyo tipo coincide con el
del objeto o instancia Thorwable. Si se encuentra, el control se transfiere a esa
sentencia, si no se inspecciona el siguiente bloque try que la engloba, y así
sucesivamente, hasta que el gestor de excepciones más externo detiene el
programa y saca por pantalla el trazado de lo que hay en la pila hasta que se
alcanzó la sentencia throw.

    En el programa siguiente, java905.java, se demuestra cómo se hace el


lanzamiento de una nueva instancia de una excepción y también cómo dentro del
gestor se vuelve a lanzar la misma excepción al gestor más externo.

Figura 14. Manejo de excepciones.

Fuente: http://dis.um.es/~bmoros/Tutorial/parte9/cap9-3.html

La sentencia Try

   El try viene del inglés ‘Tratar’ y es donde se encapsula el código donde


posiblemente puede llamarse una excepción por ejecuciones fuera del flujo
esperado. Si una cierta cantidad de código está fuera de un TRY, este código está
libre de que llame una excepción.

    Según Barnes, D., el segundo requerimiento es que el invocador de un método


que lanza una excepción comprobada debe proveer un tratamiento para dicha
excepción. Esto generalmente implica escribir un manejador de excepción bajo la
forma de una sentencia try.

Sintaxis de la sentencia Try

Figura 15. Manejo de excepciones.

Fuente: Barnes, D (2007): Programación orientada a  objetos con Java. Madrid: Pearson


Educación, S. A.

La sentencia Catch

    El Catch es el lugar donde se listan las excepciones que se van a ‘tratar’ (try)
junto con las órdenes de cada excepción. Las excepciones se listan de la más
específica a las más generales.

Sintaxis de la sentencia Catch


Figura 16. Manejo de excepciones.

Fuente: Barnes, D (2007): Programación orientada a  objetos con Java. Madrid: Pearson


Educación, S. A.

 Bloque Try – Catch

Figura 17. Manejo de excepciones.

Fuente: https://www.fdi.ucm.es/profesor/jpavon/poo/2.12.Excepciones.pdf
Figura 18. Manejo de excepciones.

Fuente: Pablo Parra

    En esencia, un bloque try es el contexto para decir cuáles son los manejadores
que se invocan cuando se levanta una excepción. El orden en que se definen los
manejadores determina el orden en que se prueban los mismos para una
excepción levantada coincidente en tipos. De un modo más detallado, el bloque try
se asocia siempre con catch.

 Múltiples catch

    Se pueden utilizar múltiples bloques de sentencias catch en el mismo bloque de


sentencias try. Cada bloque gestionará un tipo de excepción. El orden en el que se
colocan las sentencias catch es relevante.

    Los bloques catch de excepciones genéricas deberían situarse después de los


de excepciones más particulares. La JVM busca en orden descendente un bloque
catch que sea capaz de controlar la excepción producida, una vez que lo
encuentra no sigue buscando.

    Por ejemplo, si se incluyen dos bloques catch, uno que capture Exception y otro
que capture NullPointerException, este último deberá colocarse el primero porque
de lo contrario nunca podría llegar a ejecutarse.

La sentencia Finally:

    El Finally viene del inglés ‘Finalmente’, es cuando un código fue tratado (try) y


captado las excepciones (catch), con FINALLY va a hacer una serie de
instrucciones independientes si se llama una excepción o no. Usualmente se usa
esta cláusula para finalizar conexiones o cerrar archivos.

    Según Barnes, D., una sentencia try puede incluir un tercer componente que es
opcional. La cláusula finally se proporciona para sentencias que se deben ejecutar
cuando se lanza una excepción desde sentencias protegidas o desde sentencias
no protegidas. Si el control alcanza el final del bloque try entonces se saltea el
bloque catch y se ejecuta la cláusula finally. Recíprocamente, si se lanza una
excepción a partir del bloque try, entonces se ejecuta el bloque catch apropiado y
luego se sigue con la ejecución de la cláusula finally.

Figura 19. Manejo de excepciones.

Fuente: Barnes, D (2007): Programación orientada a  objetos con Java. Madrid: Pearson


Educación, S. A.

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

 6.5. Métodos para el control de excepciones


Figura 20. Manejo de excepciones.

Fuente: Pablo Parra 

Public void printStackTrace();

    Imprime por la salida la pila (stack) de llamadas incluyendo los números de


línea y ficheros donde se ha producido la excepción.

Public String getMessage();

    Devuelve una cadena de caracteres con la descripción de la excepción.

Public String toString();

    Devuelve la representación en cadena de caracteres de la excepción.

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

6.6. Creación de excepciones personalizadas


    Antes de empezar a crear excepciones tenemos que saber los términos
aprendidos anteriormente.

Palabras
Descripción
clave

Exceptio Clase de Java que contiene información sobre una


n excepción o un error.

Mecanismo para emitir y recoger excepciones para así


Thows
poder tratar un problema.

Try Bloque que puede causar una excepción.


Bloque que permite recuperarse de una excepción o
Catch
capturarla.

Bloque que será ejecutado siempre, exista o no una


finally excepción. Asegura que se ejecuten instrucciones
aunque ocurra o no un problema.

    Siempre es posible lanzar alguna excepción de las ya definidas en Java


(IOException, por ejemplo). También se pueden definir nuevas excepciones
creando clases derivadas de las clases Error o Exception.

    Para la creación de las excepciones utilizamos cualquier software que permita


realizar la programación orientada a objetos.

    Veamos un ejemplo.

    La sentencia throw (lanzar) se usa en los métodos para lanzar una excepción


que será revisada por el compilador 

    throw new NombreClasedeExcepcion()

    Un método que llama a otro que lanza una excepción, se debe declarar de la
siguiente forma:

    Modificador tipodatoretorno nombreMetodo (..) throws


NombreClasedeExcepcion

    El método que lanza una excepción tiene la declaración habitual que cualquier
otro método, pero se le añade a continuación la palabra reservada throws seguido
de la excepción o excepciones que puede lanzar.
Figura 21. Manejo de excepciones.

Fuente: Pablo Parra

Ejemplo

    Realizar un programa que permita adivinar la raíz cuadrada de un número,


ingresado por consola donde el usuario digite el número de la raíz que él
considere que es el resultado de la misma, el programa le devolverá más o menos
el valor que debe volver a ingresar, el ejercicio debe manejar excepciones al
momento de ingresar números negativos e ingreso de caracteres al momento de
ingresar los valores.

Solución

    Creamos la clase que maneje las excepciones de número negativo, y también


para controlar que no se ingrese caracteres.

    Creamos la clase para instanciar el número que necesitamos encontrar la raíz


cuadrada.
Figura 22. Clase manejo excepciones.

Fuente: Pablo Parra

    Comenzamos a crear una clase “número”.

Figura 23. Clase número.

Fuente: Pablo Parra

    Luego comenzamos a crear la clase “juego", donde va todo lo que queremos


hacer.
Figura 24. Clase Juego.

Fuente: Pablo Pärra

    Finalmente realizamos la clase “Raíz” donde va a ir el procedimiento de la raíz


cuadrada
Figura 25. Manejo de excepciones.

Fuente: Pablo Parra

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

7.1. Introducción
    Algunas clases que hemos citado, como ArrayList o LinkedList, se denominan
colecciones de tamaño flexible porque permiten modificar dinámicamente el
número de ítems que contienen, es decir, ampliarlo o reducirlo. A veces nos
referiremos a estas colecciones como arrays dinámicos porque son similares a los
arrays dinámicos que se emplean en otros lenguajes de programación.

 Los arrays dinámicos son muy potentes porque permiten crear colecciones de
tamaño variable que podemos agrandar o empequeñecer en función de nuestras
necesidades.
 Sin embargo, cuando se conoce el número de elementos en una colección y este
va a ser invariable (por ejemplo, los doce meses del año), será más eficiente
utilizar una colección de tamaño fijo a la que denominamos array estático,
arreglo estático, formación o vector. Si utilizamos el término array o arreglo, a
secas, entenderemos que hacemos alusión a un array estático.

    El uso de arrays estáticos tiene ventajas e inconvenientes.

Tabla 1

Tipos de arrays de objetos


Ventajas Inconvenientes

-  Acceso y operación con elementos -  Rigidez. No se pueden


más eficientes. redimensionar (aunque sí copiar a
otros arrays estáticos de mayor
-  Permiten almacenar tanto objetos
tamaño).
como tipos primitivos directamente.

Fuente. https://www.aprenderaprogramar.com/index.php?
option=com_content&view=article&id=635:arrays-o-arreglos-java-ejemplos-de-objetos-y-tipos-
primitivos-length-tipos-de-colecciones-cu00669b&catid=68&Itemid=188

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

7.2. Arreglos estáticos


    Un arreglo estático es un conjunto de datos homogéneos agrupados, pero con
una cantidad fija de elementos en su composición que dependiendo de la
necesidad del programador será fijado.

¿Cómo utilizar un arreglo estático?

    Se sigue la siguiente sintaxis:

Paso 1
Figura 1. http://www.cs.umss.edu.bo/doc/material/mat_gral_33/ArreglosEstaticos.pdf

Ejemplo: int [] numeros;

Creación de arreglos

    Los arreglos ocupan espacio en memoria. En Java se usa el operador new para
asignar espacio de almacenamiento al número de elementos requerido por cada
arreglo.

Paso 2

Figura 2. http://www.cs.umss.edu.bo/doc/material/mat_gral_33/ArreglosEstaticos.pdf

Ejemplo: numeros = new int [50]; 

Inicialización de arreglos

    Una vez creado el arreglo, se puede proceder a llenar con elementos


dispuestos en cada posición. Ejemplo:

for(int j =0; j<50; j++){

numeros[j] = j++;

    El arreglo en Java empieza en la posición 0, es decir, el primer elemento del


arreglo ocupa la posición de 0, de ahí que el for comienza en 0.

Arreglos de objetos
Figura 3. https://jagonzalez.org/wp-content/uploads/2013/04/Diferencia-Arreglo-de-Objetos-y-
Arreglo-de-datos-Primitivos.png

Tabla 2

Tipos de arrays de objetos

Tipos objeto String (cadenas de texto)


Tipos de la biblioteca
(Con métodos, estándar de Java Muchos otros (p.ej. Scanner,
necesitan una TreeSet, ArrayList…)
invocación
para ser
creados).
Cualquiera que se nos ocurra,
Tipos definidos por el
por ejemplo Taxi, Autobus,
programador / usuario
Tranvia

Serie de elementos o
formación tipo vector o matriz.
arrays Lo consideraremos un objeto
especial que carece de
métodos.

Tipos envoltorio o Byte


wrapper (Equivalentes
a los tipos primitivos
Short
Integer

Long

Float

pero como objetos).

Double

Character

Boolean

Fuente. https://www.aprenderaprogramar.com/index.php?
option=com_content&view=article&id=419:tipos-de-datos-java-tipos-primitivos-int-boolean-y-objeto-
string-array-o-arreglo-variables-cu00621b&catid=68&Itemid=188

Ejemplo de uso con tipos objeto

private Persona [ ] Grupo3A;

Grupo3A = new Persona [50]; //Creamos un arreglo de objetos Persona    con


índices entre el 0 y el 49

private String [ ] nombre;

nombre = new String [200];

nombre [37] = “Juan Antonio”;

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia


7.3. Arreglos dinámicos
Listas

    Hay varias implementaciones de List, siendo ArrayList la que debería ser la


elección por defecto, en caso de no tener que utilizar las características que
proporcionan las demás implementaciones.

 List (interfaz). La ordenación es la característica más importante de una lista,


asegurando que los elementos siempre se mantendrán en una secuencia
concreta. La lista incorpora una serie de métodos a la colección que permiten la
inserción y borrar de elementos en medio de la lista. Además, en la lista enlazada
se puede generar un listIterator para moverse a través de las listas en ambas
direcciones.
 ArrayList. Es una lista volcada en un Array. Se debe utilizar en lugar de vector
como almacenamiento de objetos de propósito general. Permite un acceso
aleatorio muy rápido a los elementos, pero realiza con bastante lentitud las
operaciones de insertado y borrado de elementos en medio de la lista. Se puede
utilizar un listIterator para moverse hacia atrás y hacia delante en la lista, pero no
para insertar y eliminar elementos.
 LinkedList. Proporciona un óptimo acceso secuencial, permitiendo inserciones y
borrado de elementos de en medio de la lista muy rápidas. Sin embargo, es
bastante lento el acceso aleatorio, en comparación con la ArrayList. Dispone,
además, de los métodos addLast(), getFirst(), getLast(), removeFirst() y
removeLast(), que no están definidos en ningún interfaz o clase base y que
permiten utilizar la lista enlazada como una pila, una cola o una cola doble.

Map

    La interface Map (java.io.Map) en Java nos permite representar una estructura


de datos para almacenar pares "clave/valor"; de tal manera que para una clave
solamente tenemos un valor. 

 HashMap. Los elementos que inserta en el map no tendrán un orden específico.


No aceptan claves duplicadas ni valores nulos.
 TreeMap. El mapa lo ordena de forma "natural". Por ejemplo, si la clave son
valores enteros (como luego veremos), los ordena de menos a mayor.
 LinkedHashMap. Inserta en el Map los elementos en el orden en el que se van
insertando; es decir, que no tiene una ordenación de los elementos como tal, por
lo que esta clase realiza las búsquedas de los elementos de forma más lenta que
las demás clases.

Iterator

 La interface Iterator también pertenece como las anteriores al framework


Collections de Java. Esta interface nos permite iterar sobre una colección de
elementos. Para ello hemos de implementar sus métodos, que son los siguientes:
boolean hasNext(), E next(), void remove().
 La interface iterable está incluida en el api de Java, en concreto en el
paquete java.lang. Es una interfaz de uso habitual al igual que el caso de las
interfaces Cloneable y Comparable que ya hemos explicado.
Implementar Iterable tan solo obliga a sobreescribir un método que
es iterator(). Este método debe devolver un objeto de tipo Iterator.  

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

7.3.1. Arraylist
    De forma general, un ArrayList en Java se crea de la siguiente manera:

ArrayList nombreArray = new ArrayList(); à Esta instrucción crea el


ArrayList nombreArray vacío. Un arrayList declarado así puede contener objetos
de cualquier tipo.

    Por ejemplo:

ArrayList a = new ArrayList();

a.add("Lenguaje");

a.add(3);

a.add('a');

a.add(23.5);

    Los elementos del arrayList a son:

“Lenguaje”  2  ‘a’   23.5

    Es decir, un ArrayList puede contener objetos de tipos distintos. En este


ejemplo, el primer objeto que se añade es el String “Lenguaje”. El resto no son
objetos. Son datos de tipos básicos pero el compilador los convierte
automáticamente en objetos de su clase envolvente (clase contenedora o
wrapper) antes de añadirlos al array.

   Un array al que se le pueden asignar elementos distintos puede tener alguna
complicación a la hora de trabajar con él. Por eso, una alternativa a esta
declaración es indicar el tipo de objetos que contiene. En este caso, el array solo
podrá contener objetos de ese tipo.

    De forma general:

ArrayList nombreArray = new ArrayList();

    Tipo debe ser una clase. Indica el tipo de objetos que contendrá el array.

    No se pueden usar tipos primitivos. Para un tipo primitivo se debe utilizar su


clase envolvente.

Características propias

 Similar a un arreglo.
 Provee métodos para manejar los datos.
 Su tamaño crece dinámicamente.
 Más lento en ejecución que un arreglo, dado el proceso dinámico de
administración de la memoria del compilador.
 Se debe declarar una librería especializada para poder utilizarlo: java.util.ArrayList

    Por ejemplo:

ArrayList numeros = new ArrayList(); à Crea el array números de enteros.

Métodos de Arraylist

    Algunos métodos que proporciona ArrayList son:

Tabla 3

Métodos del Arraylist

Método Descripción

size() Devuelve el número de elementos (int).

add(X) Añade el objeto X al final. Devuelve true.

add(posición, X) Inserta el objeto X en la posición indicada.


get(posicion) Devuelve el elemento que está en la posición indicada.

Elimina el elemento que se encuentra en la posición


remove(posicion)
indicada. Devuelve el elemento eliminado.

Elimina la primera ocurrencia del objeto X. Devuelve


remove(X)
true si el elemento está en la lista.

clear() Elimina todos los elementos.

Sustituye el elemento que se encuentra en la posición


set(posición, X) indicada por el objeto X. Devuelve el elemento
sustituido.

Comprueba si la colección contiene al objeto X.


contains(X)
Devuelve true o false.

Devuelve la posición del objeto X. Si no existe


indexOf(X)
devuelve -1.

 Fuente: http://docs.oracle.com/javase/9/docs/api/java/util/ArrayList.html
Figura 4. https://medium.com/@Emmanuel.A/data-structures-arraylist-239a5b39cd7e

Recorrer un Arraylist

    Podemos recorrerlo de forma clásica con un bucle for:

for(int i = 0;i<array.size();i++){< strong=""></array.size();i++){<>

            System.out.println(array.get(i));

    Con un bucle foreach:

   Si suponemos el array de enteros llamado numeros:

for(Integer i: numeros){

           System.out.println(i);

    Si el array contiene objetos de tipos distintos o desconocemos el tipo:

for(Object o: nombreArray){

            System.out.println(o);

    Utilizando un objeto Iterator.
(http://docs.oracle.com/javase/9/docs/api/java/util/Iterator.html)

     La ventaja de utilizar un Iterador es que no necesitamos indicar el tipo de


objetos que contiene el array.
    Iterator tiene como métodos:

hasNext. Devuelve true si hay más elementos en el array.

next. Devuelve el siguiente objeto contenido en el array.

Ejemplo

ArrayList numeros = new ArrayList();

…..

//se insertan elementos

.....

Iterator it = numeros.iterator(); //se crea el iterador it para el array numeros

while(it.hasNext())                    //mientras queden elementos

        System.out.println(it.next());  //se obtienen y se muestran

Copiar un Arraylist

    El nombre de un ArrayList contiene la referencia al ArrayList, es decir, la


dirección de memoria donde se encuentra el ArrayList, igual que sucede con los
arrays estáticos.

    Si disponemos de un ArrayList de enteros llamado ventas:

Figura 5. http://puntocomnoesunlenguaje.blogspot.com/2012/12/arraylist-en-java.html

    La instrucción:
    ArrayList ventas1 = ventas;

    No copia el array ventas en el nuevo array ventas1 sino que crea un alias:

Figura 6. http://puntocomnoesunlenguaje.blogspot.com/2012/12/arraylist-en-java.html

     De esta forma tenemos dos maneras de acceder al mismo ArrayList:

- mediante la referencia ventas

- mediante la referencia ventas1.

     Para hacer una copia podemos hacerlo de forma manual, elemento a elemento,


o se puede pasar la referencia del ArrayList original al constructor del nuevo:

ArrayList ventas1 = new ArrayList(ventas);

Figura 7. http://puntocomnoesunlenguaje.blogspot.com/2012/12/arraylist-en-java.html
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir
igual 4.0

Unidad de Educación a Distancia

7.3.2. Hashmaps
    Un HashMap es una colección de objetos, (como los Arrays), pero estos no
tienen orden. ¿De qué se trata?

    Cada objeto se identifica mediante algún identificador apropiado, por ejemplo un


"uuid”.

    El nombre HASH, hace referencia a una técnica de organización de archivos


llamada hashing o "dispersion" en la cual se almacenan registro en una dirección
del archivo que es generada por una función que se aplica sobre la llave del
registro.

    El concepto para Java es parecido, el Hashmap posee un espacio de memoria


y cuando se guarda un objeto allí, se determina su dirección aplicándole una
función a la llave que le indicamos.

    Por ejemplo:

   HashMap contenedor = new HashMap(); 


       Object objeto = new Object();
       String llave = new String("identificador de
objeto");   contendor.add(llave,objeto);

     La biblioteca estándar de Java tiene dos tipos diferentes de objetos Map (que
es una interfaz con cierta funcionalidad): HashMap y TreeMap. Ambos tienen la
misma interfaz (dado que implementan Map), pero difieren claramente en la
eficiencia.

    Si se observa lo que hace un get(), parecerá bastante lento hacerlo buscando a


través de la clave, por ejemplo de un ArrayList. Es aquí donde un HashMap
acelera considerablemente las cosas. En vez de hacer una búsqueda lenta de la
clave, usa un valor especial denominado "código de tipo hash". Esta es una
manera de tomar cierta información del objeto en cuestión y convertirlo en un
entero "relativamente único" para ese objeto.

    Todos los objetos de Java pueden producir un código de tipo hash y


HashCode() es un método de la clase raíz Object. Un HashMap toma un
hashCode() del objeto y lo utiliza para localizar rápidamente la clave. Esto redunda
en una mejora dramática de rendimiento.
Figura 8. https://guru99.es/working-with-hashmaps/

Ejemplo

  Figura 9. Ejemplo HashMap

¿Cuándo usar ArrayList y cuando usar HashMap?

     Ambas estructuras de datos almacenan Objects y por defecto en Java todas las
clases heredan de Object. Es decir, puedes guardar cualquier objeto en cada una
de ellas. 

     El asunto es ¿cuándo emplear una u otra? 

      Por ejemplo, usas un ArrayList cuando necesitas acceder al n-avo elemento.
Haz cuenta de que un ArrayList es una columna de objetos en línea y que un
HashMap es algo así como una sala llena de objetos dispersos a los que llamas
por su nombre (clave-valor).
       En lo personal suelo usar más un TreeMap para almacenar miles de objetos,
pues el tiempo de recorrido es mucho menor al de un ArrayList, las listas las utilizo
para manejar no más de 500 elementos.

       De más está decir que esas no son las únicas estructuras de datos que
existen en Java. Tienes además Vector, LinkedList, TreeSet, TreeMap... etc, y
cada una de ellas tiene características que las diferencian del resto y que por ende
son más óptimas que cualquier otra en cada caso.

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir


igual 4.0

Unidad de Educación a Distancia

También podría gustarte