Java Cliente Servidor
Java Cliente Servidor
Sistemas UNI
Febrero - 2016
Programa: Java Developer Cloud Computing
PRESENTACI0N
INDICE
INTRODUCCIÓN ................................................................................................................................. 25
BREVE HISTORIA ................................................................................................................................ 25
¿QUÉ ES JAVA? ................................................................................................................................... 26
¿QUÉ APLICACIONES HAY EN EL SDK? ................................................................................................. 28
COMPILACIÓN: JAVAC .......................................................................................................................... 29
EJECUCIÓN DE APLICACIONES: JAVA .................................................................................................... 29
CONCEPTOS GENERALES .................................................................................................................... 30
Comentarios .................................................................................................................................. 30
Identificadores............................................................................................................................... 30
Palabras reservadas ...................................................................................................................... 30
Tipos de datos primitivos ............................................................................................................... 31
DECLARACIONES DE VARIABLES ......................................................................................................... 32
CONSTANTES ..................................................................................................................................... 32
ASIGNACIONES .................................................................................................................................. 33
STRINGS ............................................................................................................................................. 33
OPERADORES ..................................................................................................................................... 35
ESTRUCTURAS DE CONTROL DE FLUJO................................................................................................ 36
Condicionales ................................................................................................................................ 36
Bucles ............................................................................................................................................ 37
EL MÉTODO MAIN ................................................................................................................................ 38
TRABAJANDO CON ARREGLOS ............................................................................................................ 39
Definición ...................................................................................................................................... 39
Arreglos multidimensionales .......................................................................................................... 39
CADENAS ........................................................................................................................................... 40
Construcción de cadenas. .............................................................................................................. 40
Concatenación ............................................................................................................................... 41
Operaciones con cadenas .............................................................................................................. 41
Arreglos de cadenas ...................................................................................................................... 43
CAPÍTULO 5 UTILIDADES........................................................................................................................ 80
Capítulo 1
INTRODUCCIÓN A GIT Y GITHUB
OBTENER EL SOFTWARE
Te recomiendo que instales GIT FOR WINDOWS, la ruta es la siguiente:
https://git-for-windows.github.io/
Git-2.6.1-64-bit.exe
Es posible que en este momento que estás leyendo este documento ya exista una
nueva versión.
PROCESO DE INSTALACIÓN
Durante el proceso de instalación debes integrarlo con la consola de Windows.
1. Ventana de bienvenida, solo debes hacer click en el botón Next.
2. Ventana de licencia del software, solo debes hacer click en el botón Next.
COMANDOS INICIALES
Todos los comandos se deben ejecutar en la consola de Windows. Personalmente,
tengo una carpeta GitHub donde tengo todos mis repositorios que mantengo en
GitHub.
E:\GitHub>git
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
E:\GitHub>git --version
git version 2.6.1.windows.1
Registra tu nombre
Es muy importante que registres tu nombre para saber quién o quienes estan
registrando cambios en el repositorio.
La sintaxis es la siguiente:
EDITAR REPOSITORIO
Crea un archivo
En la carpeta demo del repositorio procede a crear un archivo nuevo de nombre
info.txt, y registra información sobre información que registraras en tu repositorio.
La siguiente imagen muestra lo que podría ser el archivo info.txt.
git status
E:\GitHub\demo>git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .gitignore
Untracked files:
(use "git add <file>..." to include in what will be committed)
info.txt
no changes added to commit (use "git add" and/or "git commit -a")
E:\GitHub\demo>git add .
Para confirmar la lista de archivos preparada con git add, se debe utilizar el
comando git commit.
E:\GitHub\demo>git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
En este caso indica que el repositorio esta adelantado 1 commit con respecto a
repositorio origen, y se debe utilizar git push para subir los cambios.
Cuando ejecutas este comando te solicita tu cuenta de usuario y clave, salvo que ya
se encuentre configurado, como es mi caso.
E:\GitHub\demo>git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
E:\GitHub\demo>type info.txt
Este repositorio es demostrativo.
Sirve para ilustrar el uso de Git y GitHub.
Esto ha sido una introducción a Git y GitHub, suficiente para utilizarlo como
repositorio en los cursos de programación, pero si lo que necesitas es usarlo para
control de versiones te recomiendo que consultes el material oficial de Git.
Capítulo 2
F U N D A M E N T O S D E J AVA
INTRODUCCIÓN
Java es un lenguaje de programación orientado a objetos desarrollado por SUN cuya
sintaxis está basada en C++, por lo que todos aquellos que estén acostumbrados a
trabajar en este lenguaje encontrarán que la migración a Java se produce de forma
sencilla y podrán verlo como su evolución natural: un lenguaje con toda la potencia de
C++ que elimina todas las estructuras que inducían a confusión y que aumentaban la
complejidad del código y que cumple todos los requerimientos actualmente del
paradigma de programación orientada a objetos.
BREVE HISTORIA
Java no surgió inicialmente como un lenguaje de programación orientado a la web. Los
orígenes se remontan al año 1991 cuando Mosaic (uno de los primeros browsers) o la
World Wide Web no eran más que meras ideas interesantes. Los ingenieros de Sun
Microsystems estaban desarrollando un lenguaje capaz de ejecutarse sobre productos
electrónicos de consumo tales como electrodomésticos.
Simultáneamente James Gosling, el que podría considerarse el padre de Java, estaba
trabajando en el desarrollo de una plataforma software de bajo costo e independiente
del hardware mediante C++. Por una serie de razones técnicas se decidió crear un
nuevo lenguaje, al que se llamó Oak, que debía superar algunas de las deficiencias de
C++ tales como problemas relacionados con la herencia múltiple, la conversión
automática de tipos, el uso de punteros y la gestión de memoria.
El lenguaje Oak se utilizó en ciertos prototipos de electrónica de consumo pero en un
principio no tuvo el éxito esperado dado que la tecnología quizás era demasiada
adelantada a su tiempo. No obstante lo positivo de estos primeros intentos fue que se
desarrollaron algunos de los elementos precursores de los actuales componentes
Java; componentes tales como el sistema de tiempo de ejecución y la API.
En 1994 eclosionó el fenómeno web y Oak fue rebautizado como Java. En un
momento de inspiración, sus creadores decidieron utilizar el lenguaje para desarrollar
un browser al que se llamó WebRunner, que fue ensayado con éxito, arrancando en
ese momento el proyecto Java/HotJava. HotJava fue un browser totalmente
programado en Java y capaz así mismo de ejecutar código Java.
A lo largo de 1995 tanto Java, su documentación y su código fuente como HotJava
pudieron obtenerse para múltiples plataformas al tiempo que se introducía soporte
para Java en la versión 2.0 del navegador Netscape.
¿QUÉ ES JAVA?
Java no es sólo un lenguaje de programación, Java es además un sistema de tiempo
de ejecución, un juego de herramientas de desarrollo y una interfaz de programación
de aplicaciones (API). Todos estos elementos así como las relaciones establecidas
entre ellos se esquematizan en la figura 2.
El desarrollador de software escribe programas en el lenguaje Java que emplean
paquetes de software predefinidos en la API. Luego compila sus programas mediante
el compilador Java y el resultado de todo ello es lo que se denomina bytecode
compilado. Este bytecode es un archivo independiente de la plataforma que puede ser
ejecutado por máquina virtual Java. La máquina virtual puede considerarse como un
microprocesador que se apoya encima de la arquitectura concreta en la que se
ejecuta, interactuando con el sistema operativo y el hardware, la máquina virtual es por
tanto dependiente de la plataforma del host pero no así el bytecode. Necesitaremos
tantas máquinas virtuales como plataformas posibles pero el mismo bytecode podrá
ejecutarse sin modificación alguna sobre todas ellas.
COMPILACIÓN: javac
Para generar el archivo .class, que es el bytecode que recibe el entorno de ejecución,
se usa el compilador javac que recibe el código fuente en un archivo con extensión
.java. Para compilar una aplicación basta con compilar la clase principal, aquella
donde está el método main, y después de forma automática se va llamando para
compilar todas las clases que necesite. Estas clases deben ser accesibles a través de
la variable de entorno CLASSPATH.
Vamos a hacer un pequeño ejemplo para probar el compilador. Abrir el NotePad y
copiar las siguientes líneas y a continuación guardar el archivo como HolaUNI.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class HolaUNI {
public static void main(String[] args) {
System.out.println("Hola UNI!");
}
}
CONCEPTOS GENERALES
En Java todos los programas se construyen a partir de clases, dentro de esas clases
encontramos declaraciones de variables (instrucciones atómicas) y procedimientos o
funciones (conjuntos de instrucciones).
Comentarios
Los comentarios son cadenas de texto que el programa usa para entender y hacer
inteligible su código a otros. Los comentarios son ignorados por el compilador. Java
tiene tres tipos de comentarios como los que ilustraremos en el siguiente programa:
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class HolaUNI {
Identificadores
Los identificadores se usan para nombrar y referirnos a las entidades del lenguaje
Java, entidades tales como clases, variables o métodos. Java es sensible a la
diferenciación de mayúsculas y minúsculas, así pues una variable contador no es la
misma que otra Contador y pueden, aunque no sea aconsejable, coexistir sin
problemas. Un identificador tampoco puede ser igual a una palabra reservada.
Palabras reservadas
Las palabras reservadas por el lenguaje Java son las que se muestran a continuación.
Al final de este curso conoceremos el significado de la mayoría de ellas:
abstract, default , if, this, implements, package, throw, boolean, double, import,
private, break, else, byte, extends, instanceof, public, try, case, final, int, cast, finally,
return, void
Caracteres: char
Los caracteres se almacenan en el tipo char. Java utiliza el código Unicode de
16 bits (diferenciándose de la mayor parte de lenguajes clásicos, como C/C++,
que utilizan ASCII de 8 bits). Unicode es un superconjunto de ASCII, es decir
ASCII está contenido en Unicode, pero esto último proporciona muchísimos
más caracteres (los dos bytes permiten tener 216=65.536 caracteres diferentes
frente a los 28=256 caracteres del ASCII extendido). Los caracteres se
encierran entre comillas sencillas (‘’) y no dobles (“”). Los caracteres de escape,
al igual que en C/C++, se preceden de la barra invertida (\). Tenemos lo
siguiente códigos de escape:
Booleanos: boolean
A diferencia de C/C++ los valores cierto y falso que se utilizan en expresiones
lógicas, no se representan con un entero que toma los valores 1 y 0, sino que
existe un tipo destinado a tal efecto, el tipo boolean que toma valores true y
false.
DECLARACIONES DE VARIABLES
Una variable es una estructura que se referencia mediante un identificador que nos
sirve para almacenar los valores que usamos en nuestra aplicación. Para usar una
variable debemos declararla previamente de un tipo. Veamos algunos ejemplos:
boolean b;
int numero
float decimal=43.32e3f
int contador=0;
char c='a';
CONSTANTES
El concepto de constante no puede entenderse estrictamente en el paradigma de
orientación a objetos y por ello en Java no existen las constantes propiamente dichas.
Esto se explicará con más detalle cuando pasemos al capítulo de orientación a
objetos, por el momento diremos que lo más parecido que tenemos a una constante es
una variable de clase no modificable que se declara de la siguiente manera:
Por ejemplo:
ASIGNACIONES
El operador de asignación, como ya hemos visto en las inicializaciones de variables,
es el "=", por ejemplo:
bool javaEsGenial;
javaEsGenial=true;
int edad;
edad=22;
byte -> short -> int -> long -> float -> double
También puede hacerse en forma explícita cuando tiene que ser al revés mediante un
casting, siendo responsabilidad del programador la posible pérdida de información ya
que Java no producirá ningún error. Por ejemplo:
float radio;
radio = 5; // no es necesaria la conversión explícita de int a float
int perimetro;
perimetro = radio * 2 * PI; // error! no se puede guardar en un int
// el resultado de una operación con float
perimetro = (int) (radio * 2 * PI) // Ahora es correcto porque el
// casting fuerza la conversión
STRINGS
Ante todo dejar claro que los strings no son tipos primitivos en Java. Son una clase
implementada en la biblioteca estándar aunque con ciertas funcionalidades que hacen
que su uso sea comparable al de los tipos primitivos en ciertos aspectos. Podemos
declarar e inicializar strings como:
OPERADORES
Java define operadores aritméticos, relacionales, lógicos de manipulación de bits, de
conversión de tipo, de clase, de selección y de asignación. No debe preocuparse si
ahora no queda claro el significado de alguno de ellos
{
bloqueCuerpo
}
Condicionales
Permiten desviar el flujo de ejecución por una rama u otra dependiendo de la
evaluación de una condición. Existen dos estructuras condicionales, el if :
if (condición1)
{bloque1}
[else if (condición2)
{bloque2}
...]
[else
{bloqueN}]
Que puede tener una o más ramas que evalúen condiciones y opcionalmente un else
cuyo bloque se ejecutará sólo si no se ha cumplido ninguna de las condiciones
anteriores. Toda condición (en estas estructura y en adelante) debe evaluarse a un
valor booleano no pudiéndose utilizar valores enteros como en C/C++. La otra
estructura condicional es el switch que permite elegir un bloque en función del valor de
una variable de referencia:
switch (variableReferencia) {
case valor1:
{bloque1}
[case valor2:
{bloque2}
...]
[default:
{bloqueN}
]
}
variableReferencia sólo puede ser una expresión que evalúe a los tipos primitivos
enteros o char. Se evalúa la expresión y sucesivamente se va comprobando que
coincida con alguno de los valores, en caso de que así sea se ejecuta el bloque
correspondiente. Hay que tener en cuenta que la última instrucción de cada bloque
debe ser un break porque en caso contrario el flujo del programa seguiría por la
primera instrucción del siguiente bloque y así sucesivamente (esto puede ser útil en
alguna circunstancia pero no es deseable generalmente). Si variableReferencia no
coincide con ninguna de los valores del case, se ejecutará, caso de existir, el bloque
correspondiente al default; en caso contrario, simplemente se seguiría con la próxima
instrucción después del switch.
Bucles
Los bucles son estructuras iterativas que ejecutan un cierto bucle mientras se da una
cierta condición. Java dispone de tres tipos de bucles. Tenemos en primer lugar el
while:
while (condicion){
bloque
Que ejecutará el código del bloque mientras condición se evalúe a cierto. La sentencia
do ..while:
do{
bloque
}while (condicion)
Es muy similar sólo que garantiza que el bloque se ejecutará al menos una vez, ya que
la evaluación de la condición se produce después de la ejecución del bloque.
Finalmente tenemos el clásico for:
for(inicializazion;condicion;incremento)
{
bloque
}
Que de forma análoga permite ejecutar un bloque mientras se da una cierta condición.
El for tiene de particular que la inicialización (generalmente un contador) y el
incremento queda encapsulado en la misma estructura. Es útil para recorrer
estructuras de datos secuenciales. La palabra reservada break en cualquiera de los
tres bucles fuerza la salida del bucle pasándose a ejecutar la siguiente instrucción
EL MÉTODO main
El método main es la primera operación que se ejecuta en un programa Java, el que
se encarga de poner todo en marcha, y sólo puede haber uno. Su declaración es como
sigue: public static void main(String[]args) y siempre debe ser
exactamente así, ya que si modificamos (u olvidamos) alguno de los modificadores
Java no lo interpreta como el método main y cuando intentáramos ejecutar la
aplicación obtendríamos un error que precisamente nos diría esto más o menos: “no
puedo ejecutar el programa porque no existe un método main”. Como puede observar,
el método main siempre recibe un parámetro que es un array de String.
Este array contiene los parámetros que opcionalmente le hemos podido pasar por la
línea de comandos. ¿Qué significa esto? Habitualmente cuando ejecutamos un
programa lo hacemos de la siguiente manera:
En este caso hemos llamado a nuestra aplicación y le hemos pasado tres parámetros,
p1, p2 y p3, que se almacenan precisamente en el parámetro args del método main.
Para acceder a ellos nada más fácil que hacer:
Tener en cuenta que args es un array de String’s por lo que aunque nosotros pasemos
desde la línea de parámetros números, estos son interpretados como String y si
queremos el int, por ejemplo, correspondiente a esa representación tendremos que
aplicar el método de conversión adecuado.
El número de parámetros que se han pasado por la línea de comandos puede
consultarse mirando la longitud del array:
Definición
Un arreglo es una colección de variables del mismo tipo. La longitud de un arreglo es
fija cuando se crea.
Se declara el arreglo
Inicialmente la variable referencia un valor nulo potencias-> null
int[] potencias; //forma más usada
int potencias[];
Se crea el arreglo
Se requiere la longitud del arreglo potencias-> 0
potencias = new int[4]; 0
En caso de variables primitivas se inician en 0 o false. Las 0
primitivas no se pueden operar con el valor null. 0
En caso de variables referencia se inician en null. No
referencian a ningún objeto.
Se inicia los valores del arreglo.
Se asignan valores elemento por elemento potencias-> 1
potencias[0] = 1; 2
potencias[1] = 2; 4
potencias[2] = 4; 8
potencias[3] = 8;
Los arreglos pueden ser creados e iniciados al mismo tiempo
int[] potencias = {1,2,4,8};
Los arreglos son muy usados para buscar datos, especialmente si se conocen sus
valores cuando se crean.
Arreglos multidimensionales
Se trata de arreglos de arreglos y se declara de la siguiente forma:
Ejemplo:
{
int n= 10;
int p= 20;
double[][] m = new double[n][p];
for (int i= 0; i<n; i++)
for (int j= 0; j<p; j++)
m[i][j]= i+j;
}
CADENAS
Una cadena es una secuencia de caracteres. La librería String (o clase String) se usa
para definir todas las cadenas en Java. Las cadenas se delimitan con comillas dobles.
System.out.println("Hola Mundo.");
String camara = "Camara";
String luces = camara + " Accion";
String vacio = "";
Construcción de cadenas.
También se puede usar la siguiente sintaxis para construir cadenas.
Concatenación
Para concatenar cadenas puede usar lo siguiente:
// Usando el operador +
System.out.println(" Nombre = " + nombreDocente );
// 012345678901234567890123
String nombre = "Gustavo Coronel Castillo";
String subCadena = nombre.substring(8,15);
System.out.println(subCadena);
// 01234567890123456789012345
String blog = "www.desarrollasoftware.com";
int posicion1 = blog.indexOf("soft");
int posicion2 = blog.indexOf("r",7);
int posicion3 = blog.indexOf("t");
Arreglos de cadenas
Un arreglo de cadenas también sigue los pasos de creación de arreglos.
Capítulo 3
PROGRAMACIÓN
O R I E N TA D A A O B J E TO S
UN NUEVO PARADIGMA
OO es un nuevo paradigma de diseño y programación.
OO se basa en modelar objetos del mundo real.
OO crea componentes de software reusables.
Los objetos contienen en sí mismo información (atributos y datos) y
comportamiento (métodos).
OBJETO
Definición
Definición filosófica: Es una entidad que se puede reconocer.
Para la tecnología de objetos: Es una abstracción de un objeto del mundo
real.
En términos de negocios: Es una entidad relevante al dominio del negocio.
En términos de software: Es una estructura que asocia datos y funciones.
Algunos ejemplos de objetos son: Cliente, Factura, Contrato, Película.
Un Cliente tiene atributos, por ejemplo: nombre, dirección, crédito. Un Cliente tiene
comportamiento, por ejemplo: alquilar una película, pagar una factura, devolver una
película.
Encapsulamiento
El encapsulamiento oculta como las cosas funcionan dentro de un objeto. Solo nos
comunicamos con el objeto a través sus métodos. Los métodos son una interfaz que
permite ignorar como están implementados. No es posible evadir el encapsulamiento
en OO
El cajero automático es un objeto que entrega dinero.
El cajero encapsula todas las operaciones a los tarjetahabientes.
Persona
getEdad
Cliente getNombre edad
o Mensaje getDireccion nombre
Transmisor getEdad() setEdad direccion
setNombre
setDireccion
Composición de objetos
Los objetos están compuestos de otros objetos. Los objetos son partes de otros
objetos. Esta relación entre objetos se conoce como Agregación o Composición,
según sea el caso.
CLASES
Una clase es un molde para crear objetos. Para definir una clase se tiene que indicar
las operaciones y atributos. Los objetos son instancias de la clase. Cuando se crea un
cajero automático no se requiere indicar sus operaciones y atributos.
Solo se requiere indicar a que clase pertenece.
Clase Cliente Película
Atributos int edad String titulo
Métodos String nombre double precio
String dirección String categoria
cambiarDireccion() cambiarPrecio()
HERENCIA
Entre diferentes clases puede haber similitudes. La herencia es una relación entre
clases donde una es padre de otra. Las propiedades comunes definen la superclase.
Clase padre. Las subclases heredan estas propiedades. Clase hija. Un objeto de una
clase hija es un-tipo-de una superclase. Un Helicóptero es un tipo de Nave Aérea.
Dirigible
Helicóptero
Jumbo
Globo
POLIMORFISMO
Significa que la misma operación se realiza en diferentes tipos de objetos de diferente
forma. Estas operaciones tienen el mismo significado, comportamiento. Internamente
cada operación se realiza de diferente forma.
Abordar pasajeros
Definición de clase
Una clase es un molde para crear múltiples objetos que encapsulan datos y
comportamiento.
Paquetes
Un paquete es un contenedor (agrupador) de clases que están relacionadas
lógicamente. Un paquete tiene sus clases en un mismo directorio. Varias clases
pueden tener el mismo nombre pero en diferente paquete.
Modificadores de acceso
Java controla el acceso a las variables y métodos a través de modificadores de acceso
como: private, public y protected. Un elemento público puede invocarse en cualquier
clase. Un elemento sin modificador solo se puede invocar desde el mismo paquete. Un
elemento protegido solo se invocar en clases heredadas. Un elemento privado no
puede ser invocado por otra clase.
Creación de objetos
Cada objeto es una instancia de alguna clase.
Pelicula
private String titulo;
private String tipo; Odisea 2001 El Padrino
Public void mostrarDetalles()
public void obtenerTitulo() Ciencia Ficcion Drama
La referencia null
Los objetos inician en null Pelicula pelicula1 = null;
Se puede comparar un objeto if (pelicula1 == null)
con null pelicula1 = new Pelicula();
Se puede liberar la referencia pelicula1 = null;
con null.
Asignando referencias
Se puede asignar una variable referencia a otra, el resultado es dos referencias al
mismo objeto.
MÉTODOS
Definición
Los métodos definen el comportamiento de los objetos.
Los métodos solo se definen dentro de una clase.
Argumentos
En la definición del método se indica el tipo y el nombre de los argumentos del
método.
Valores de retorno
Se usa la sentencia return para salir del método retornando un valor. No se requiere
return si el tipo de retorno es void.
Invocando métodos
Se utiliza el operador punto para invocar el método de una clase, si el método es de la
misma clase, no se requiere el calificador de la clase.
Pelicula.java
PruebaPeliculas.java
ENCAPSULAMIENTO
Las variables de instancia de una clase deberían ser declaradas como privadas. Solo
un método debería acceder a las variables privadas. No se debe acceder a las
variables de instancia directamente, sino a través de un método.
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Pelicula {
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class TestPrimitivas {
run:
0
150
run:
Drama
Terror
SOBRECARGA DE MÉTODOS
Algunos métodos en una clase pueden tener el mismo nombre. Estos métodos deben
contar con diferentes argumentos. El compilador decide que método invocar
comparando los argumentos. Se generara un error si los métodos solo varian en el tipo
de retorno.
Tipo Valor
char '0'
byte, short, int, long 0
boolean false
float, double 0.0
Referencia a Objeto null
CONSTRUCTORES
Para una adecuada iniciación de variables de instancia, la clase debe tener un
constructor. Un constructor se invoca automáticamente cuando se crea un objeto. Se
declaran de forma pública. Tiene el mismo nombre que la clase. No retorna ningún
valor. Si no se codifica un constructor, el compilador crea uno por defecto sin
argumentos que solo inicia las variables de instancia.
Pelicula.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Pelicula {
public Pelicula() {
titulo = "Pelicula sin definir.";
}
TestConstructores.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class TestConstructores {
run:
Pelicula sin definir.Drama
La lista de Schindler.Drama
El dormilon.Comedia
La referencia: this
Los métodos de instancia reciben el argumento this implícitamente que se refiere al
mismo objeto.
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Pelicula {
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Pelicula {
public Pelicula(){
this("Pelicula sin definir");
}
TestThis.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class TestThis {
run:
Pelicula sin definir.
Todo sobre mi madre
VARIABLES DE CLASE
Las variables de clase comparten un único valor entre todas las instancias de la clase.
Se declaran con el calificador static.
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public Class Pelicula {
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public Class Pelicula {
// Iniciación explicita
private static double precioMinimo = 3.29;
MÉTODOS DE CLASE
Estos métodos son compartidos por todas las instancias. Se usan estos métodos
principalmente para manipular variables de clase. Se les declara con el calificador
static. Se invoca a este método de clase con el nombre de la clase o con el
nombre de una instancia.
HERENCIA Y POLIMORFISMO
Se estudia el uso de la herencia y el polimorfismo en el reúso de clases.
Herencia
Permite a una clase compartir la misma estructura de datos y comportamiento de otra
clase. La herencia minimiza la necesidad de duplicar código. El Polimorfismo permite
utilizar el método de acuerdo al objeto heredado.
Superclase Item
La herencia en Java
Una subclase se define indicando a que superclase extiende.
Una subclase hereda todas las variables instancia de la superclase. Las variables de
instancia deben ser private para que instancias de la subclase hereden sus valores.
La referencia super
Se refiere a la clase padre. Se usa para invocar constructores de la clase padre. Debe
ser la primera sentencia del constructor de la clase hijo. Esta referencia también se
usa para invocar cualquier método del padre.
Métodos
La superclase define los métodos para todas las subclases. La subclase puede
especificar métodos propios.
Item0.java
Pelicula0.java
TestSuper.java
Item1.java
Pelicula1.java
TestSobrescribir.java
}
}
La referencia super
Si una subclase sobrescribe un método de la superclase; el método de la superclase
se puede invocar con la referencia super.
Item2.java
Equipo2.java
TestSuper2.java
Polimorfismo
Permite efectuar una misma operación dependiendo del tipo de objeto.
TacoraFilms inicia sus operaciones alquilando únicamente películas. Tres meses
después amplia el alquiler a equipos, juegos y libros. El alquiler de una película es 2
soles por día de alquiler. El alquiler de un equipo consta de un seguro de 50 soles
además de 5 soles por día. El alquiler de juegos depende del fabricante. PlayStation 2
soles/día, Nintendo 1 sol/día. Los libros no se alquilan, se prestan uno a la vez,
mientras sean clientes de la tienda.
Explique por qué se obtienen los resultados
Alquiler3.java
Item3.java
Pelicula3.java
Equipo3.java
Juego3.java
String fabricante;
Libro3.java
TestPolimorfismo.java
testOperador(oscar);
testOperador(vhs);
testOperador(mu);
testOperador(agua);
}
Variables finales
Una variable final es una constante. Una variable final no puede ser modificada. Una
variable final debe ser iniciada. Una variable final por lo general es pública para que
pueda ser accesada externamente.
Métodos finales
Un método puede ser definida como final para evitar la sobre-escritura en una
subclase. Un método final no se puede redefinir en una clase hijo.
if (password.equals(...
}
Clases finales
Una clase final no puede ser padre de otra clase. Una clase puede ser definida como
final para evitar la herencia. El compilador es más eficiente con definiciones final por
qué no buscara estas clases o métodos al tratar clases heredadas.
EL MÉTODO finalize()
Cuando todas las referencias de un objeto se pierden, se marcan para que el Garbage
Collector los recoja y libere ese espacio en memoria.
El objeto "Zelig" que estaba referenciado por pelicula ha perdido todas sus
referencias. Luego el Garbage Collector liberara el espacio ocupado por "Zelig". El
método finalize es llamado justo antes que el Garbage Collector libere la memoria. En
este instante se puede aprovechar para realizar otras operaciones.
Capítulo 4
C L A S E S A B S T R A C TA S
E I N T E R FA S E S
Se estudiara el uso de clases abstractas, métodos abstractos, interfaces,
implementación de interfaces.
CLASES ABSTRACTAS
Clases abstractas
Sirven para modelar objetos de alto nivel, no contienen código, sino solo
declaraciones. Todos sus métodos deben existir en sus clases hijas. Una clase
abstracta no puede ser instanciada (Crear un objeto a partir de ella).
Métodos abstractos
Estos métodos son parte de clases abstractas. Un método abstracto debe ser
redefinido en las subclases. Cada subclase puede definir el método de manera
diferente. Las clases abstractas pueden contener métodos que no son abstractos,
estos son métodos concretos.
Item.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public abstract class Item {
// Método abstracto
public abstract boolean esAlquilable();
// Método concreto
public float getPrecio() {
return precio;
}
Pelicula.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Pelicula extends Item{
Libro.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Libro extends Item {
Abstracto.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Abstracto {
System.out.println("PELICULA");
System.out.println("Alquilable:" + pelicula.esAlquilable());
System.out.println("Precio:" + pelicula.getPrecio());
System.out.println("LIBRO");
System.out.println("Alquilable:" + libro.esAlquilable());
System.out.println("Precio:" + libro.getPrecio());
run:
PELICULA
Alquilable:true
Precio:5.0
LIBRO
Alquilable:false
Precio:0.0
INTERFACES
Una interface es totalmente abstracta; todos sus métodos son abstractos, sus atributos
son públicos estáticos y final. Una interface define los métodos que otras clases
pueden implementar pero no provee ninguna línea de código. Una clase solo puede
heredar de una superclase. Una clase puede implementar muchas interfaces; por lo
que las interfaces permiten herencia múltiple.
Conducible
No Conducible
Las interfaces describen la conducta que requiere muchas clases. El nombre de una
interface por lo general es un adjetivo como Conducible, Ordenable, Ubicable.
También se puede definir la interface sin los calificadores public static final
abstract, puesto que son implícitos. Para declarar que una clase implementa una
interface se usa implements.
Conducible.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public interface Conducible {
// Girar a la izquierda
void girarIzquierda(int grados);
// Girar a la derecha
void girarDerecha(int grados);
NaveArea.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class NaveAerea {
Globo.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Globo extends NaveAerea implements Conducible {
Patin.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Patin implements Conducible {
TestInterface.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class TestInterface {
run:
GLOBO
Dirección: E
PATIN
Giro de 45 grados a la derecha
Capítulo 5
UTILIDADES
Se estudiara el uso de colecciones de objetos y una técnica de ordenación mediante
interfaces.
LA CLASE Object
Todas las clases en java heredan de la clase java.lang.Object. Los siguientes métodos
se heredan de la clase Object
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class PruebaReferencia {
Integer objetoPrecio;
objetoPrecio = new Integer(precio);
System.out.println("C.- " + objetoPrecio.toString());
System.out.println("D.- " + objetoPrecio);
System.out.println("E.- " + (objetoPrecio + 5));
System.out.println("F.- " + objetoPrecio.intValue());
System.out.println("G.- " + (objetoPrecio.intValue() + 5));
run:
A.- 0
B.- 7
C.- 2
D.- 2
E.- 7
F.- 2
G.- 7
COLECCIONES
Es un conjunto librerías para manipular y almacenar datos. Estas librerías se llaman
colecciones.
Las colecciones se organizan en:
Reto:
Arquitectura
Referencia:
https://docs.oracle.com/javase/tutorial/collections/intro/index.html
Métodos estáticos que son algoritmos (por ejemplo ordenar una lista).
Interfaces de colecciones
La interface Collection
add(Object) Añade el objeto en la colección
addAll(Collection) Añade la colección.
clear() Quita todos los elementos de la colección.
contains(Object) ¿El objeto se encuentra en la colección?
containsAll(Collection) ¿Todos esos elementos están en la colección?
equals(Object) ¿Es igual esta colección al argumento?
isEmpty() ¿La colección está vacía?
Iterator iterator() Devuelve un iterador para la colección.
remove(Object) Elimina una aparición del objeto
removeAll(Collection) Elimina todos esos objetos
retainAll(Collection) Se queda sólo con los objetos del argumento
size() Número de elementos en la Colección
toArray() Devuelve un arreglo con los objetos de la colección.
La interface List
Colecciones ordenadas (secuencias) en las que cada elemento ocupa una posición
identificada por un índice. El primer índice es el 0. Las listas admiten duplicados.
La interface Map
Son pares de datos (clave, valor). No puede haber claves duplicadas y cada clave se
corresponde con al menos un valor.
Clases implementadas
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Producto {
public Producto() {
}
import java.util.ArrayList;
import java.util.Iterator;
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class MercadoLista {
// Se define un ArrayList
ArrayList lista = new ArrayList();
run:
Lista del mercado con 6 productos
colecciones.Producto@2a139a55
colecciones.Producto@15db9742
colecciones.Producto@6d06d69c
colecciones.Producto@7852e922
colecciones.Producto@4e25154f
colecciones.Producto@15db9742
Lista del mercado con 5 productos
Pan - 6
Carne - 2
Manzanas - 5
Brocoli - 2
Carne - 2
Lista del mercado con 0 productos
Objetos Duplicados
Debe notar que un objeto esta duplicado, se está considerando dos veces.
Producto.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Producto {
public Producto() {
}
@Override
public boolean equals(Object objeto) {
boolean rpta = false;
if (objeto != null) {
Producto producto = (Producto) objeto;
if (this.getNombre().equals(producto.getNombre())) {
return true;
}
}
return rpta;
}
@Override
public int hashCode() {
return this.getNombre().hashCode();
}
Un Set no cuenta con índice, por lo que para eliminar un elemento se indica el
objeto.
MercadoHashSet.java
import java.util.HashSet;
import java.util.Iterator;
/**
*
// Definir un HashSet
HashSet lista = new HashSet();
lista.add(pan);
lista.add(leche);
lista.add(manzanas);
lista.add(brocoli);
lista.add(carne);
lista.add(res);
run:
Lista del mercado con 5 productos
colecciones.Producto@6c2e9d68
colecciones.Producto@3ddf86b
colecciones.Producto@45e6467
colecciones.Producto@1387d
colecciones.Producto@c90fb9f
Lista del mercado con 4 productos
Brocoli - 2
Carne - 2
Leche - 2
Pan - 6
Lista del mercado con 0 productos
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Producto implements Comparable {
public Producto() {
@Override
public boolean equals(Object objeto) {
boolean rpta = false;
if (objeto != null) {
Producto producto = (Producto) objeto;
if (this.getNombre().equals(producto.getNombre())) {
return true;
}
}
return rpta;
}
@Override
public int hashCode() {
return this.getNombre().hashCode();
}
@Override
public int compareTo(Object objeto) {
// Indica en base a que atributos se compara el objeto
// Devuelve +1 si this es > que objeto
// Devuelve -1 si this es < que objeto
// Devuelve 0 si son iguales
Producto producto = (Producto) objeto;
String nombreObjeto = producto.getNombre().toLowerCase();
MercadoTreeSet.java
import java.util.Collection;
import java.util.TreeSet;
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class MercadoTreeSet {
// Definir un TreeSet
TreeSet lista = new TreeSet();
lista.add(pan);
lista.add(leche);
lista.add(manzanas);
lista.add(brocoli);
lista.add(carne);
lista.add(res);
run:
Lista del mercado con 5 productos
Brocoli - 2
Carne - 2
Leche - 2
Manzanas - 5
Pan - 6
Lista del mercado con 4 productos
Brocoli - 2
Carne - 2
Leche - 2
Pan - 6
Lista del mercado con 0 productos
Producto.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class Producto implements Comparable {
public Producto() {
}
@Override
public boolean equals(Object objeto) {
boolean rpta = false;
if (objeto != null) {
Producto producto = (Producto) objeto;
if (this.getNombre().equals(producto.getNombre())) {
return true;
}
}
return rpta;
}
@Override
public int hashCode() {
return this.getNombre().hashCode();
}
@Override
public int compareTo(Object objeto) {
// Indica en base a que atributos se compara el objeto
// Devuelve +1 si this es > que objeto
// Devuelve -1 si this es < que objeto
// Devuelve 0 si son iguales
MercadoCollections.java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class MercadoCollections {
// Definir un ArrayList
ArrayList lista = new ArrayList();
+ "|" + producto.getCantidad());
}
}
run:
Lista del mercado con 5 productos
0.- Pan|6
1.- Carne|2
2.- Leche|2
3.- Manzanas|5
4.- Brocoli|2
Lista del mercado con 5 productos
0.- Brocoli|2
1.- Carne|2
2.- Leche|2
3.- Manzanas|5
4.- Pan|6
Pan es el elemento 4
Ejemplo de HashMap
AgendaHashMap.java
import java.util.HashMap;
import java.util.Map;
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class AgendaHashMap {
run:
Ejemplo de TreeMap
AgendaTreeMap.java
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class AgendaTreeMap {
// Definir un TreeMap
TreeMap<String, String> agenda = new TreeMap();
run:
Capítulo 6
MANEJO DE EXCEPCIONES.
¿QUÉ ES UN ERROR?
En java es cuando la situación es irrecuperable y termina el programa.
¿CUÁL ES LA DIFERENCIA?
Una excepción se puede controlar en el programa. Un error no.
CARACTERÍSTICAS DE JAVA
Cuando ocurre una excepción en un método, Java lanza (throw) una excepcion
(Exception).
El objeto Exception generado contiene el tipo de excepción, y el estado del programa
cuando ocurrió el error.
Java separa los detalles del manejo de errores del código principal, obteniéndose un
código más legible y menos propenso a errores de codificación.
EXCEPCIONES
Devolviendo la excepción hasta el manejador de excepciones. No se requiere que
cada método invocado maneje la excepción, sino únicamente lo hará el primer
manejador de excepciones de la lista de métodos invocados.
Metodo1 Metodo1
Manejo de errores Manejo de excepciones
Código de error
Metodo2 Metodo2
Código de error
Metodo3 Metodo3
Código de error
Excepcion
Metodo4 Metodo4
Metodo1 Metodo1
Manejo de errores Manejo de excepciones
Metodo2 Metodo2
Metodo3 Metodo3
Código de error
Excepcion
Metodo4 Metodo4
Throwable
Todos los errores y excepciones heredan de la clase Throwable
Throwable
Error Exception
Errores
Heredan de la clase Error; estos se generan cuando ocurren errores fatales para el
programa como por ejemplo: cuando la memoria esta llena o cuando es imposible
encontrar una clase requerida.
Excepciones no controladas
Heredan de la clase RuntimeException. Estas ocurren cuando por ejemplo se divide
entre cero o se intenta acceder a un elemento del arreglo fuera de sus límites.
Mediante código se puede capturar, manipular o ignorar estas excepciones. Si no
maneja el error, java terminara el programa indicando el estado del error.
Excepciones controladas
Heredan de la clase Exception. Estas deben ser capturadas y manejadas en algun
lugar de la aplicación. Las excepciones creadas por el programador seran heredadas
de la clase Exception.
EXCEPCIONES NO CONTROLADAS
No necesitan ser controladas en el código.
El JVM terminara el programa cuando las encuentra.
Si no desea que el programa termine tendrá que manejarlas.
La documentación del java indicara que excepciones lanza los métodos del java.
Clase : java.io.FileInputStream
Método: public FileInputStream(String name) throws FileNotFoundException
Método: public int read() throws IOException
int cantidad;
String cadena = "5";
try {
cantidad = Integer.parseInt(cadena);
}
catch ( NumberFormatException e) {
System.err.println(cadena + " no es un entero");
}
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class TestMultiException {
run:
5
Error en 5/0
Reto:
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class TestFinally {
run:
Se trabajó con 5 y 0
Reto:
Realice otras pruebas cambiando el valor de las variables.
TestThrows.java
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class TestThrows {
run:
Error en abcde 6
Reto:
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class UserFileException extends Exception {
/**
*
* @teacher Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public void ReadUserFile throws UserFileException {
try {
// Código que manipula un archivo
}
catch (IOException e) {
throw new UserFileException(e.toString());
}
Capítulo 7
BUENAS PRÁCTICAS
PROGRAMACIÓN EN CAPAS
Introducción
Cuando se construye software como producto empresarial o comercial, se llevan a
cabo varias técnicas de manera que el desarrollo se haga en forma ordenada y así
poder asegurar un avance continúo del proyecto, un producto final de calidad, y
además realizar posteriores mejoras sea una tarea más fácil.
Existen muchas prácticas de programación, dependiendo del tipo de software que se
va adesarrollar y de la disciplina o disciplinas de programación que se utilicen en el
desarrollo del producto.
Una de las más utilizadas se llama la programación por capas, que consiste en dividir
el código fuente según su funcionalidad principal.
La programación para lograr sacarle el mayor provecho a la programación por capas
se necesita seguir una serie de pasos complejos los cuales primeramente deben ser
definidos para cada proyecto específico, luego deben ser revisados para asegurarse
de que el modelo adoptado cumpla con las normas necesarias para que la aplicación
sea del agrado del usuario, y por último debe ser implementado por el grupo de
desarrollo encargado para tal fin, los cuales siguiendo el modelo propuesto obtienen
una herramienta útil para facilitar la labor de programación dividiendo la aplicación en
módulos y capas fáciles de pulir.
aplicación sin que esto sea una tarea tediosa y desgastante, siguiendo el estándar
establecido para tal fin y dividiendo las tareas en partes específicas para cada capa
del proyecto.
Las principales capas que siempre deben estar en este modelo son:
Capa de Presentación o Frontera
Capa de Lógica de Negocio
Capa de Datos
capturando y desplegando los datos necesarios para realizar alguna tarea. En esta
capa los datos se procesan de manera superficial por ejemplo, para determinar la
validez de su formato o para darles algún orden específico.
Esta capa se comunica únicamente con la Capa de Lógica de Negocio.
Capa de Datos
Es la encargada de realizar transacciones con bases de datos y con otros sistemas
para obtener o ingresar información al sistema.
El manejo de los datos debe realizarse de forma tal que haya consistencia en los
mismos, de tal forma los datos que se ingresan así como los que se extraen de las
bases de datos, deben ser consistentes y precisos.
Es en esta capa donde se definen las consultas a realizar en la base de datos, tanto
las consultas simples como las consultas complejas para la generación de reportes
más específicos.
Esta capa envía la información directamente a la capa de reglas de negocio para que
sea procesada e ingresada en objetos según se necesite, esta acción se denomina
encapsulamiento.
Ventajas y Desventajas
La programación en capas no es una técnica rígida que debe implementarse
solamente de una forma, sino que los desarrolladores de proyectos tienen múltiples
maneras de implementarla según las tecnologías y tendencias que se utilicen.
La satisfacción de los requerimientos del usuario es la base para escoger el modelo de
implementación a seguir. La tendencia a utilizar el modelo de programación en capas
es grande cuando se trata principalmente de aplicaciones empresariales donde se
deben manejar gran cantidad de subsistemas y módulos, así como generar reportes lo
suficientemente complejos como para necesitar un orden estricto a la hora de
desarrollar el proyecto.
Dentro del concepto de programación en capas, existen dos términos esenciales para
el mejor entendimiento de los conceptos relativos a esta metodología, es aquí donde
radica la importancia de la cohesión y el acoplamiento dentro de una aplicación
generada mediante este método.
Cohesión
Este término es utilizado para describir el comportamiento que deben tener los
módulos y objetos de un sistema o subsistema, comportamiento que describe
la forma en que deben trabajar los objetos y módulos entre sí, con alta
cohesión para que trabajando en conjunto los módulos y objetos puedan
alcanzar un solo propósito de manera más eficaz y rápida.
Determina que las operaciones de un objeto deben trabajar en conjunto para
alcanzar un propósito común. Es deseable que haya alta cohesión.
Acoplamiento
Se refiere al grado de dependencia que existe entre los módulos. Este grado de
dependencia debe ser considerablemente bajo ya que el trabajo se divide en
módulos para que cada uno tenga un funcionamiento específico y puede ser
más factible la implementación por separado de cada uno. En caso de haber
alto acoplamiento entre módulos no se estaría alcanzando el principal objetivo
de este modelo, el cual es dividir una tarea grande en varias pequeñas, ya que
los módulos actuarían como uno solo al estar altamente acoplados entre sí y se
perdería el objetivo primordial de dividir el proyecto.
Ventajas
Al implementar este modelo de programación, se asegura un trabajo de forma
ordenada y separada, debido a que sigue el principio de “divide y vencerás”.
Cada capa está dividida según su funcionalidad cuando se quiere modificar el sistema
basta con cambiar un objeto o conjunto de objetos de una capa. Esto se llama
modularidad.
Desventajas
Cuando se implementa un modelo de programación en capas, se debe llegar a un
balance entre el número de capas y subcapas que componen el programa. Este debe
ser el necesario y suficiente para realizar un trabajo específico con eficiencia y ser lo
más modular posible.
De lo contrario se tiene una serie de desventajas como: pérdida de eficiencia,
realización de trabajo innecesario o redundante entre capas, gasto de espacio de la
aplicación debido a la expansión de las capas, o bien una alta dependencia entre los
objetos y capas que contradice el objetivo principal del modelo.
Conclusiones
La programación en capas ha sido una de las últimas tendencias en cuanto a software
comercial se refiere, es una tendencia que bien aplicada puede resultar en un
desarrollo de software eficiente.
Sin embargo, no todos los equipos ni empresas desarrolladoras usan un sistema
rígido, ni existe una forma estricta en la que tenga que implementarse el modelo de
capas, cada quién debe hacerlo según sus necesidades, alcances y lo más
importante; las tendencias y nuevas tecnologías que vayan surgiendo.
Es importante tener en cuenta que no importa el lenguaje de programación usado, o el
tipo de implementación que se le dé al modelo; se debe buscar una alta cohesión y
un bajo acoplamiento dentro de los objetos y capas para lograr que la aplicación sea
fácilmente desarmable y sea más sencillo realizar mejoras y actualizaciones al
sistema.
PRINCIPIOS SOLID
SOLID es un acrónimo inventado por Robert C.Martin para establecer los cinco
principios básicos de la programación orientada a objetos y diseño. Este acrónimo
tiene bastante relación con los patrones de diseño, en especial, con la alta cohesión y
el bajo acoplamiento.
primer sitio donde se empezó a utilizar. Esto conlleva a tener métodos difíciles de
detectar y encontrar de manera que el código hay que tenerlo memorizado en la
cabeza.
O-Abierto/Cerrado (Open/Closed)
Principio atribuido a Bertrand Meyer que habla de crear clases extensibles sin
necesidad de entrar al código fuente a modificarlo. Es decir, el diseño debe ser abierto
para poderse extender pero cerrado para poderse modificar. Aunque dicho parece
fácil, lo complicado es predecir por donde se debe extender y que no tengamos que
modificarlo. Para conseguir este principio hay que tener muy claro cómo va a funcionar
la aplicación, por donde se puede extender y cómo van a interactuar las clases.
El uso más común de extensión es mediante la herencia y la reimplementación de
métodos. Existe otra alternativa que consiste en utilizar métodos que acepten una
interface de manera que podemos ejecutar cualquier clase que implemente ese
interface. En todos los casos, el comportamiento de la clase cambia sin que hayamos
tenido que tocar código interno.
Como ya he comentado llega un momento en que las necesidades pueden llegar a ser
tan imprevisibles que nos topemos que con los métodos definidos en el interface o en
los métodos extensibles, no sean suficientes para cubrir las necesidades. En este caso
no habrá más remedio que romper este principio y refactorizar.
KISS
Kiss es un acrónimo en inglés que significa “Keep it simple, stupid”, que en español
vendría siendo “Manténlo simple, estúpido”. Una traducción más suave que también
se usa es “Keep it super simple”, es decir: “Manténlo súper simple”. El principio
fue formulado por un ingeniero del ejército estadounidense en 1960, y propone que
cualquier sistema que implementemos, un producto, un servicio, un sistema
informático, las soluciones a un problema, etc.; son mucho mejores si se basan en la
simplicidad y sencillez.
Pero la simplicidad no se debe confundir con falta de características o por
implementaciones incompletas. Debe entenderse como un producto, servicio o
solución que es completa justo con lo necesario. No más, no menos; sin florituras,
adornos o extras innecesarios.
Kiss plantea que usted debe evitar cualquier complejidad que no agregue valor a
la solución, y reducir la tendencia de muchas personas de “sobre complicar” las
cosas.
El principio Kiss si bien ha sido aplicado principalmente en el desarrollo de software,
también podría ser de utilidad para cualquier negocio en marcha o cualquier
emprendimiento. Piense en el principio Kiss cuando ande en busca de una idea
millonaria, o identifique que puede resolver una necesidad a través de un nuevo
producto o servicio; o bien, cuando piense en mejorar un proceso actual.
La búsqueda de la solución perfecta y puede acarrear pérdidas de tiempo y dinero,
con soluciones con mayores funcionalidades o características a las que el cliente
necesita.
El principio Kiss implica entender a profundidad la verdadera necesidad del cliente así
como las características y elementos esenciales y no esenciales de una solución,
producto o servicio. Así podrá desechar aquello que no aporte valor. Pregúntese
siempre si lo que está añadiendo es algo imprescindible para atender sus necesidades
o las del cliente.
La perfección se alcanza, no cuando no hay nada más que añadir, sino cuando
ya no queda nada más que quitar.
YAGNI
YAGNI significa “You Aren't Gonna Need It” (No vas a necesitarlo) Es uno de los
principios del Extreme Programming que indica que un programador no debe agregar
funcionalidades extras hasta que no sea necesario.
Aplicar siempre las cosas cuando realmente los necesita, no cuando lo que
prevén que los necesita.
Ron Jeffries
Navaja de Occam
La Navaja de Occam se remonta a un principio metodológico y filosófico,
perfectamente aplicable al desarrollo de software, según el cual, “en igualdad de
condiciones, la explicación más sencilla suele ser la correcta”.
Este principio lo podemos usar tanto en el momento de implementar una solución
como a la hora de encontrar el causante a un bug. ¿Cuántas veces nos habrá pasado
que la metedura de pata más tonta es la causante del problema aunque hayamos
estado comprobando lo más complejo?
Reflexión cuidadosa
Tanto el principio KISS como la Navaja de Occam pueden ser recursos incómodos
para quienes gustan de ver el mundo en polaridades de bueno o malo, correcto o
incorrecto. Son maneras de pensar instrumentales, de tránsito; herramientas para
encarar la ambigüedad y seguir adelante sin entramparse en tediosas discusiones
bizantinas sobre suposiciones, gustos o creencias. También hay que aclarar que estos
principios exigen una mentalidad abierta y crítica para testear los hechos con
frecuencia y someterlos a revisión.
El principio KISS puede convertirse en una filosofía o estilo de vida, aplicable en
cualquier ámbito.
PRINCIPIO DRY
Un ejemplo.
Supongamos que estamos haciendo una parte de un sistema en el cual se almacenará
un catálogo de productos, digamos de frutas. Normalmente lo primero que haremos es
crear la base de datos. En la base de datos se tendrían (por ejemplo) estos campos:
id, código, nombre, precio. En la misma base de datos agregamos ciertas restricciones
cambios en el objeto fruta, hacer los cambios en el controller y en el view para la lista,
hacer los cambios en el controller y en el view (que incluye dos validaciones de
javascript). Además….qué fácil será confundirnos.
A todo esto la documentación estaba ya lista, y habrá que cambiarla, pero por falta de
tiempo creemos que se quedará tal y como está.
He aquí lo que nos pasa cuando violamos el principio DRY. El principio DRY establece
que la información, o el conocimiento debe estar almacenado en UN SOLO LUGAR,
para evitar lo engorroso que es hacer cambios en mil lados cuando hacen, además de
ahorrarnos la tendencia a cometer errores cuando hay que cambiar muchas cosas que
significan lo mismo.
Analicemos los cambios: agregar un campo y modificar otro. Este conocimiento, en
gran parte está almacenado en la base de datos (aunque no todo, por ejemplo en la
base de datos no podemos hacer ciertas validaciones para los códigos, o cosas
parecidas).
Nadie negará la utilidad de patrones como el MVC, o de ideas como el ORM. Pero a
veces esas soluciones crean una sobre ingeniería tan grande que no sé si compensan
sus soluciones.
Capítulo 8
P AT R O N E S D E S O F T WA R E
INTRODUCCIÓN
Los Patrones de Software son recomendaciones probadas y sirven como modelo para
dar soluciones a problemas comunes en el desarrollo del software. Son considerados
en la actualidad como buenas prácticas en la ingeniería de software.
Un patrón define una posible solución correcta para un problema de software dentro
de un contexto dado, describiendo las cualidades invariantes de todas las soluciones.
En 1979 el arquitecto Christopher Alexander aportó al mundo de la arquitectura el libro
"The Timeless Way of Building"; donde, proponía el aprendizaje y uso de una serie de
patrones para la construcción de edificios de una mayor calidad. Aquí escribió la
siguiente frase "Cada patrón describe un problema que ocurre infinidad de veces en
nuestro entorno, así como la solución al mismo, de tal modo que podemos utilizar esta
solución un millón de veces más adelante sin tener que volver a pensarla otra vez.".
Sin embargo, no fue hasta principios de los 90's cuando los patrones de diseño de
software tuvieron un gran éxito en el mundo de la informática a partir de la publicación
del libro "Design Patterns", escrito por GoF (Gang of Four) y compuesto por
Erich Gamma, Richard Helm, Ralph Johnson y John Vlisides. El libro plantea 23
patrones de diseño comunes (Factory, Singleton, Adapter, Facade, Command, Iterator
entre otros)
Hoy en día existe una variedad de patrones que permite uniformizar y diseñar
soluciones estándar de software, y que muy bien pueden ser aplicados en el desarrollo
de aplicaciones empresariales utilizando Java.
Los patrones bastante usados en el desarrollo de aplicaciones son MVC (Model View
Controller), DAO (Data Access Object) y DTO (Data Transfer Object).
SINGLETON
Contexto
Existen escenarios donde la aplicación sólo necesita emplear una única instancia
(objeto) de una clase, y esta debe ser accesible desde los diferentes componentes del
sistema.
Las clases que cumplen estas características suelen tener alguna de las siguientes
funciones:
Controlar el acceso a un recurso que por su naturaleza no admite el acceso
concurrente (impresora, socket, fichero).
Obtener referencias de clases que actúan como servidoras de recursos (pool
de conexiones).
Ejecutar código carente de estado (si el estado no cambia solo necesitamos
una instancia).
Mantener un estado que debe ser globalmente único.
Por ejemplo, un sistema de log se ajusta a estas características porque:
Controla el acceso al recipiente de la información de log.
Toda la información de log se envía a través de un punto único.
Su único estado es la configuración, que es global y no suele variar.
Problema
Necesitamos crear una instancia de una clase que sea accesible globalmente, y que
sea única.
Solución
El patrón Singleton proporciona la siguiente solución:
Hacer que la clase provea una instancia de sí misma.
Permitir que otros objetos obtengan esa instancia, mediante la llamada a un
método de la clase.
Declarar el constructor como privado, para evitar la creación de otros objetos.
El diagrama UML correspondiente es muy simple y se muestra en la Figura 19.
Este diagrama UML muestra cómo se implementa el patrón Singleton en una clase.
Contiene una propiedad estática (el subrayado indica que es un método de clase), y
que el método getInstancia() retorna un objeto de la misma clase.
Según la notación UML el número 1 en la esquina superior derecha, indica que
solamente habrá una instancia de esta clase. El signo "-" en el constructor, lo señala
como privado. Esto consigue que nadie aparte de la propia clase, pueda crear una
instancia.
A continuación tenemos un ejemplo de la implementación del patrón Singleton en una
clase de nombre Demo.
private Demo() {
}
. . . . . .
Contexto
Aplicaciones interactivas con interfaces humano-computador cambiantes y flexibles.
Problema
Es muy frecuente que se solicite cambios a la interfaz de usuario. Los cambios a la
interfaz deberían ser fáciles y no tener consecuencias para el núcleo del código de la
aplicación.
Solución
Contexto
En general, los componentes de un sistema necesitan intercambiar datos.
Problema
Se requiere enviar y recuperar un conjunto de datos entre un objeto y otro.
Solución
Crear una clase que agrupe un conjunto de datos que se desea transferir y por lo
general implemente solo métodos set y get para asignar y recuperar los datos.
Clase Data Transfer Object (DTO) antes llamado Value Object (VO).
Contexto
El contexto para las fuentes de datos presenta muchas características que hacen difícil
tener componentes estándares y escalables. A continuación se enumeran algunas
características de este entorno:
El acceso a los datos varía dependiendo de la fuente de datos.
El acceso al almacenamiento persistente, tal como Bases de Datos, varia
bastante dependiendo del tipo de almacenamiento.
Tenemos Bases de Datos relacionales, orientadas a objetos y
multidimensionales, archivos planos, XML, NoSQL, etc.
Diferentes implementaciones de los proveedores.
Problema
Todo sistema necesita una capa de persistencia de datos, por lo tanto, podemos
afirmar que no se tiene un problema, realmente se tienen varios problemas que se
describen a continuación:
Necesidad de acceso a una fuente de datos.
Se tiene diferentes API para acceso a mecanismos de almacenamiento
persistente.
Las API varían entre RDBMS (Sintaxis SQL, formato de datos, etc.).
Se tienen API propietarias.
Difícil migración/portabilidad entre diferentes fuentes de datos.
Dependencias de código.
Solución
La solución la tenemos en el patrón Data Access Object (DAO) para abstraer y
encapsular todo el acceso a la fuente de datos, cuyas características se describen a
continuación:
DAO administra las conexiones con la fuente de datos, recupera y almacena
información en la fuente de datos.
Independiente del mecanismo de almacenamiento persistente.
DAO actúa como adaptador entre los componentes de negocio y la fuente de
datos.
usamos una capa de lógica persistencia, sino que interactuamos con la base de datos
directamente desde la capa de lógica de negocio, entonces vamos a tener que
modificar todas las clases, cambiando todas las consultas SQL, la manera de acceder
a la base de datos, etc. para adecuarse al nuevo motor de la base de datos.
Bien, ahora que sabemos porque es importante tener separadas las capas de lógica
de negocio y de persistencia, vamos a ver cómo utilizar el patrón de diseño DAO para
crear nuestra propia capa de lógica de persistencia.
Como se explicó párrafos anteriores, DAO encapsula el acceso a la base de datos.
Por lo que cuando la capa de la lógica de negocio necesite interactuar con la fuente de
datos, va a hacerlo a través de la API que le ofrece DAO. Generalmente esta API
consiste en métodos CRUD (Create, Read, Update y Delete). Por ejemplo, cuando la
capa de lógica de negocio necesite guardar un dato en la base de datos, va a llamar a
un método create(). Lo que haga este método, es problema del DAO y depende de
cómo el DAO implemente el método create(), puede que lo implemente de manera que
los datos se almacenen en una base de datos relacional, como puede que lo
implemente de manera que los datos se almacenen en ficheros de texto. Lo importante
es que la capa de lógica de negocio no tiene por qué saberlo, lo único que sabe es
que el método create() va a guardar los datos, así como el método delete() va a
eliminarlos, el método update() actualizarlos, etc. Pero no tiene idea de cómo
interactúa DAO con la fuente de datos.
DAO consiste básicamente en una clase que es la que interactúa con la fuente de
datos. Los métodos de esta clase dependen de la aplicación y de lo que queramos
hacer. Pero generalmente se implementan los métodos CRUD para realizar las “4
operaciones básicas” de una base de datos.
Los DTO (Data Transfer Object) o también denominados TO (TransferObject), son
utilizados por el DAO para transportar los datos desde la base de datos hacia la capa
de la lógica de negocio y viceversa. Por ejemplo, cuando la capa de lógica de negocio
llama al método create(), ¿qué es lo que hace DAO? inserta un nuevo registro que la
capa de la lógica de negocio le pase como parámetro a través de un DTO.
Podría decirse que un DTO es un objeto simple, que tiene como atributos los datos del
modelo, con sus correspondientes métodos getters y setters.
Capítulo 9
PRÁCTICAS DE LABORATORIO
PRACTICA 01
Objetivo
Aplicar el concepto de Orientación a Objetos para resolver problemas sencillos
utilizando dos capas.
Enunciado
La empresa "Todo Barato" necesita facilitar la elaboración de los pedidos que
realizan los empleados del departamento de compras a sus proveedores, el problema
radica al momento de calcular el impuesto.
La empresa ha solicitado a su departamento de sistemas elaborar un programa en
Java que permita ingresar el importe del pedido, y calcule el impuesto y el total que se
debe pagar al proveedor.
Abstracción
Se necesita un componente que implemente dos servicio:
Cálculo del impuesto: se encarga de calcular el impuesto en base al importe.
Calculo del total: se encarga de calcular el total en base al importe.
Como parte del análisis se ha elaborado el siguiente diagrama:
PRACTICA 02
Objetivo
Aplicar el concepto de encapsulación, la orientación a objetos y la programación en
capas.
Enunciado
Una institución financiera necesita de un programa que le permita encontrar el importe
que deben pagar sus clientes por los préstamos que realiza, se sabe que se trata de
un interés compuesto, capitalizable mensualmente.
La fórmula que debe aplicarse es:
Dónde:
C : Capital
i : Tasa de interés por periodo, por ejemplo puede ser mensual
n : Número de periodos
M : Importe acumulado en el número de periodos
PRACTICA 03
Objetivo
Aplicar el concepto de encapsulación, la orientación a objetos y la programación en
capas.
Enunciado
La empresa Vía Éxitos Necesita saber cuánto se le debe pagar a sus trabajadores y a
cuánto asciende el importe de impuesto a la renta que debe retener.
Los datos son:
Cantidad diaria de horas trabajadas.
Cantidad de días trabajados.
El pago por hora.
Se sabe que si los ingresos supera los 1500.00 Nuevos Soles se debe retener el 8%
del total correspondiente a la renta.
PRACTICA 04
Objetivo
Aplicar la sobrecarga para disponer de diversas versiones de métodos y constructores
que se puedan aplicar dependiendo de las necesidades que se tengan o se proyecten
tener.
Enunciado
La empresa EduTec necesita de una librería que permita calcular el promedio de un
conjunto de números.
Se sabe que pueden ser 2, 3, 4 o 5 números.
A usted se le ha encargado que desarrolle la librería que necesita Edutec y construya
una aplicación de prueba.
PRACTICA 05
Objetivo
Entender la diferencia entre variables y métodos de instancia y de clase.
Aplicar correctamente variables y métodos de instancia y de clase.
Enunciado
El colegio "Ángeles del Cielo" está solicitando un programa en Java para que los
alumnos de primaria verifiquen sus ejercicios de matemáticas referidos a:
Calculo de factorial
Calculo del MCD y MCM de dos números
La serie de Fibonacci
Número primo
La programación de estos cálculos matemáticos deben estar implementados como
métodos de clase en una clase de nombre MyMath.
PRACTICA 06
Objetivo
Aplicar el concepto de herencia y polimorfismo.
Enunciado
El restaurante "El Buen Sabor" necesita implementar una aplicación que permita a sus
empleados calcular los datos que se deben registrar en el comprobante de pago.
Los conceptos que se manejan cuando se trata de una factura son los siguientes:
Consumo 100.00
Impuesto 19.00
Total 119.00
Servicio (10%) 11.90
Total General 130.90
Cuando se trata de una boleta son los siguientes:
Total 119.00
Servicio (10%) 11.90
Total General 130.90
Diseñe y desarrolle la aplicación que automatice el requerimiento solicitado por el
restaurante.
Se sabe que el dato que debe proporcionar el empleado es el Total.
PRACTICA 07
Objetivo
Aplicar interfaces en el diseño de componentes software.
Aplicar el polimorfismo en el diseño de componentes software
Enunciado
La institución educativa EduTec cuenta con dos tipos de trabajadores: Empleados y
Docentes.
Los empleados cuentan con un sueldo fijo y depende del cargo que ocupa, según la
siguiente tabla:
El sueldo del docente está en función de las horas que dicta, el pago por hora es de
120 Nuevos Soles.
El departamento de recursos humanos necesita una aplicación para calcular la
bonificación que se debe pagar a cada trabajador según el siguiente cuadro:
PRACTICA 08
Objetivo
Entender el concepto de arreglo y colecciones.
Utilizar arreglos y colecciones para manejar grupos de datos relacionados.
Enunciado
La institución educativa SuperTec en su política de darle al profesor las herramientas
computacionales para que pueda realizar su labor, requiere de una aplicación para
que pueda registrar las notas de sus estudiantes.
La aplicación debe permitir obtener los siguientes listados:
Listado de alumnos con sus respectivas notas.
Listado estadístico que incluye: nota promedio, nota mayor, nota menor,
aprobados y desaprobados con respecto al promedio del alumno.
Se sabe que por cada alumno debe registrar 4 notas, y el promedio del alumno se
obtiene promediando las 3 mejores notas.