Módulo - Integración de Programación
Módulo - Integración de Programación
Módulo - Integración de Programación
Integración
de Programación
Prof. Martín Aguirre
Este enfoque resolvió los dos problemas planteados. Primero, ofrecía una
forma natural de dividir un programa muy complejo y, en segundo lugar, el
mantenimiento pasaba a ser controlable. El primer punto es obvio. Al dividir el
programa en unidades informáticas paralelas a las físicas, la descomposición es
automática. El segundo punto también se resuelve. En cada iteración de
simulación, el analista querrá cambiar o bien piezas enteras o bien el
comportamiento de alguna pieza. En ambos casos la localización de los cambios
está perfectamente clara y su alcance se reduce a un componente, siempre y
cuando la interfaz del mismo no cambie. Por ejemplo, si se estuviese simulando el
motor de un coche, puede que se quisiera modificar el una característica utilizada
en la simulación anterior. Si la nueva característica tuviera la misma interfaz
(mismas entradas y salidas) o se cambiase sólo su comportamiento interno, nada
del sistema (aparte de la propia característica) estaría afectado por el cambio.
• El código máquina
• El ensamblador
• Conceptos como la programación procedural
• La programación estructurada
• La programación lógica
• Programación orientada a objetos, siendo éste el paradigma más extendido
hoy en día.
1.1.2 Paradigma
Ahora bien, dentro del mundo del desarrollo de código, también podemos
en Wikipedia: “Un paradigma de programación es una propuesta tecnológica
adoptada por una comunidad de programadores y desarrolladores cuyo núcleo
central es incuestionable en cuanto que únicamente trata de resolver uno o varios
problemas claramente delimitados; la resolución de estos problemas debe suponer
consecuentemente un avance significativo en al menos un parámetro que afecte a
la ingeniería de software.
11
12
Variables
• El primer carácter debe ser una letra, el guión bajo (_) o el signo de dólar
($, aunque está reservado).
• Puede estar seguido de letras, números, el guión bajo o el signo dólar.
• No hay límite para la longitud del nombre.
• No debe ser una palabra clave.
Expresiones
13
14
a) static: los atributos miembros de una clase pueden ser atributos de clase o
atributos de instancia; se dice que son atributos de clase si se usa la
palabra clave static: en ese caso la variable es única para todas las
instancias (objetos) de la clase (ocupa un único lugar en memoria). A veces a
las variables de clase se les llama variables estáticas. Si no se usa static, el
sistema crea un lugar nuevo para esa variable con cada instancia (la variable
es diferente para cada objeto). En el caso de una constante no tiene sentido
crear un nuevo lugar de memoria por cada objeto de una clase que se cree.
Por ello es adecuado el uso de la palabra clave static. Cuando usamos “static
15
b) final: en este contexto indica que una variable es de tipo constante: no admitirá
cambios después de su declaración y asignación de valor “final” determina
que un atributo no puede ser sobrescrito o redefinido. O sea: no funcionará
como una variable “tradicional”, sino como una constante. Toda constante
declarada con final ha de ser inicializada en el mismo momento de declararla.
“final” también se usa como palabra clave en otro contexto: una clase final
(final) es aquella que no puede tener clases que la hereden.
Ejemplos de uso:
16
Bloques
17
Esta es una de las estructuras de control de flujo más básicas dentro de los
lenguajes de programación. Permite, en base a una condición, modificar el flujo de
ejecución y se utiliza para situaciones como “si sucede algo entonces se toma una
decisión; si no sucede, se toma otra decisión”.
…
If (Condicion) Entonces
Accion 1()
Else
Accion 2()
…
meAbrigo();
…
// al finalizar continúa en A
} else { // Caso falso
noMeAbrig();
18
Switch
19
switch(<valor>) {
case <literal>: <codigo> break;
case <literal>: <codigo> break;
…
default: <codigo> break;
}
int opcion = 2;
switch (opcion) {
case 1: …
// código para el caso 1
// sin break, continúa ejecutando el caso 2
case 2: …
// código para el caso 2
break;
// continúa en A
default: …
// código para cuando no es ni 1 ni 2
break;
// continúa en A
}
…
// A
20
int sum = 0;
for(int i = 0; i < 4; i++) {
sum += i;
}
int sum = 0;
for (int i = 0; i < 4; i++) {
if (i == 1) continue; // si i es igual a 1 ir al paso siguiente
if (i == 3) break; // si i es igual a 3 abortar el for
sum += i;
}
assertEquals (sum, 2);
Ciclo While
Debemos tener en cuenta que el ciclo while es más simple que for dado
que solamente tiene la condición y el cuerpo. De esta forma, un ciclo while que
sume los números del 0 al 3 se ve así:
int sum = 0;
int i = 0;
while (i < 4) {
sum += i;
i++;
}
22
Ciclo Do While
El ciclo do while es una variación del ciclo while, donde primero se ejecuta
el cuerpo y posteriormente se pregunta si se cumple la condición para continuar
iterando o no, veamos un ejemplo:
int sum = 0;
int i = 0;
do {
sum += i;
i++;
} while (i < 4);
Hay que ser cuidadosos a la hora de usar esta estructura, porque el cuerpo
se ejecuta sí o sí al menos una vez. Por esta razón debemos ser muy cuidadosos
si estamos trabajando en u proyecto agregamos un ciclo while, y posteriormente
decidimos transformarlo en un do while ya que podemos tener dificultades.
23
int sum = 0;
for (int digito : digitos) {
}
assertEquals(sum, 45);
sum += digito;
Desarrollo de un Thread:
¿Qué es un Thread?
25
26
Cada método sincronizado posee una especie de llave que puede cerrar o
abrir la puerta de acceso. Cuando un subproceso intenta acceder al método
sincronizado mirará a ver si la llave está echada, en cuyo caso no podrá
accederlo. Si método no tiene puesta la llave entonces el subproceso puede
acceder a dicho código sincronizado.
Ahora bien, una vez aclarado, sí podemos verlo como una estructura de
sincronización de threads. Esto se usa para asegurarse de que un solo thread está
ejecutando el código del bloque asociado. Para ello se utiliza un objeto a modo de
llave, solamente un único thread puede tener la llave en un momento dado. El
27
Para tratar de salvar un poco estos problemas, Java introduce clases que
envuelven a los tipos primitivos en objetos que, además, incluyen algunos
métodos para transformar del tipo primitivo a texto y viceversa. Los tipos primitivos
son:
28
“Para caracteres como el retorno de carro y la sangría, Java tiene unos códigos
especiales que sirven también para las cadenas de texto, se les dice caracteres
escapados”.
• Double. Los literales se pueden escribir con los decimales (usando el punto
como separador) o en notación científica.
29
30
“El acceso a los elementos de los arrays se realiza con el operador [] y un índice
entero, podemos ver la forma correcta de realizar esta operación en el siguiente
bloque de código”.
assertEquals(otroArray[0], “a”);
otroArray[0] = “c”;
assertEquals(otroArray[0], “c”);
otroArray[10] = “error”; // arroja una excepción de tipo
ArrayIndexOutOfBOundException
Operadores matemáticos
Java permite operar sobre los tipos numéricos primitivos, usando los
conocidos operadores matemáticos más algunos otros. Estos operadores realizan
funciones que están cableadas en la máquina virtual de Java y no son envíos de
mensajes. Los operadores son:
Operadores aritméticos
31
• <, <=, >, >=: menor, menor o igual, mayor, mayor o igual. Sirven para
comparar valores numéricos primitivos entre sí.
Operadores de bit
• &, |, ^: y, o inclusivo y o exclusivo. Operan sobre los bits que conforman los
tipos primitivos.
• <<, >>, >>>: operadores de corrimiento de bits. Mueven los bits hacia la
izquierda o derecha, tantos bits como se indiquen. En la práctica es igual a
multiplicar o dividir por 2 (mantienen el signo, salvo >>>).
Otros Operadores
33
34
35
36
Siempre definamos los atributos como privados, dado que son detalles
de implementación que deberían estar siempre ocultos a los demás objetos
(incluso a aquellos pertenecientes a alguna subclase). Cuando queremos exponer
un atributo como público, deberíamos hacerlo a través de métodos getter (lectura)
y setter (escritura). Existe la convención de nombrar a estos métodos utilizando
los prefijos get, set o is, seguido del atributo.
37
Esta es sólo una convención Java, pero no quiere decir que sea obligatoria.
Reflexionemos acerca del significado de un método que setea si un objeto está
vacío o no. ¿No tendría que ser, por ejemplo, vaciar()? ¿Y lo contrario, llenar()?
Siempre pensemos en el significado que queremos darle a los métodos en el
contexto de uso.
38
1.1.7 Métodos
¿Qué es un método?
Definición de libro
class Auto {
…
public Marca getMarca() {
return this.marca;
}
public void arrancarCon(final Llave laLlave) throws
LlaveIncorrectaException
{…}
…
}
40
…
auto.cargarEquipaje(unEquipaje, otroEquipaje, yOtroEquipajeMas);
…
Sí, transforma todo del mismo modo que si el mensaje recibiera un array y
en el código del método accediéramos a los argumentos utilizando el parámetro
como un array.
Tal como hemos dicho, un objeto puede considerarse como una especie de
cápsula dividida en tres partes: Relaciones, Propiedades y Métodos que iremos
desarrollando a continuación. Cada uno de estos componentes desempeña un
papel totalmente independiente:
Encapsulamiento y ocultación
Como hemos visto, cada objeto es una estructura compleja en cuyo interior
hay datos y programas, todos ellos relacionados entre sí, como si estuvieran
encerrados conjuntamente en una cápsula. Esta propiedad (encapsulamiento),
es una de las características fundamentales en la POO.
Esto no quiere decir, sin embargo, que sea imposible conocer lo necesario
respecto a un objeto y a lo que contiene. Si así fuera no se podría hacer gran cosa
con él. Lo que sucede es que las peticiones de información a un objeto deben
realizarse a través de mensajes dirigidos a él, con la orden de realizar la
operación pertinente. La respuesta a estas órdenes será la información requerida,
siempre que el objeto considere que quien envía el mensaje está autorizado para
obtenerla.
El hecho de que cada objeto sea una cápsula facilita enormemente que un
objeto determinado pueda ser transportado a otro punto de la organización, o
incluso a otra organización totalmente diferente que precise de él. Si el objeto ha
sido bien construido, sus métodos seguirán funcionando en el nuevo entorno sin
problemas. Esta cualidad hace que la POO sea muy apta para la reutilización de
programas.
43
- Los objetos terminales. Son todos aquellos que descienden de una clase o
subclase y no tienen descendientes. Suelen llamarse casos particulares,
instancias o ítems porque representan los elementos del conjunto representado
por la clase o subclase a la que pertenecen.
1. Relaciones
Las relaciones entre objetos son, precisamente, los enlaces que permiten a
un objeto relacionarse con aquellos que forman parte de la misma organización.
Las hay de dos tipos fundamentales:
44
¿Quién trabajó en óptica? ¿En qué trabajó Newton? ¿Quien trabajó en Física?
45
2. Propiedades
Todo objeto puede tener cierto número de propiedades, cada una de las
cuales tendrá, a su vez, uno o varios valores. En POO, las propiedades
corresponden a las clásicas "variables" de la programación estructurada. Son, por
lo tanto, datos encapsulados dentro del objeto, junto con los métodos (programas)
y las relaciones (punteros a otros objetos). Las propiedades de un objeto pueden
tener un valor único o pueden contener un conjunto de valores más o menos
estructurados (matrices, vectores, listas, etc.). Además, los valores pueden ser de
cualquier tipo (numérico, alfabético, etc.) si el sistema de programación lo permite.
Pero existe una diferencia con las "variables", y es que las propiedades se
pueden heredar de unos objetos a otros. En consecuencia, un objeto puede tener
una propiedad de maneras diferentes:
46
Una operación que realiza acceso a los datos. Podemos definir método
como un programa procedimental o procedural escrito en cualquier lenguaje, que
está asociado a un objeto determinado y cuya ejecución sólo puede
desencadenarse a través de un mensaje recibido por éste o por sus
descendientes.
Polimorfismo
Demonios
48
Descarga e instalación
Les propongo
ropongo descargar el pr
programa JAVA Eclipse (Galileo u otra versión)
desde explorador e instalar la misma a través de la guía de instalación que podrán
encontrar en la clase correspondiente a la lectura del presente material.
49
52
53
55
Ejemplo:
56
Debemos saber que también contamos con una clase auxiliar llamada
Array la cual se encarga de brindar una gran ayuda para trabajar con array y
reflexión. Por ejemplo podemos acceder a creación de nuevos array utilizando el
método denominado newInstance. Este método espera el tipo de los elementos y
las dimensiones.
// creamos un array
String [] a = (String[])
Array.newInstance(String.class, 3);
// verificamos la longitud
assertEquals(3, a.length);
// verificamos que estén en null los elementos
assertArrayEquals(
new String [] {null, null, null}, a);
Además, Array ofrece métodos para leer y escribir valores en los array, así
como también obtener su la longitud. Los métodos para acceder a los elementos
están discriminados por tipos primitivos y luego por uno general para objetos.
57
Las enumeraciones son clases que definen ciertos atributos estáticos donde
cada referencia es una instancia de la misma clase (o una subclase anónima). Por
lo tanto, podemos utilizar las mismas herramientas que vimos para inspeccionar y
manipular clases y atributos mediante reflexión. Además existe cierto protocolo
específico para cuando se da el caso de las enumeraciones.
A, B, C, D, E
}
// verificamos que la clase está marcada como tal
assertTrue(TEST.class.isEnum());
assertArrayEquals(
TEST.values(), TEST.class.getEnumConstants());
58
Algunas Ideas
class FiguraGeometrica{
}
class Triangulo extends FiguraGeometrica {
}
59
Algunas Consideraciones
• Una variable de referencia puede ser de un solo tipo, y una vez que fue
declarada, ese tipo jamás puede modificarse..... por ejemplo, si declaramos
triangulo de tipo FiguraGeometrica, no podemos decir mas adelante que
el mismo objeto triangulo es de tipo FiguraPuntiaguda...
1.2.5 Encapsulamiento
¿Qué es encapsulamiento?
61
En programación modular
modular, y más específicamente en programación
orientada a objetos,, se denomina Encapsulamiento al ocultamiento del estado,
es decir, de los datos miembro de un objeto de manera que sólo se pueda cambiar
mediante las operaciones definidas para ese objeto.
62
1. Estándar: (Predeterminado)
2. Abierto: Hace que el miembro de la clase pueda ser accedido desde el
exterior de la Clase y cualquier parte del programa.
3. Protegido: Solo es accesible desde la Clase y las clases que heredan (a
cualquier nivel).
4. Semi cerrado: Solo es accesible desde la clase heredada.
5. Cerrado: Solo es accesible desde la Clase.
mc.setTipo(5);
63
• En cascada.
• Iterativo (o incremental).
64
Lenguaje UML:
Los objetivos de UML son muchos, pero se pueden sintetizar sus funciones:
65
66
67
Aquí hay otra idea que se puede generalizar: un objeto que se desglosa en
otros objetos. Podríamos llamarlo el patrón "Objeto - Componente":
68
1 - El Patrón proxy
69
70
71
72
73
74
1 - Expande la carpeta “lib”” dentro de Eclipse y selecciona todos los archivos JAR
que necesitas.
75
Ejemplo de invocación:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
76
Los paquetes son la manera en que tiene Java para organizar las clases en
agrupaciones que tengan sentido. Los paquetes sirven para importar las clases
que usamos. También para permitir qué clases, que representan cosas distintas
pero se llaman igual, pueden coexistir (por ejemplo la clase Punto, para geometría
y la clase Punto para gráficos 3D). Los paquetes en Java siguen la misma
estructura de directorios que contiene a los archivos fuentes. Para crear un
paquete, tan solo debemos crear una clase que indique que pertenece a ese
paquete, y respetar la estructura de directorios. Para ello utilizamos la palabra
clave package seguida del nombre completo del paquete (paquetes padres y su
nombre al final). Debe ser la primera instrucción del archivo fuente:
package padre1.padre2.padre3.nombre;
import red.user.java.*;
import red.user.java.ClaseParticular;
77
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class C1 {
public static void main(String args[]) throws IOException {
File file = new File("Fich1.txt");
file.createNewFile(); // crea el fichero
FileWriter writer = new FileWriter(file);
writer.write("Game\n Thrones\n");
78
BufferedReader y BufferedWriter
BufferedReader
public String readLine() throws IOException
// Recupera una linea del fichero.
public int read() throws IOException
public boolean ready() throws IOException
public void reset() throws IOException
public long skip(long n) throws IOException
79
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class C1 {
public static void main(String[] args) throws IOException {
File fichero = new File(fich1.txt");
// FileWriter crea el fichero
FileWriter fw = new FileWriter(fichero);
FileReader fr = new FileReader(fichero);
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("Person of interest");
bw.close();
String s;
// Lee una linea del fichero.
// Si no hay datos devuelve null.
while ((s = br.readLine()) != null) {
System.out.println(s);
// Person of interest
}
80
PrintWriter
void flush()
// Escribe en el fichero lo que está en la memoria buffer.
PrintWriter format(String format, Object... args)
PrintWriter printf(String format, Object... args)
void write(String s)
PrintWriter append(char c)
void print(String s)
void println(Object x)
void close()
81
}
}
File
No se usa para leer ni escribir datos si no para crear ficheros, abrirlos, tratar
con paths, etc. Oracle lo define como representación abstracta de nombres de
ficheros y directorios.
82
import java.io.File;
import java.io.IOException;
public class C1 {
public static void main(String[] args) throws IOException {
File myDir = new File("myDir");
// No crea el directorio mydir.
System.out.println("Creando directorio: " + myDir.mkdir()); // true
System.out.println("Elementos dentro del directorio: " + myDir.list().length); //0
File f = new File(myDir, "fich1.txt");
if (!f.exists()) {
System.out.println("Create file f: " + f.createNewFile()); // true
}
System.out.println("Eliminar fichero f: " + f.delete());
// true
System.out.println("Eliminar directorio mydir: " + myDir.delete());
// true
File newDir = new File("newDir");
83
¿A qué nos referimos con diagnóstico y excepciones? Tal como nos infiere
la mente al escuchar la palabra y llevándonos hacia el resultado de un estudio
médico sobre nuestro cuerpo, sí diríamos que no estamos errados. Se trata del
diagnóstico que debemos hacer durante el proceso de planeamiento de un
proyecto, en el desarrollo, al finalizarlo y también durante su vida útil; Logrando
que podamos detectar errores dentro de los tres procesos de funcionamiento
(durante el ingreso, procesamiento y egreso de los parámetros / información).
84
85
86
87
INTENTAR
LeerArchivo (f)
AvanzarArchivo (f)
ObtenerEntero (Leer(f))
Cuerpo
88
FINALMENTE
CuCerrarArchivo (f)
89
90
try {
… // código que en algún punto puede producir una excepción
} catch (TipoDeExcepcion excepcion) {
… // código para manejar la situación de error
}
91
try {
…
} catch(UnTipoDeExcepcion excepcion) {
…
} catch(OtroTipoDeExcepcion otraExcepcion) {
…
} catch(YOtroTipoMasDeExcepcion yOtraExcepcionMas) {
…
}
Excepción Uso
IllegalArgumentException Parámetro no nulo inválido.
IllegalStateException El objeto receptor se encuentra en un estado
inválido para ejecutar el método.
NullPointerException Parámetro nulo.
IndexOutOfBoundException Parámetro para usar como índice en una
colección es inválido
92
93
Excepciones chequeadas
Excepciones no chequeadas
Errores
95
96
97
Limitaciones de MySQL:
Creación de tablas:
Eliminación de tablas:
100
Tipos de datos:
MySQL cuenta con un rico conjunto de tipos de datos para las columnas,
que es necesario conocer para elegir mejor cómo definir las tablas. Los tipos de
datos se pueden clasificar en tres grupos:
• Numéricos.
• Cadenas de caracteres
• Fechas y horas
101
El comando anterior crea una tabla con dos columnas. Ambas ocuparán un
espacio de 4 bytes, pero al mostrarse, la columna x ocupará un espacio de 4
dígitos y la columna y,, de 5. Tanto zerofill como unsigned deben escribirse
siempre antes que cualquier otro atributo de columna.
102
Cadena de caracteres:
Si observamos la tabla, vemos que el único tipo de dato que siempre utiliza
el tamaño especificado por M es el tipo char. Por este motivo, se ofrece el tipo
varchar que ocupa sólo el espacio requerido por el valor de la columna.
103
Los tipos text y blob son equivalentes, pero text respeta las mayúsculas,
minúsculas y caracteres acentuados en la ordenación.
Fechas y Horas:
104
Este formato de alter table permite, además, insertar las columnas antes
(before) o después (after) de una columna en cuestión. Las columnas no
deseadas pueden eliminarse con la opción drop.
105
Copiar tablas:
106
Modificación de filas:
107
108
• Compilador gcc
• Librerías libgc
cd /usr/local/src
tar xzvf mysql-VERSION.tar.gz
cd mysql-VERSION
109
./configure –prefix=/usr/local/mysql
Make
make install
Crear la base de datos inicial del servidor, la que almacenará los usuarios y
privilegios. Esta base de datos es imprescindible para que los usuarios se puedan
conectar al servidor.
scripts/mysql_istall_db
110
Todos los archivos deben ser propiedad de root (mysql no debe poder
modificarse a sí mismo) y del grupo mysql. El directorio de datos será del usuario
mysql para que pueda trabajar con las bases de datos, ficheros de registro, etc.
cp support-files/my-medium.cnf /etc/my.cnf
Lanzar el servidor
/usr/local/mysql/bin/mysql_safe &
mysql -u root –p
112
Para que los mensajes del servidor aparezcan en español, se debe ejecutar
con el parámetro -language:
$ mysqld --language=spanish
[mysqld]
language = /usr/share/mysql/spanish
(En éste caso, nuestra terminal puede ser cualquier equipo capaz de conectarse a
otro, ya que ni siquiera lleva instalado el cliente MySQL)
114
Para ello, basta con abrir el programa Telnet, introducir el nombre del
anfitrión, un nombre de usuario y una contraseña. Si no tiene claro cómo hacerlo,
consulte al administrador de su sistema o bien a través de tutoriales en la red.
Ahora bien, para poder lograr integrar tanto MySQL con JAVA de
Eclipse es necesario recurrir a un paquete de instalación externo. El mismo
podrán encontrarlo en la Clase correspondiente a éste apartado y será muy
sencilla su instalación y uso.
Operadores
Los operadores son los bloques con los que se construyen las consultas
complejas. Los operadores lógicos (como AND y OR) permiten asociar varias
condiciones de distintas formas. Los operadores aritméticos (como + o *)
permiten realizar operaciones matemáticas básicas en sus consultas. Los
operadores de comparación (como > o <) permiten comparar valores y restringir
los conjuntos de resultados. Por último, los operadores bit n bit, aunque no se
utilicen habitualmente, permiten trabajar con bits en las consultas.
Operadores lógicos
Los operadores lógicos reducen las opciones a true (1) o false (0). Por
ejemplo, si le pregunto si es hombre OR mujer (estoy asumiendo que quiero una
respuesta afirmativa o negativa), la respuesta será si o true. Si la pregunta fuera si
115
Operadores aritméticos
116
117
118
+- +-+- +
+-+------+- +
+- +-+------ +
En primer lugar, necesitaremos crear la tabla para que reciba los siguientes
resultados:
119
+------+------ +-+
+--- +- +-+
+------+------ +-+
UPDATE.
120
+-------- +- +-+- +
+--- +- +-+- +
121
122
“Nuestro vendedor tiene una relación de proveedores que venden sus productos a
crédito, en efectivo o ambos. Las compras a crédito pagan intereses, pero son
útiles porque no siempre es posible pagar en efectivo. Se utiliza una columna de
tipo conjunto para pago, que puede tomar los valores ’crédito’, ’efectivo’ o
ambos”
123
parte varchar(20),
tipo varchar(20) ,
especificación varchar (20) ,
psugerido float(6,2),
clave int(3) zerofill not null auto_increment,
primary key (clave)
);
La empresa define una política para las ganancias mínimas que se deben
obtener en ventas: el 5% al por mayor y el 12% al por menor. Estos valores se
almacenan en la tabla ganancias, donde se decidió incluir una columna de nombre
factor, con el número por el que se multiplica el precio de compra para obtener el
precio de venta. Los tipos de venta ‘Por mayor’ y ‘Por menor’ se definen con un
tipo de datos enum:
124
125
¿Qué es una interfaz? Una interfaz en JAVA es, como tal, una simple
declaración de los mensajes que sabe responder un determinado tipo, es decir, es
la declaración del protocolo aceptado por los objetos de ese tipo. Las interfaces no
suplantan a las clases, las complementan. Una clase, que es protocolo más
comportamiento, implementa una o varias interfaces, que solamente son
protocolo. Para implementar un interfaz, una clase tiene que poder responder los
mensajes declarados en ella, ya sea implementándolos o definiéndolos como
abstractos. Las interfaces, al igual que las clases abstractas no pueden tener
instancias directamente. Es posible hacer que una interfaz extienda otra,
requiriendo que la clase que implementa tal interfaz implemente también la que
extiende.
Para Java, las interfaces también son tipos como los son las clases, por lo
tanto los objetos pertenecen tanto al tipo determinado por su clase, así como
también, a los tipos establecidos por las interfaces que implementan. Estos forman
jerarquías que no siguen la línea de las clases, sino que hay una jerarquía por
interfaz y por las clases que las implementan. De esta forma podemos decir que
se trata de una relación de tipos que es transversal a la clasificación.
Ahora la definición del protocolo se realiza con las firmas de los métodos,
sin cuerpo, de igual forma que cuando definimos un método abstracto. Por
definición, todos los métodos indicados en una interfaz son abstractos, por lo que
utilizar este modificador es redundante. Así mismo ocurre con la visibilidad de los
métodos, todos son públicos.
129
…
Mensaje mensaje = new Mensaje() {
@Override
public Destinatario destinatario() {
…
}
…
};
…
Una forma de saber cuándo debemos crear una interfaz es cuando estamos
programando una clase y sabemos que vamos a necesitar ciertos colaboradores
que todavía no existen. En ese caso es cuando podemos crear una interfaz. Así
nuestra clase compilará habiendo ya creado los artefactos mínimos para eso.
Si queremos definir una interfaz a partir de una clase existente y que ésta la
implemente, Eclipse tiene una funcionalidad para este propósito. Para extraer una
interfaz debemos presionar el botón derecho del mouse sobre el código de una
clase y seleccionamos la opción Refactor / Extract Interface. Luego ingresamos
un nombre para la interfaz y elegimos qué métodos de la clase pertenecerán a
esta, hacemos clic sobre OK.
130
131
Para que funcionen las convenciones, cada persona que escribe software
debe seguir la convención. Todos.
Definición Verificación:
132
Definición Validación:
Aspectos en la validación:
Implementación de V&V:
133
134
Corrección de defectos:
Ejemplo (I)
• El programa lee tres números enteros, los que son interpretados como
representaciones de las longitudes de los lados de un triángulo. El
programa escribe un mensaje que informa si el triángulo es escaleno,
isósceles o equilátero
If l1 = l2 or l2 = l3 then
write (“equilátero”)
else ...
• En algoritmos
• De sintaxis
• De precisión y cálculo
• De documentación
• De estrés o sobrecarga
• De capacidad o de borde
• De sincronización o coordinación
• De capacidad de procesamiento o desempeño
• De recuperación
• De estándares y procedimientos
• Relativos al hardware o software del sistema
136
• En algoritmos
Faltas típicas o Bifurcar a destiempo o Preguntar por la condición
equivocada o No inicializar variables o No evaluar una condición particular o
Comparar variables de tipos no adecuados
• De sintaxis
Ejemplo: Confundir un 0 por una O
Los compiladores detectan la mayoría
• De precisión o de cálculo
Faltas típicas o Formulas no implementadas correctamente o No entender
el orden correcto de las operaciones o Faltas de precisión como un
truncamiento no esperado
• De documentación
La documentación no es consistente con lo que hace el software
Ejemplo: El manual de usuario tiene un ejemplo que no funciona en el
sistema
• De estrés o sobrecarga
Exceder el tamaño máximo de un área de almacenamiento intermedio
Ejemplos, o El sistema funciona bien con 100 usuarios pero no con 110 o
Sistema que funciona bien al principio del día y se va degradando
paulatinamente el desempeño hasta ser espantoso al caer la tarde. Falta:
había tareas que no liberaban memoria
• De capacidad o de borde
Más de lo que el sistema puede manejar
Ejemplos o El sistema funciona bien con importes <1000000 o Año 2000
sistema trata bien fechas hasta el 31/12/99
• De sincronización o coordinación
No cumplir requerimiento de tiempo o frecuencia.
Ejemplo o Comunicación entre procesos con faltas
137
• De recuperación
No poder volver a un estado normal luego de una falla
• De estándares o procedimientos
No cumplir con la definición de estándares y/o procedimientos
Clasificación de Defectos:
• Clasificación Ortogonal
Cada defecto queda en una única categoría
Si pudiera quedar en más de una de poco serviría
138
Pruebas en el Proceso:
• Desempeño
Determina si el sistema integrado, en el ambiente objetivo cumple los
requerimientos de tiempo de respuesta, capacidad de proceso y
volúmenes
• Aceptación
Bajo la supervisión del cliente, verificar si el sistema cumple con los
requerimientos del cliente (y lo satisface)
Validación del sistema
• Instalación
El sistema queda instalado en el ambiente de trabajo del cliente y
funciona correctamente
¿Quién Verifica?
• Pruebas Unitarias:
Normalmente las realiza el equipo de desarrollo. En general la misma
persona que lo implementó.
Es positivo el conocimiento detallado del módulo a probar
• Pruebas de Integración
Normalmente las realiza el equipo de desarrollo
Es necesario el conocimiento de las interfaces y funciones en general
139
• Soluciones:
Trabajo en equipo (roles distintos, igual objetivo)
Se evalúa al producto (no la persona)
Voluntad de Mejora (personal y del equipo)
Verificación Unitaria:
• Temario
Técnicas de verificación unitaria
Técnicas estáticas – Análisis o Análisis de código fuente o Análisis
automatizado de código fuente o Análisis formal
Ejecución simbólica
Técnicas dinámicas – Pruebas o Definiciones, proceso para un
módulo, conceptos básicos, teoría o Caja Blanca o Caja Negra
140
• Ejecución simbólica
Técnica híbrida
• Técnicas Estáticas
• Análisis de código
Se revisa el código buscando defectos
Se puede llevar a cabo en grupos
Recorridas e Inspecciones (técnicas conocidas con resultados
conocidos)
• Verificación formal
Se parte de una especificación formal y se busca probar (demostrar)
que el programa cumple con la misma
Análisis de Código:
• Inspecciones:
Se examina el código (no solo aplicables al código) buscando faltas
comunes.
Se usa una lista de faltas comunes (check-list). Estas listas
dependen del lenguaje de programación y de la organización. Por
ejemplo revisan: o Uso de variables no inicializadas o Asignaciones
de tipos no compatibles
Los roles son: Moderador o Encargado de la Inspección, Secretario,
Lector, Inspector y Autor
Todos son Inspectores. Es común que una persona tenga más de un
rol
Algunos estudios indican que el rol del Lector no es necesario.
142
• No incremental
Big-Bang
• Incrementales
Bottom-Up (Ascendente)
Top-Down (Descendente)
Sandwich (Intercalada)
Por disponibilidad
143
• Temario
Características
Algunos problemas
“Object-Oriented programs and testing” – Perry y Kaiser
Estrategia N+
Características:
Algunos Problemas:
144
145
Si bien los objetos manejan estados y esto hace distintas las pruebas
respecto a las tradicionales, como los métodos son más pequeños es más
fácil realizar pruebas de caja blanca en OO que en lenguajes procedurales
Por otro lado la cantidad de objetos que interactúan entre sí es mucho más
grande que los módulos que interactúan en un lenguaje procedural
Encapsulación en clases:
146
Encapsulación en clases:
Cuando modifico una clase se debe volver a testear esa clase y todas las
que se relacionan explícitamente con esta
147
Testing funcional
148