Programación Orientada a Ojetos

158
Programación Orientada a Ojetos M.C. Juan Carlos Olivares Rojas [email protected] http://antares.itmorelia.edu.mx/~jc olivar Noviembre, 2009

description

Programación Orientada a Ojetos. M.C. Juan Carlos Olivares Rojas. [email protected] http://antares.itmorelia.edu.mx/~jcolivar Noviembre, 2009. Programación Orientada a Objetos. ¿Cuál es la diferencia entre una estructura y una clase si las dos son ADT (Tipos de Datos Abstractos)? - PowerPoint PPT Presentation

Transcript of Programación Orientada a Ojetos

Page 1: Programación Orientada a Ojetos

Programación Orientada a Ojetos

M.C. Juan Carlos Olivares Rojas

[email protected]://antares.itmorelia.edu.mx/~jcolivar

Noviembre, 2009

Page 2: Programación Orientada a Ojetos

Programación Orientada a Objetos

• ¿Cuál es la diferencia entre una estructura y una clase si las dos son ADT (Tipos de Datos Abstractos)?

• La encapsulación

• La encapsulación permite colocar datos lógicamente relacionados como constantes, variables, funciones en una sola entidad. Ejemplos son los paquetes y clases.

Page 3: Programación Orientada a Ojetos

POO• La visibilidad y el ocultamiento de la

información es sumamente importante.

• Este paradigma basa su funcionamiento en la creación de objetos que se dan a través de moldes predeterminados llamado clases.

• No es reinventar la rueda, simplemente es estructurar de mejor forma el paradigma imperativo.

Page 4: Programación Orientada a Ojetos

POO• La reutilización de componentes como son

los mecanismos de herencia y polimorfismo hacen que la construcción de código sea más simple.

• El primer lenguaje basado en este paradigma fue Smalltalk. Lenguajes como Java son considerado lenguajes orientados a objetos no puros, ya que tienen componentes de programación estructurada.

Page 5: Programación Orientada a Ojetos

POO• En esta unidad se verán conceptos

avanzados del paradigma orientado a objetos así como mejores prácticas de desarrollo.

• Se seguirá una dinámica parecida a la de la unidad pasada.

Page 6: Programación Orientada a Ojetos

Refactorización• La refactorización es el proceso que

consiste en cambiar la estructura interna de un programa sin modificar su comportamiento externo.

• La refactorización es parte importante del proceso de reingeniería y puede enfocarse a la reestructuración de códigos

Page 7: Programación Orientada a Ojetos

Refactorización

• Las herramientas actuales permiten más que simplemente buscar una cadena de texto y sustituirla por otra.

• Al hacer uso de la refactorización permiten una reestructuración más simple y menos propensa a errores.

• NetBeans desde su versión 5.0 soporta refactorización.

Page 8: Programación Orientada a Ojetos

Refactorización• Las principales herramientas con las que se

cuenta son:

• Renombrado para cambiar de manera segura el nombre (si no se aplica a esto, un comando de sustituir todo puede ser perjudicial), mover, copiar, borrar, cambiar parámetros de los métodos, encapsular campos de una clase (crear métodos get/set).

Page 9: Programación Orientada a Ojetos

Refactorización

• Se pueden extraer elementos para crear interfaces, se pueden introducir variables, constantes, métodos, atributos.

• En algunos casos es más tardado usar la herramienta que realizar la reestructuración de código a mano.

• En NetBeans y algunos otros IDEs se cuentan con herramientas para manipular el código fuente.

Page 10: Programación Orientada a Ojetos

Refactorización• Para dar formato (si es que el código no se

creo en un IDE), eliminar espacios en blanco innecesarios, identar a la izquierda y a la derecha, subir, bajar líneas, duplicar líneas, completar, insertar código, etc.

• Estas herramientas pueden utilizarse para generar patrones repetitivos de código en funciones.

Page 11: Programación Orientada a Ojetos

Refactorización• Para la reestructuración de códigos se

pueden seguir convenciones ya definidas las más importantes son la notación húngara y la notación de camello.

• La notación húngara fue creada por Charles Simonyi de Microsoft, el cual es húngaro y por eso recibió ese nombre.

Page 12: Programación Orientada a Ojetos

Notación Húngara• Es un método ampliamente usado sobre todo

para convención de nombres de variables.

• Consiste en tener variables autodocumentadas agregando un prefijo de tres caracteres o menos para indicar su tipo.

• Las abreviaturas de los tipos de datos puede variar dependiendo del lenguaje de programación.

Page 13: Programación Orientada a Ojetos

Notación Húngara

Descripción Abr

Carácter con signo c

Carácter sin signo b

Entero n

Palabra (entero sin signo)

w

Doble palabra (entero 32 bits)

dw

Largo l

Flotante f

Doble d

Cadena terminada en /0

sz

Estructura Abc sA

Descripción Abr

Objeto (parecido a las estructuras)

o*

Manejador (handler)

h

Puntero a entero de 16 bits

p

Puntero largo (32 bits)

lp

Enumeraciones e

Puntero largo a una cadena terminado en nulo

lpsz

Puntero largo a una función que devuelve un entero

lpfn

Descripción Abr

Formulario frm

CheckBox chk

Botón cmd

Imagen img

Etiqueta lbl

Menú mnu

PictureBox pic

TextBox txt

ComboBox cbo

Línea lin

Page 14: Programación Orientada a Ojetos

Notación húngara• int nTest;• long lTemp;• char *szString = "Prueba";• struct Rect srRect;• int nMiVariableEjemplo;• char szEjemploString;• int NNOMBREINVALIDO;• int nNombre_Incorrecto;

Page 15: Programación Orientada a Ojetos

Notación Húngara

• Las funciones o subrutinas no se les agrega abreviaciones, se recomiendan tengan un nombre descriptivo.

• Los nombres de las clases van en mayúsculas.

• Se pueden tener nuevos tipos de datos sólo se deben de poner las nuevas nomenclaturas.

Page 16: Programación Orientada a Ojetos

Notación de Camello• Es la utilizada por Java y herramientas

afines. Su uso está creciendo en popularidad mientras que la notación húngara va en desuso.

• Su principal característica consiste en que no separa nombres de identificadores (variables, métodos, objetos) con “_” para palabras compuestas.

Page 17: Programación Orientada a Ojetos

Notación de Camello• Los identificadores tienen la forma de la

joroba de un camello. No se indican tipos de datos. Sigue respetando mucho de la Notación C.

• Los métodos inician en minúsculas y si hay una palabra compuesta esta inicia con mayúscula dando la apariencia de una joroba.

Page 18: Programación Orientada a Ojetos

Notación Camello• Las clases inician con mayúscula

siguiendo el mismo método.

• Los métodos para acceder a atributos de las clases no públicos deben llamarse por convención set y get.

Page 19: Programación Orientada a Ojetos

Reutilización• El reuso es una de las técnicas de

resolución de problemas que más utilizamos los humanos. De hecho es lo primero que verifica nuestro cerebro.

• El reuso en software nos ayuda a mejorar la producción y calidad del software al “no reinventar la rueda”.

Page 20: Programación Orientada a Ojetos

Reuso

• El reuso nos permite afrontar los grandes proyectos de software sin mayores complicaciones. Desafortunadamente no todo se puede reutilizar.

• La reutilización es la propiedad de utilizar conocimiento, procesos, metodologías o componentes de software ya existente para adaptarlo a una nueva necesidad, incrementando significativamente la calidad y productividad del desarrollo.

Page 21: Programación Orientada a Ojetos

Reutilización• La reutilización puede ser composicional,

generativa y adapativa.

• Es composicional cuando se orienta al reuso del producto. Puede ser de caja blanca (si nos interesa modificar el comportamiento), caja negra (cuando no se puede modificar el comportamiento) y adaptativo cuando es una mezcla de ambos.

Page 22: Programación Orientada a Ojetos

Reutilización• La reutilización por generación se da

cuando se utilizan esfuerzos previos del desarrollo de software.

• Para que un objeto pueda ser reusable se necesita de un alto nivel de abstracción. Entre mayor es su nivel de abstracción, mayor es su nivel de reuso.

Page 23: Programación Orientada a Ojetos

Reuso• Tipos de reuso:

• Código reciclado: utilizar parte del código definido en otros proyectos.

• Componentes de código: consiste en utilizar módulos, clases, APIs, etc.

• Esquemas: DFD, Diagramas UML.

Page 24: Programación Orientada a Ojetos

Reuso• Frameworks: Solución integrada para la

resolución de problemas en un contexto particular. Se pueden utilizar patrones de diseño. Un ejemplo de Framework es .NET

• Las etapas del proceso de reuso son:

• Adquisición del requerimiento.

Page 25: Programación Orientada a Ojetos

Reuso• Búsqueda y Recuperación

– Recuperación por Palabras Claves– Recuperación Basada en la Estructura– Recuperación Enumerada

• Identificación• Adecuación

Page 26: Programación Orientada a Ojetos

Reingeniería del Software• Sucede que si una aplicación necesita ser

modificada constantemente y no tiene una metodología de seguimiento del desarrollo del proyecto, la modificación del software se vuelve sumamente complicada.

• El mantenimiento de software en algunos casos puede llegar a ser del 60% del total de costos del proyecto.

Page 27: Programación Orientada a Ojetos

Reingeniería del Software

• Aún cuando un software se haya desarrollado con la mejor metodología de software tendrá que ser modificado en un futuro por algún motivo, debido a que lo único constante es el cambio.

• Los tipos de mantenimiento de Software son: correctivo, adaptativo, mejoras o mantenimiento de perfeccionamiento, mantenimiento preventivo o reingeniería.

Page 28: Programación Orientada a Ojetos

Reingeniería del Software

• El 80% del tiempo del desarrollo del software se ocupa en la adaptación del software a su ambiente externo.

• La reingeniería de software es costosa y consumidora de tiempo.

• La reingeniería es una actividad de reconstrucción, preferible de realizar antes de que se “derrumbe” la obra.

Page 29: Programación Orientada a Ojetos

Reingeniería de Software

• Antes de derribar una casa, quizás se necesita corroborar que está mal.

• La reingeniería es un proceso que altera los elementos internos de toda obra, no es una sola remodelación de la fallada.

• Generalmente se siguen los siguientes pasos para aplicar reingeniería:

Page 30: Programación Orientada a Ojetos

Reingeniería de Software• Análisis de Inventario• Reestructuración de Documentos• INGENIERÍA INVERSA• Reestructuración de Códigos• Reestructuración de Datos• Ingeniería directa

Page 31: Programación Orientada a Ojetos

Ingeniería Inversa

• Se aplica para obtener un modelo detallado de análisis, ingeniería de requerimientos, diseño y en algunos casos implementación teniendo una solución, la cual es una actividad consumidora de tiempo.

• Tanto la Ingeniería Inversa como la Reingeniería en la mayoría de las licencias de Software se encuentran penadas por la ley.

Page 32: Programación Orientada a Ojetos

Javadoc• Es el estándar para crear documentación para

los proyectos en Java.

• Es una herramienta estándar del JDK de Sun Microsystem. Crea documentación en HTML y casi cualquier IDE lo hace.

• Se deben utilizar los comentarios especiales /** …..*/ con algunas palabras clave para determinar la documentación.

Page 33: Programación Orientada a Ojetos

Javadoc• Las palabras clave inician con una arroba.

• Se puede incrustar cualquier etiqueta de HTML para hacer más visible la documentación.

• @author nombre_desarrollador• @deprecated descripción //indica un método

que no se utiliza su uso

Page 34: Programación Orientada a Ojetos

Javadoc• @param nombre descripción• @return descripción //no se debe utilizar

con métodos void.• @see referencia //asocia con otro elemento

el cual puede ser: #método(); clase#método(); paquete#método(); paquete.clase#método().

• @throws clase descripcion• @version versión

Page 35: Programación Orientada a Ojetos

Javadoc• La documentación se crea de la siguiente

forma: javadoc archivo.java

• En NetBeans se puede encontrar la opción en el menú Build en la opción Generate JavaDoc for …

• Se recomienda realizar tanto el código como las clases en inglés.

Page 36: Programación Orientada a Ojetos

Javadoc/** * Thrown to indicate that the application has

attempted to convert * a string to one of the numeric types, but that

the string does not * have the appropriate format. * * @author unascribed * @version 1.16, 02/02/00 * @see java.lang.Integer#toString()

Page 37: Programación Orientada a Ojetos

Javadoc

* @since JDK1.0 */ public class NumberFormatException extends

IllegalArgumentException { /** * Constructs a <code> NumberFormatException

</code> with no detail message. */ public NumberFormatException () { super(); }

Page 38: Programación Orientada a Ojetos

Javadoc/** * Constructs a <code>

NumberFormatException </code> with the

* specified detail message. * @param s the detail message. */ public NumberFormatException (String s)

{ super (s); } }

Page 39: Programación Orientada a Ojetos

Ofuscación

• La ofuscación es una técnica avanzada de refactorización que permite a un código mantenerle obscuro (es decir no muy legible) con diversos propósitos de optimización.

• ¿Para que se hace ofuscación?

• ¿No viola esto el principio de claridad en la implantación?

Page 40: Programación Orientada a Ojetos

Ofuscación

• La ofuscación se realiza en muchas casos para hacer un código ilegible, también en muchos casos se puede reducir el tamaño del código fuente y del código binario realizado.

• Al realizar cualquier tipo de programa se puede aplicar técnicas de reingeniería como la ingeniería inversa para de un código binario tratar de obtener su código fuente.

Page 41: Programación Orientada a Ojetos

Ofuscación

• En mucho tipos de aplicaciones como las aplicaciones móviles se ofusca el código objeto generado para obtener un código más pequeño.

• Un programa puede ser fácilmente decompilable, por este motivo se ofusca con la premisa de que si esto llegará ocurrir, el que lo hiciera le costaría mucho trabajo entender el programa y modificarlo.

Page 42: Programación Orientada a Ojetos

Ofuscación• En el caso de programas ejecutables (.exe)

es mucho más difícil obtener un código en lenguaje de alto nivel, dado que el proceso de decompilación deja sus resultados en ensamblador y por lo tanto es necesario saber como el compilador ensambla cada línea de código. Por este motivo muchas empresas grandes del sector informático realizan sus proyectos en sus propios compiladores.

Page 43: Programación Orientada a Ojetos

Ofuscación

• Actualmente la ofuscación se emplea más en la ofuscación de código dinámico, dado que aquí es muy importante tanto el tamaño del código como la legibilidad de este, tal es el caso de HTML.

• La ofuscación si bien es cierto viola principios de buena prácticas de Ing. de Software, se realiza con un propósito específico hasta el final del proceso.

Page 44: Programación Orientada a Ojetos

Ofuscación• En algunos casos la ofuscación se logra

simplemente refactorizando el nombre de las variables pero en muchos casos esto no sirve.

• Para lograr la ofuscación se deberá modificar el flujo del programa de tal forma que menos instrucciones o en algunos casos más instrucciones deben de realizar el mismo programa.

Page 45: Programación Orientada a Ojetos

Ofuscación

• En algunos casos resulta que ofuscar el código puede ser que el tamaño del código fuente y del programa aumente, debido a que es común que las variables tengan nombres muy grandes o bien se incluyan instrucciones extras, se descompongan ciclos, se cambien y mapeen estructuras, etc.

• Existen concursos de ofuscación de código

Page 46: Programación Orientada a Ojetos

Ofuscación

Page 47: Programación Orientada a Ojetos

Sockets Java• Java es un lenguaje multiplataforma que

al igual que otros lenguajes de programación tiene APIs para la comunicación de procesos remotos.

• La ventaja de utilizar sockets en Java con respecto a su contraparte en C, radica en que Java enmascara la complejidad de los procesos en clases más simples.

Page 48: Programación Orientada a Ojetos

Sockets Java• Para utilizar sockets y clases similares se

necesita utilizar el paquete java.net.*;

• Se pueden utilizar clases específicas para conectarse a servicios de red determinados como http, ftp, entre otros.

//Servidor usando sockets streamServerSocket ss = new ServerSocket(5000,

100);

Page 49: Programación Orientada a Ojetos

Servidor StreamSocket con = ss.accept();OutputStream sal =

con.getOutputStream();

String s = new String(“ITMorelia\n”);for(int i=0; i < s.length(); i++)

sal.write((int) s.charAt(i));

Conection.close();

Page 50: Programación Orientada a Ojetos

Cliente streamSocket c = new

Socket(InetAddress.getLocalHost(), 5000);

InputStream entrada = c.getInputStream();

char c;while((c = (char) entrada.read()) != ‘\n’)

System.out.println(String.valueOf(c));

Page 51: Programación Orientada a Ojetos

Servidor datagramastry {

DatagramSocket sS = new DatagramSocket();DatagramSocket rS = new DatagramSocket( 5000);

} catch(SocketException SE) {SE.printStackTrace();System.exit(1);

}

Page 52: Programación Orientada a Ojetos

Servidor datagramasbyte a = new byte [100];DatagramPacket rP = new

DatagramPacket( a, a.length);rS.receive(rP);

System.out.println(“Dirección:” + rP.getAddress() + “ Puerto” + rP.getPort + “ longitud:” +rP.getLength());

Page 53: Programación Orientada a Ojetos

Servidor datagramasbyte d[] = rP.getData();sP = new DatagramPacket(d, d.length,

rP.getAddress(), 5001);

sS.send(sendPacket);

InetAddress comp = InetAddress.getByName(“www.itc.edu.mx”);

Page 54: Programación Orientada a Ojetos

Sockets Java• Otras excepciones que se pueden

capturar:

• UnknownHostException• EOFException• ConnectException

Page 55: Programación Orientada a Ojetos

Sockets en Java• Se recomienda la utilización en las nuevas

versiones de Java de los flujos ObjectInputStream y ObjectOutputStream, los cuales son serializables.

• El cierre de los flujos debe hacerse en orden inverso de cómo se crearon.

• Se pueden cambiar algunas opciones de configuración como s.setSoTimeout(5000); //Tiempo de interrupción de lectura.

Page 56: Programación Orientada a Ojetos

Sockets Java• También se recomienda el uso de un

objeto PrintWriter para manejar de mejor forma la escritura a través de un socket.

PrintWriter escritor = new PrintWriter(socket.getOutputSream());

escritor.println(“Mensaje: ” +mensaje);escritor.flush();

Page 57: Programación Orientada a Ojetos

Sockets Java• También se puede utilizar un objeto Scanner

para leer desde un socket.

Socket s = new Socket(“time-A.timefreq.bldrdoc.gov”, 13);

InputStream e = s.getInputStream();Scanner in = new Scanner(e);

while(in.hasNextLine()) { String l =in.nextLine(); System.out.println(l);}

Page 58: Programación Orientada a Ojetos

2.1.2 RPC• Las llamadas a procedimientos remotos

(RPC) fue el primer intento por obtener un middleware para la construcción de sistemas distribuidos.

• Su funcionamiento se basa en la arquitectura cliente/servidor siendo totalmente transparente para el usuario.

Page 59: Programación Orientada a Ojetos

RPC• El problema del manejo de procesos

distribuidos con sockets radica en que se basa en el flujo de E/S, haciendo los programas más difíciles de estructurar.

• En 1984 Birelly y Nelson idearon el modelo de RPC a semejanza del llamado de procedimientos locales (LPC).

Page 60: Programación Orientada a Ojetos

RPC• El nivel de transparencia en RPC es muy

alto ya que el usuario no tiene que ver con detalles de conexión.

• La simplicidad de toda esta heterogeneidad en el llamado a un procedimiento remoto es realizado por los stubs (resguardos) tanto en el cliente como en el servidor.

Page 61: Programación Orientada a Ojetos

RPC• Para la transferencia de datos entre los

stubs, se necesita de un proceso de empacar desempacar los parámetros y resultados. Dicho proceso recibe el nombre de marshalling.

• Los stubs se comunican con los núcleos de cada proceso logrando una transparencia muy alta.

Page 62: Programación Orientada a Ojetos

RPC• La secuencia de mensajes RPC es la

siguiente:

1.El procedimiento cliente llama al stub del cliente de la manera usual.

2.El stub del cliente construye un mensaje y hace un señalamiento al núcleo.

3.El núcleo envía el mensaje al núcleo remoto.

Page 63: Programación Orientada a Ojetos

RPC4. El núcleo remoto proporciona el mensaje

al stub del servidor.5. El stub del servidor desempaca los

parámetros y llama al servidor.6. El servidor realiza el trabajo y regresa el

resultado al stub.7. El stub del servidor empaca el resultado

en un mensaje y hace un señalamiento al núcleo.

Page 64: Programación Orientada a Ojetos

RPC8. El núcleo remoto envía el mensaje al

núcleo del cliente.9. El núcleo del cliente da el mensaje al

stub del cliente.10.El stub desempaca el resultado y lo

regresa al cliente.

• El manejo de los datos se hace a través de XDR (eXternal Data Representation).

Page 65: Programación Orientada a Ojetos

RPC• Para el envío de datos se utiliza la

siguiente forma canónica: Complemento a 2 los enteros, ASCII caracteres, 0 (falso) y 1 verdadero, formato IEEE decimales, todo guardado como little endian.

• En la práctica RPC no es lo mismo que un procedimiento local a la hora de revisar los mecanismos de fallas.

Page 66: Programación Orientada a Ojetos

RPC• La semántica de fallas de RPC es la

siguiente:

1.El cliente no puede localizar al servidor.2.Se pierde el mensaje de solicitud del cliente

al servidor3.Se pierde el mensaje de respuestas del

servidor al cliente.4.El servidor falla antes de recibir una solicitud.

Page 67: Programación Orientada a Ojetos

RPC5. El cliente falla después de enviar una

solicitud.

• En general existen diversas implementaciones de RPC, siendo las más extendidas sobre TCP/IP, la cual tiene los siguientes puntos a favor:

• El protocolo ya ha sido diseñado, lo que ahorra trabajo considerable.

Page 68: Programación Orientada a Ojetos

RPC• Se dispone de muchas implementaciones.• Esta disponible en casi cualquier sistema

Unix.• Tanto TCP como UDP están soportados por

muchas redes.

• Las implementaciones más evolucionadas de RPC incluye la de Sun ONC (Open Network Computing) y DCE (Distributed Computing Environmet).

Page 69: Programación Orientada a Ojetos

RPC• RPC está desarrollado en C, pero algunas

versiones permiten programar en otros lenguajes como Fortran. Las implementaciones más actuales trabajan sobre XML formando los XML-RPC.

• Para la conexión entre un cliente y un servidor utilizando RPC se siguen dos pasos: localizar la máquina servidor, y localizar el proceso en esa máquina.

Page 70: Programación Orientada a Ojetos

RPC• Para encontrar dichos servicios se

necesita de un demonio RPC que se encuentre monitoreando todos los procesos remotos, dicho proceso se llama portmap , el cual escucha en el puerto 111.

• Muchos servicios de red utilizan RPC para funcionar, entre ellos NFS, el cual es un sistema de archivos distribuidos.

Page 71: Programación Orientada a Ojetos

RPC• Un programa en RPC se crea a través de un

lenguaje de definición de interfaces (IDL por sus siglas en Inglés). Tiene la extension .X

program RAND_PROG {version RAND_VER {

void INICIALIZA_RANDOM(long) =1;doble OBTEN_SIG_RANDOM(void) = 2;

} =1; /*No. de version*/} = 0x31111111; /*No. de programa*/

Page 72: Programación Orientada a Ojetos

RPC• rpcgen -c -a rand.x

• rand_server.c servidor• rand_svc.c stub del servidor (no se

modifica)• rand.h cabeceras• rand_clnt.c stub del cliente (no se

modifica)• rand_client.c cliente• rand_xdr.c manejo de estructuras

Page 73: Programación Orientada a Ojetos

RPC• 00000000-1FFFFFFF Definidos por sun• 20000000-3FFFFFFF Definidos por el

usuario• 40000000-5FFFFFFF Transitorios• 60000000-FFFFFFFF Reservados para

usos futuros

• rpcinfo -s• portmap

Page 74: Programación Orientada a Ojetos

RPCconst MAX = 100;typedef int Longitud;

struct argumentos { float salario;Longitud tam;};

• Sólo se puede recibir y enviar un parámetro.

Page 75: Programación Orientada a Ojetos

RPC• Existen nuevas propuestas para mejorar

el desempeño de RPC como RPC2 que maneja UDP. También se han diseñado mecanismos como MultiRPC para el manejo de RPCs en paralelos. Existen otras alternativas como LRPC (RPC ligeros) que se basan en optimizaciones de la copia de datos y de la planificación de los hilos.

• RPC está definido en el RFC 1831.

Page 76: Programación Orientada a Ojetos

RMI• La invocación de métodos remotos es la versión

orientada a objetos de la filosofía RPC.

• Los programas realizados en Java deben heredar de la clase remote.

• A la hora de ejecutar se deben indicar las políticas de seguridad. Esto se hace a través del parámetro -D de java

Page 77: Programación Orientada a Ojetos

RMIjava -Djava.security.policy=politica prg

• Los archivos de stub se generan con el comando rmic -d . Prg

• El primer paso consiste en inicializar el rmiregistry (similar al portmapper en RPC)

Page 78: Programación Orientada a Ojetos

RMI• Al proxy en el lado cliente se le llama stub,

mientrás que en el servidor se le llama skeleton.

• Se cuenta con la primitiva invoke(objeto, método, param_entrada, param_salida);

• Se necesita de un proceso enlazador (binder) que una a un cliente con el objeto remoto.

Page 79: Programación Orientada a Ojetos

RMIimport java.rmi.*;import java.util.Vector;

public interface Forma extends Remote { int dameVersion() throws

RemoteException; GraphicObject dameTodoEstado() throws

RemoteException;}

Page 80: Programación Orientada a Ojetos

RMIpublic interface ListaForma extends

Remote { Forma nuevaForma(GraphicObject g)

throws RemoteException; Vector todasFormas() throws

RemoteException; int dameVersion() throws

ReomteException;}

Page 81: Programación Orientada a Ojetos

RMI//Sirviente ListaFormimport java.rmi.*;import

java.rmi.server.UnicastRemoteObject;import java.util.Vector;public class SirvienteListaForma extends

UnicastRemoteObject implements ListaForma {

private Vector laLista; private int version;

Page 82: Programación Orientada a Ojetos

RMI public SirvienteListaForma() thorws

RemoteException {;} public Forma nuevaForma(GraphicObject g)

thorws RemoteException { version++; Forma s = new SirvienteForma(g, version); laLista.addElement(s); return s; //implementar los demás métodos }}

Page 83: Programación Orientada a Ojetos

RMI• Para acceder al enlazador (RMIRegistry)

se utilizan métodos de la clase Naming, utilizando las siguiente URI:

• rmi://nombrecompu:puerto/nombreObjeto

• Los clientes deben hacer consultas (lookup) a computadoras concretas. Otros métodos son: rebind(), bind(), unbind() y list().

Page 84: Programación Orientada a Ojetos

RMI//Programa servidorpublic class ServidorListaForma { public void main(String args[]){ System.setSecurityManager(new

RMISecurityManager()); try { ListaForma unaListaForma = new

SirvienteListaForma();

Page 85: Programación Orientada a Ojetos

RMI Naming.rebind(“Lista Forma”, unaListaForma); System.out.println(“Servidor de ListaForm

Listo”); } catch (Exception e) { System.out.println(“Error: ”

+e.getMessage()); } }}

Page 86: Programación Orientada a Ojetos

RMI//Clienteimport java.rmi.*;import java.rmi.server.*;import java.util.Vector;public class ClienteListaForma { public static void main(String args[]) { System.setSecurityManager(new

RMISecurityManager()); ListaForma unaListaForma = null;

Page 87: Programación Orientada a Ojetos

RMI try { unaListaForma = (ListaForma)

Naming.lookup(//jcolivares.ListaForma); Vector sLista =

unaListaForma.todasFormas(); } catch(RemoteException e)

{ System.out.println(e.getMessage()); } catch (Exception e) { ;} }}

Page 88: Programación Orientada a Ojetos

RMI• El marshalling se hace en formato Big-endian.

• Jerarquía de clases en RMI:• Object --> RemoteObject (Remote) -->

RemoteStub, RemoteServer (UnicastRemoteObject)

• El puerto por el cual escucha el RMI es el 1099 (rmi://localhost:1099/Objeto)

Page 89: Programación Orientada a Ojetos

RMI• Ejemplo de archivo de política de seguridad:

grant { permission java.net.SocketPermission “*:1024-65535”, “connect”; permission java.io.FilePermission “directorio”, “read”; permission java.security.AllPermission;};

Page 90: Programación Orientada a Ojetos

CORBA• Common Object Request Broker

Architecture• Es un middleware para la construcción de

sistemas distribuidos utilizando el paradigma de programación orientada a objetos.

• Una de las principales ventajas de CORBA es que cada uno de los componentes de CORBA se pueden implementar en una gran variedad de lenguajes.

Page 91: Programación Orientada a Ojetos

CORBA//Ejemplo de IDL en CORBAstruct Persona {

string nombre;long año;

};interface ListaPersonas {void añadePersona(in Persona p);long damePersona(in string nombre, out Persona

p);};

Page 92: Programación Orientada a Ojetos

CORBA• CORBA maneja un modelo asíncrono de

comunicación, aunque también se puede manejar un esquema de polling.

• CORBA utiliza muchas tecnologías estandarizadas como IOR (Interoperable Object Reference), IIOP(Internet Inter ORB Protocol), ORB (Object Request Broker Architecture), entre otras.

Page 93: Programación Orientada a Ojetos

CORBA• CORBA es una arquitectura genérica, de

tal forma que otras tecnologías de objetos como RMI se pueden ejecutar a través de IIOP.

• CORBA está basado en una arquitectura de cuatro capas con proxys en el lado cliente y servidor.

Page 94: Programación Orientada a Ojetos

CORBA• Para realizar objetos remotos en Java se utiliza

el Java IDL, el cual está incluido en las diferentes versiones de JDK.

• Las interfaces de los objetos remotos se hacen a través del IDL de CORBA.

interface Produto { string getDescripcion();}

Page 95: Programación Orientada a Ojetos

CORBA• El compilador de IDL a Java se llama idlj o

idltojava en versiones antiguas:

• idlj Producto.idl

• public interface Producto extends org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity

Page 96: Programación Orientada a Ojetos

CORBA• Los parámetros de los métodos pueden

ser in, out, inout. Los parámetros in son por valor, out referencia, inout referencia con valor inicial.

• En Java no existen las referencias por lo que se simulan (clases holder).

• IDL no soporta sobrecarga de métodos.

Page 97: Programación Orientada a Ojetos

CORBA• La palabra clave atrribute de IDL hace

referencia a métodos set y get

module Aplicación { interface producto { attribute string isbn;}; interface Almacen { …};};

Page 98: Programación Orientada a Ojetos

CORBA• Al ejecutar idlj Producto.idl se crean:

• Producto.java //definición interfaz• ProductoHolder.java //clase contenedor

parametros out• ProductHelper.java // Clase auxiliar• _ProductStub.java //Stub con el ORB

Page 99: Programación Orientada a Ojetos

CORBA• El mismo ILDL se puede compilar en C++

haciendo uso de la herramienta omniORB, el cual se ejecuta: omniidl –bcxx Producto.idl

• El cual genera:• Producto.hh: Producto, Producto_Helper, y

POA_Producto• ProductoSK.cc implementación

Page 100: Programación Orientada a Ojetos

CORBA• Para ejecutar el servicio de nombres se

corre el programa tnameserv (depreciado) o el orbd con el parámetro –ORBInitialPort 2809

import org.omg. CosNaming.*;import org.omg.CORBA.*;public class EntCliente { public static void main(String args[]) { try {

Page 101: Programación Orientada a Ojetos

CORBA ORB orb = ORB.init(args, null); org.omg.CORBA.Object n =

orb.resolve_initial_references(“NameService”);

NamingContext contexto = NamingContextHelper.narrow(n);

NameComponent[] ruta = { new NameComponent(“principal”, “Context”), new NameComponent(“Objeto”, “Object”)};

Page 102: Programación Orientada a Ojetos

CORBA org.omg.CORBA.Object obj =

contexto.resolve(ruta); Obj o = ObjHelper.narrow(obj); System.out.println(o.getenv(“PATH”)); } catch (Exception e) { e.printStackTrace(); } }}

Page 103: Programación Orientada a Ojetos

CORBA• Para implementar servidor CORBA en java

se debe ejecutar idlj –fall archivo.idl

import org.omg.CosNaming.*;import org.omg.CORBA.*;import org.omg.PortableServer.*;public class SysPropImpl extends

SysPropPOA { public String getProperty(String clave) {

Page 104: Programación Orientada a Ojetos

CORBA return System.getProperty(clave); }}public class ServidorPropSis { public static void main(String args[]) { try { ORB orb = ORB.init(args, null); POA poaraiz = (POA)

orb.resolve_initial_references(“RootPOA”);

Page 105: Programación Orientada a Ojetos

CORBA poaraiz.the_POAManager().activate(); SysPropImpl impl = new SysPropImpl(); org.omg.CORBA.Object ref =

poa.raiz.servant_to_reference(impl);org.omg.CORBA.Object objContDenom =

orb.resolve_initial_references(“NameService”);

NamingContext contexto = NamingContextHelper.narrow(objContDenom);

Page 106: Programación Orientada a Ojetos

CORBA NameComponent[] ruta = { new

NameComponent(“SysProp”, “Object”)}; Contexto.rebind(ruta, ref); orb.run(); } catch (Exception e) { e.printStackTrace(System.out); } }}

Page 107: Programación Orientada a Ojetos

Modelo de servicios Web

Servicios SOServicios SO

BrowsersBrowsersestándarestándar

DispositivosDispositivosmóvilesmóviles

ClientesClientesricosricos

Lógica aplicaciónLógica aplicación

Servicios WebServicios Web

OtrosOtrosserviciosservicios

Formularios WebFormularios Web

XMLXML

Page 108: Programación Orientada a Ojetos

Servicios Web• Los servicios Web van de la mano de las

tecnologías XML.

• XML nos sirve para estandarizar el marshalling de los datos.

• Utilizar la Web nos permite tener un puerto no bloqueando por Firewall

Page 109: Programación Orientada a Ojetos

Servicios Web• Son la invocación de código remoto

utilizando protocolos estandarizados.

• En conclusión, realizan la misma función que los sockets, RPC, RMI, Corba y demás tecnologías distribuidas.

• Se puede ver a los servicios Web como una analogía de un procedimiento almacenado en una base de datos.

Page 110: Programación Orientada a Ojetos

¿Qué son los Servicios Web?• "A Web service is a software system designed

to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL). Other systems interact with the Web service in a manner prescribed by its description using SOAP-messages, typically conveyed using HTTP with an XML serialization in conjunction with other Web-related standards."

Page 111: Programación Orientada a Ojetos

Definición de SW• La aplicación que actúa como cliente

debe conocer:–La URL del servidor remoto que ofrece

el servicio, –El nombre del servicio que se solicita, y –Los parámetros que se deben enviar

junto con la llamada al servicio.

• Estos datos se enviarán mediante HTTP

Page 112: Programación Orientada a Ojetos

Definición de SW• El servidor que ofrece el servicio web

leerá los parámetros que se le han enviado, llamará a un componente o programa encargado de implementar el servicio, y los resultados que se obtengan de su ejecución serán devueltos al servidor que solicitó la ejecución del servicio.

Page 113: Programación Orientada a Ojetos

Servicios Web• Un servicio Web no es un XML RPC como

tal, se diferencia en la forma en que trabajan.

• Los servicios Web forman la base de la arquitectura orientada a servicios (SOA)

• Los servicio Web utilizan generalmente el método POST de HTTP para enviar los datos de la invocación del servicio.

Page 114: Programación Orientada a Ojetos

SOA (Arquitectura Orientada a Servicios)

Proveedor de Servicios

Registro de Servicios Solicitante de Servicio

PublicarPublicar ConectarConectar

EncontrarEncontrar

ClienteClienteDescripciónDescripción

ServicioServicio

Page 115: Programación Orientada a Ojetos

Servicios Web• Los datos viajan envueltos en un protocolo

llamado SOAP (Simple Object Access Protcol) que hace el marshalling de los datos.

• Una de las principales características que tienen los servicios Web radica en su ubicuidad, ya que pueden ser accedidos desde cualquier sitio, utilizando inclusive cualquier otro protocolo de transporte SMTP, FTP, etc.

Page 116: Programación Orientada a Ojetos

SOAP• Indica cómo se deben codificar los

mensajes que circularán entre las dos aplicaciones.

• SOAP define dos modelos de mensajes:– Un mensaje de solicitud.– Un mensaje de respuesta.

Page 117: Programación Orientada a Ojetos

Mensaje de solicitud<?xml version="1.0" encoding="UTF-8" ?><SOAP-ENV:Envelope

xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header> </SOAP-ENV:Header> <SOAP-ENV:Body>

<catalogo:buscaIsbn xmlns:catalogo="http://catalogo.org/cat">

<catalogo:isbn>84-4553-3334-2X

</catalogo:isbn> </catalogo:buscaIsbn>

</SOAP-ENV:Body></SOAP-ENV:Envelope>

Page 118: Programación Orientada a Ojetos

Mensaje de respuesta<?xml version="1.0" encoding="UTF-8" ?><SOAP-ENV:Envelope

xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header> </SOAP-ENV:Header> <SOAP-ENV:Body>

<catalogo:buscaIsbnResponse xmlns:catalogo="http://catalogo.org/cat">

<catalogo:titulo>Catalogar materiales especiales

</catalogo:titulo> <catalogo:autor>Marta de Juanes</catalogo:autor> </catalogo:buscaIsbnResponse>

</SOAP-ENV:Body></SOAP-ENV:Envelope>

Page 119: Programación Orientada a Ojetos

Servicios Web• Los servicios Web necesitan ser descritos (saber

que parámetros reciben, devuelven) para poderlos utilizar en diversos clientes. Esta descripción se realiza a través de WSDL (Web Service Definition Language).

• Generalmente esas descripciones los clientes las conocen o bien, puede descubrirlas haciendo uso de UDDI (Universal Description, Discovery and Integration).

Page 120: Programación Orientada a Ojetos

Servicios Web• La UDDI no es otra cosa que un

repositorio en donde se almacenan servicios Web que pueden ser invocados por diversos clientes.

• Muchas empresas ofrecen servicios Web como amazon, google, http://www.xmethods.com

Page 121: Programación Orientada a Ojetos

¿Por qué utilizar Servicios Web?

• Múltiples tecnologías para hacer lo mismo: – No interoperables entre sí.– Ligados a una plataforma.

DCOM CORBA

RPC IIOP

NDR CDR

IDL OMG IDL

Protocolo

Formato del mensaje

Descripción

Windows Registry Naming ServiceDescubrimiento

Java RMI

IIOP or JRMP

Java Ser. Format

Java

RMI Registry or JNDI

Page 122: Programación Orientada a Ojetos

Pila de protocolos de SW

• Redefinición de toda la pila de comunicaciones– Basado en tecnologías estándares

Servicio web

HTTP

SOAP

WSDL

Protocolo

Formato del mensaje

Descripción

UDDIDescubrimiento

Page 123: Programación Orientada a Ojetos

Ventajas de los Servicios Web• Basados en estándares.

– Fácil integración.

• Desarrollo de actividades modularizadas.

• Independencia de plataforma.

• Puede ser usado tanto en clientes ligeros como pesados (clientes heterogéneos).

Page 124: Programación Orientada a Ojetos

Desventajas de los Servicios Web

• Es que no son seguros...

• Es que no tienen estado...

• Es que no son transaccionales...

• “Los servicios Web no hacen más que reinventar la rueda, pero esta vez usando XML”.

Page 125: Programación Orientada a Ojetos

Protocolos Servicios Web

Comunicaciones ubicuasComunicaciones ubicuas: Internet: Internet

Formato de datosFormato de datos universal: universal: XMLXML

Interacción de servicios:Interacción de servicios: SOAPSOAP

Publicar, buscar serviciosPublicar, buscar servicios: UDDI: UDDI

Descripción de servicios:Descripción de servicios: WSDLWSDL

Page 126: Programación Orientada a Ojetos

Creando Servicios Web• Los servicios Web XML se exponen en el

Framework .NET como archivos con una extensión .asmx.

• Los servicios se pueden consumir a través de páginas Web, clientes ligeros en una PC o clientes inteligentes en dispositivos móviles.

Page 127: Programación Orientada a Ojetos

Hola mundo!!!<%@ WebService Language="C#“

class="Helloweb" %>using System.Web.Services;[WebService

(Namespace="http://sybex.com/webservices")]public class Helloweb: WebService{[WebMethod]public string HelloWebService() {return "Holla Mundo!";}

Page 128: Programación Orientada a Ojetos

Otro servicio Web<%@ WebService Language="C#" class="Fibonacci" %>using System.Web.Services;public class Fibonacci : WebService{[WebMethod]public int GetSeqNumber(int fibIndex){if (fibIndex < 2)return fibIndex;int[] FibArray = {0,1};for (int i = 1; i< fibIndex; i++){FibArray[1] = FibArray[0] + FibArray[1];FibArray[0] = FibArray[1] - FibArray[0];}return FibArray[1];}}

Page 129: Programación Orientada a Ojetos

Cliente del serviciousing System;

class ClienteFecha{

public static void Main(){

ServicioFecha s = new ServicioFecha();

Console.WriteLine(“Fecha actual: {0}”, s.Fecha(false));Console.WriteLine(“Fecha actual detallada: {0}”,

s.Fecha(true));}

}

Page 130: Programación Orientada a Ojetos

Cliente de servicio Web Windows C# .NET

Page 131: Programación Orientada a Ojetos

Agregar referencia Web

Page 132: Programación Orientada a Ojetos

Cliente de servicio Web en una Pocket PC

Page 133: Programación Orientada a Ojetos

Página Web del Servicio HelloWorld

Page 134: Programación Orientada a Ojetos

Respuesta del servicio Web par

Page 135: Programación Orientada a Ojetos

Página Web del Servicio 1

Page 136: Programación Orientada a Ojetos

WSDL del servicio Web 1

Page 137: Programación Orientada a Ojetos

Ejecución del servicio Web suma

Page 138: Programación Orientada a Ojetos

Ejecución del servicio Web par

Page 139: Programación Orientada a Ojetos

Crear proxy del servicio Web

Page 140: Programación Orientada a Ojetos

Servicios Web• Ejemplo de archivo WSDL de amazon

• <operation name=“AuthorSearchRequest”/>

• <input message=“typens:AuthorSearchRequest”/>

• <output message=“typens:AuthorSearchResponse”>

• </operation> ….

Page 141: Programación Orientada a Ojetos

Servicios WebLos tipos de datos se definen en otra parte

<xsd:complexType name=“AuthorRequest”> <xsd:all> <xsd:element name=“autor”

type=“xsd:string”/><xsd:element name=“sort” type=“xsd:string”

minOccurs=“0”/> </xsd:all></xsd:complexType>

Page 142: Programación Orientada a Ojetos

Servicios Web• Cuando se traduce a Java queda:

public class AuthorRequest {public AuthorRequest(String author, String

page, String mode, String tag, String sort, String locale, String word, String price) {…}

public String getAuthor() {…}public String getPage() {…} ….}

Page 143: Programación Orientada a Ojetos

Servicios WebPara ejecutar el servicio se utiliza:

AmazonSearchPort puerto = (AmazonSearchPort) (new AmazonSearchService_Impl().getAmazonSearchPort());

AuthorRequest solicitud = new AuthorRequest(name, “1”, books, “”, “lite”, “”, token, “”, “”, “”);

ProductInfo res= puerto.autorSearchRequest(solicitud);

Page 144: Programación Orientada a Ojetos

Servicios Web• Se ocupa en las versiones viejas el JWSDP

(Java Web Service Developer Pack)

• Se necesita un archivo config.xml

<?xml version=“1.0” encoding=“UTF-8”?><configuration xmlns=

http://java.sun.com/xml/ns/jax-rpc/ri/config>

Page 145: Programación Orientada a Ojetos

Servicios Web• <wsdl location=

“http://soap.amazon.com/schemas3/AmazonWebServices.wsdl” packageName=“com.amazon” />

• </configuration>

• wscompile –import config.xml• wscompile –gen –keep config.xml

Page 146: Programación Orientada a Ojetos

Referencias• Liberty, Jesse, Horvarth, David (200).

Aprendiendo C++ para Linux en 21 Días. México, Prentice Hall.

• Márquez, Francisco (1994). Unix Programación Avanzada. Estados Unidos, Addison-Wesley.

Page 147: Programación Orientada a Ojetos

Referencias• Colouris, George, Dollimore, Jean,

Kindberg, Tim (2001). Sistemas Distribuidos Conceptos y Diseño. 3a. Edición. España, Pearson Addison-Wesley.

• Horstmann, Cay, Cornell, Gary (2006). Core Java 2 Volumen II Carácterísticas Avanzadas. España, Perason Prentice Hall.

Page 148: Programación Orientada a Ojetos

Referencias• Deitel, Harvey, Deitel, Paul (2004). Java

Como Programar. Quinta Edición. México, Pearson Prentice Hall.

• Márquez, Francisco (2004). UNIX Programación Avanzada. Tercera edición, México, Alfaomega Ra-Ma.

Page 149: Programación Orientada a Ojetos

Referencias• Froufe, Agustín, Jorge, Patricia (2004). J2ME Java

2 Micro Edition Manual de usuario y tutorial. México, Alfaomega.

• Firtman, Maximiliano (2004). Programación de celulares con Java. Argentina, MP Ediciones.

• Ruíz, Diego (2005). C# La guía total del programador. Argentina, MP Ediciones.

Page 150: Programación Orientada a Ojetos

Referencias• Tanenbaum, Andrew (2002). Redes de

computadoras. Cuarta edición. México, Pearson.

• Wigley, Andy, Wheelwright, Stephen (2003). Microsoft .NET Compact Framework. Estados Unidos, Microsoft Press.

• Ferreira, R. (2009), Material del Curso de Sistemas Distribuidos I, Instituto Tecnológico de Morelia, México.

Page 151: Programación Orientada a Ojetos

Referencias• Makofsky, Steve (2004). Pocket PC

Network Programming. Estados Unidos, Addison-Wesley.

• Wall, Kurt (2000). Programación en Linux. Perú, Prentice Hall.

• Gregory, Kate (1999). Microsoft Visual C++ 6. España, Prentice-Hall Que.

Page 152: Programación Orientada a Ojetos

Referencias• Tanenbaum, Andrew (1996). Sistemas

Operativos Distribuidos. México, Prentice Hall.

• Tanenbaum, Andrew, Van Steen, Maarten (2006). Distributed Systems Principles and Paradigms. Estados Unidos, Pearson Prentice Hall.

• Morales, F. (2009), Material del Curso de Sistemas Distribuidos II, ITM, México.

Page 153: Programación Orientada a Ojetos

Referencias• Vázquez, Adolfo (2002). XML. México,

Alfaomega Ra-Ma.

• R. Pressman, “Ingeniería del Software”, 5ª. Edición, McGraw-Hiil, España, 2002.

• R. Johnsonbaug, Matemáticas Discretas, 4a. Edición, Prentice Hall, México, 1999, ISBN: 970-17-0253-0.

Page 154: Programación Orientada a Ojetos

Referencias• R. Orfali, et al., “Cliente/servidor y

objetos. Guía de supervivencia”, tercera edición, Oxford University Press, México, 2002, ISBN: 970-613-597-9.

• W. Inmor, “Developing Client/Sever Applications”, Wiley, Estados Unidos, 2003, ISBN: 0-471-56906-2.

Page 155: Programación Orientada a Ojetos

Referencias• D. Dewire, “Client/Server Computing”,

McGraw-Hill, Estados Unidos, 1993, ISBN: 0-07-016732-X.

• W. Marion, “Client/Server Strategies”, McGraw-Hill, Estados Unidos, 1994, ISBN: 0-07-040539-5.

Page 156: Programación Orientada a Ojetos

Referencias• P. Renaud, “Introduction to Client/Server

Systems”, Wiley, Estados Unidos, 1993, ISBN: 0-471-57773-1.

• P. Kimmel, “Manual de UML. Guía de aprendizaje”, McGraw-Hill, México, 2006, ISBN: 0-07-226182-X.

Page 157: Programación Orientada a Ojetos

Referencias• J. Senn, “Análisis y Diseño de Sistemas de

Información”, 2da. Edición, McGraw-Hill, México, 1992, ISBN: 968-422-991-7.

• A. Tanenbaum, et al., “Sistemas Operativos. Diseño e implementación”, 2da. Edición, Prentice Hall, México, 1998, ISBN: 970-17-0165-8.

Page 158: Programación Orientada a Ojetos

¿Preguntas, dudas y comentarios?