1.1. Sistema de Control de Versionamiento (VCS)
1.1. Sistema de Control de Versionamiento (VCS)
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.
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.
Fuente: https://git-scm.com/book/es/v1/Empezando-Acerca-del-control-de-versiones
Fuente: https://git-scm.com/book/es/v1/Empezando-Acerca-del-control-de-versiones
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.
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 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.
Tenemos que tener instalado Git en nuestro ordenador que estará en la página
oficial (https://git-scm.com/).
Figura 4. Descarga.
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.
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.
Figura 11. Ejemplo.
Hacemos el mismo paso pero esta vez damos clic en Commint.
Figura 13. Commint.
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.
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 19. Repositorio.
Transición de paradigmas
Fuente: https://culturacion.com/wp-content/uploads/2011/05/Image1.jpg
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.
Figura 22. Interacción de
objetos.
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
Fuente: http://1.bp.blogspot.com/-
l3aZgFckxJY/VOEUXEtWVQI/AAAAAAAAAHA/Jb3TzvMPAEI/s1600/image008.png
Fuente: http://ygalicia.cs.buap.mx/POO.pdf
Ejemplo de encapsulamiento
Fuente http://paginawebleon.mx/wp/programacion-orientada-a-objetos-poo/
Figura 28. Polimorfismo.
Fuente: http://agrega.juntadeandalucia.es/repositorio/02122016/da/es-
an_2016120212_9103251/Polimorfismo.jpg
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.
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 Desventajas
La implementación es detallada,
Curva de aprendizaje
puntual y coherente.
Beneficios en diseño
Mantenimiento de software
Amplia documentación
Fuente https://ferestrepoca.github.io/paradigmas-de-programacion/poo/poo_teoria/index.html
Objeto
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.
Un objeto es declarado a partir de una clase, los datos y funciones son
encapsulados, un objeto es una instancia de una clase.
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:
Fuente: http://paginawebleon.mx/wp/programacion-orientada-a-objetos-poo/
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
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.
Los atributos son los datos que se van a almacenar de los objetos. Se declaran
de la siguiente manera:
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.
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.
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.
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
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.
Dependencia
Asociación
Generalización
Realización
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.
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.
Dependencia
Asociación
Generalización
Realización
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.
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.
Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/3.png
Caso 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.
Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/esta.png
Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/8.png
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.
Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/9.png
Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/10.png?w=646&h=373
Fuente: https://ingsotfwarekarlacevallos.files.wordpress.com/2015/07/11.png
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.
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
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
Agregación
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
Paquetes
Fuente: https://manuel.cillero.es/wp-content/uploads/2013/11/asociacion.png
Notaciones específicas
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.
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
Ejemplo
Solución
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.
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
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.
Figura 16. Estructura de
clase.
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.
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).
Un programa (sea informático o no) está compuesto por cuatro partes bien
diferenciadas:
Ejemplo
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
Fuente: https://codigoonclick.com/mejores-lenguajes-programacion-para-2018/
C++
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++.
Java
Java nace en 1991 con el nombre "OAK", posteriormente cambiado por Green
por problemas legales y finalmente con la denominación actual JAVA.
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 un lenguaje de programación portable que nos permite utilizar los programas
desarrollados en Java en cualquier ordenador con cualquier sistema operativo.
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).
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.
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
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
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
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
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:
Fuente: http://downloads.gvsig.org/download/documents/learning/collaborations/ce_1104_01/Progr
amacion_personalizacion_SIG_1.pdf
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#.
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
Consistencia
La consistencia es una cualidad que tiene un objeto que resiste sin corromperse
fácilmente.
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.
Fuente: https://laraveles.com/series/poo/tipos-datos-programacion-orientada-objetos/
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.
Fuente: http://ayudasprogramacionweb.blogspot.com/2012/12/tipos-de-datos-referencia-y-
ejemplos-java.html
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:
Figura 1. Constructores.
Nota. Se puede usar para establecer valores iniciales para los atributos de
objeto.
Fuente:http://www.edu4java.com/es/java/constructores-palabra-clave-this.html
Fuente: http://www.edu4java.com/es/java/constructores-palabra-clave-this.html
Fuente: http://www.edu4java.com/es/java/constructores-palabra-clave-this.html
Fuente: http://www.edu4java.com/es/java/constructores-palabra-clave-this.html
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
- 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
Objeto
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/
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:
Fuente: https://javiergarciaescobedo.es/programacion-en-java/2-clases-y-objetos/218-
instanciacion-de-objetos
Figura 14. Palabra reservada new
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:
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.
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.
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
Clase 1: Número
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.
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
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.
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.
import java.util.Scanner;
{
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
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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
{
public static void main(String[] args) throws Exception
{
while{
bw.write(c);
c=br.read();
bw.close();
br.close();
}
Cuadro de diálogo
Resultado
Figura 4. Fuente: https://www.discoduroderoer.es/entrada-y-salida-de-datos-en-java/
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.
Figura 5.
Fuente: https://rogersorianos.files.wordpress.com/2012/11/arreglos_java.png
Características
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á:
Arreglos primitivos
Tabla 1
NOMBR RANGO
TIPO OCUPA
E APROXIMADO
(Sin métodos; no
son objetos; no
necesitan una short Entero 2 bytes -32768 a 32767
int Entero 4 bytes 2*109
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
import java.util.Scanner;
{
if(numero[i]%2==0)
contadorPares++;
else
}
}
}
Figura 8. https://www.discoduroderoer.es/formas-de-ordenar-un-array-en-java/
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.
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
Fuente: https://www.redeszone.net/2018/06/15/anadir-excepciones-windows-defender-windows-10/
Ejemplos
Jerarquía de clases
Jerarquía de clases
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.
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.
Error de tipo
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.
Fuente: https://www.gerencie.com/tipos-de-errores-en-excel.html
Fuente: https://exceltotal.com/evitar-errores-de-division-entre-cero-en-excel/
Error de desborde
Fuente: http://www.forosdelweb.com/f69/error-6-desbordamiento-visual-basic-954306/
1. Error
2. IOException
3. RuntimeException
Excepciones que se dan durante la ejecución del programa. Este tipo de error
tiene sus propias derivadas que son:
- Excepciones verificadas
Excepciones no verificadas
La cláusula Throws
Throw
throw ObjetoThrowable;
Fuente: http://dis.um.es/~bmoros/Tutorial/parte9/cap9-3.html
La sentencia Try
Sintaxis de la sentencia Try
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.
Bloque Try – Catch
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
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:
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.
Palabras
Descripción
clave
Veamos un ejemplo.
throw new NombreClasedeExcepcion()
Un método que llama a otro que lanza una excepción, se debe declarar de la
siguiente forma:
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.
Ejemplo
Solución
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.
Tabla 1
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
Paso 1
Figura 1. http://www.cs.umss.edu.bo/doc/material/mat_gral_33/ArreglosEstaticos.pdf
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
Inicialización de arreglos
numeros[j] = j++;
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
Serie de elementos o
formación tipo vector o matriz.
arrays Lo consideraremos un objeto
especial que carece de
métodos.
Long
Float
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
Map
Iterator
7.3.1. Arraylist
De forma general, un ArrayList en Java se crea de la siguiente manera:
Por ejemplo:
a.add("Lenguaje");
a.add(3);
a.add('a');
a.add(23.5);
“Lenguaje” 2 ‘a’ 23.5
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:
Tipo debe ser una clase. Indica el tipo de objetos que contendrá el array.
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:
Métodos de Arraylist
Tabla 3
Método Descripción
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
System.out.println(array.get(i));
for(Integer i: numeros){
System.out.println(i);
for(Object o: nombreArray){
System.out.println(o);
Utilizando un objeto Iterator.
(http://docs.oracle.com/javase/9/docs/api/java/util/Iterator.html)
Ejemplo
…..
.....
Copiar un Arraylist
Figura 5. http://puntocomnoesunlenguaje.blogspot.com/2012/12/arraylist-en-java.html
La instrucción:
ArrayList ventas1 = ventas;
Figura 6. http://puntocomnoesunlenguaje.blogspot.com/2012/12/arraylist-en-java.html
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
7.3.2. Hashmaps
Un HashMap es una colección de objetos, (como los Arrays), pero estos no
tienen orden. ¿De qué se trata?
Por ejemplo:
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.
Ejemplo
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.
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.