Foros del Web » Programación para mayores de 30 ;) » Programación General »

Problema con diagramas de secuencia

Estas en el tema de Problema con diagramas de secuencia en el foro de Programación General en Foros del Web. Hola a todos. Estoy muy perdido en esto del UML, y aunque he conseguido hacer hasta ahora los casos de uso y los diagramas de ...
  #1 (permalink)  
Antiguo 12/06/2011, 07:41
 
Fecha de Ingreso: marzo-2011
Mensajes: 20
Antigüedad: 13 años, 8 meses
Puntos: 0
Problema con diagramas de secuencia

Hola a todos. Estoy muy perdido en esto del UML, y aunque he conseguido hacer hasta ahora los casos de uso y los diagramas de actividades, tengo dificultades con los de secuencia.

Primero, una breve explicación del proyecto. La aplicación web es una tienda online usando servlets, JSP y Tomcat. En cuestión de clases java, tengo dos paquetes: entidades y servlets.

En entidades se encuentran las clases que harán de controlador y que además proporcionaran objetos cuando sea necesario. Por ejemplo la clase Usuario, que tendrá los métodos de atacar a la tabla de usuarios en la base de datos (actuando así como controlador, si no me equivoco), pero también tendrá atributos en los que se guardará la información del objeto que se añadirá a la sesión. La clase Pedido lo mismo, además de poseer los métodos de inserción en base de datos, permite la creación de un objeto 'pedido' que añadir a la sesión.

En servlets se encuentran las clases java con los servlets. He utilizado servlets siempre que en la interfaz hubiera un formulario a enviar y JSP cuando no lo hubiera, para no llenar el proyecto con clases innecesarias. Entonces en servlets tengo clases como RegistroServlet o LoginServlet, en los cuales además de controlar la sesión simplemente llamo a los métodos usuario.registrarse() y usuario.iniciarSesion().

Y luego aparte un porrón de JSP y HTML.


Ahora, cómo diseño exactamente los diagramas de secuencia para mi proyecto? Porque por lo que veo en ejemplos de diagramas, están formados por objetos y las interacciones entre ellos.
Si mi aplicación no fuera web, veo la idea más clara. Por ejemplo, para el diagrama de secuencia del caso de uso Registrarse, la primera clase a la izq sería por ejemplo un Frame con la página principal, que luego llama al Frame con el formulario de registro usando un método, y luego en el Frame del formulario se llama a usuario.registrarse().
Pero en mi caso, dado que no tengo clases relacionadas con la vista o interfaz, sino que eso es código web en forma de HTML y JSP, dónde empiezo exactamente? He pensado en utilizar el server como objeto, porque aunque actúe en la sombra, se supone que está envíando y recibiendo información constantemente mediante sus métodos. ¿Es ese el camino, o hay otra forma de diseñar los diagramas en mi caso?

Creo que mi explicación ha sido más bien terrorífica, pero con suerte alguno me ha entendido y me puede echar un cable.


Un saludo.
  #2 (permalink)  
Antiguo 12/06/2011, 09:08
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 10 meses
Puntos: 39
Respuesta: Problema con diagramas de secuencia

Tal y como lo planteas es bastante difícil hacer un diagrama de secuencia. Veo que ya tienes las clases identificadas, si puedes mostrar tu diagrama de clases sería mucho más fácil ya que se verían todos los objetos que tienes y su relación entre ellos. Creo que has seguido el proceso al revés, primero se hace el diagrama de secuencia y después se implementa, parece que lo tienes implementado y ahora quieres hacer el diagrama de secuencia, y si has implementado sin mantener las relaciones que existen entre los objetos entonces hacer el diagrama de secuencias se vuelve difícil porque no existe en la implementación esa relación que muestra el diagrama de clases.
  #3 (permalink)  
Antiguo 12/06/2011, 11:18
 
Fecha de Ingreso: marzo-2011
Mensajes: 20
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con diagramas de secuencia

Tienes razón, el problema viene de haber programado todo y ahora hacer el UML a la inversa, lo cual ha resultado siendo una estupidez. Pero a estas alturas y con prisas de entregar el proyecto, no me queda otra que intentar hacer funcionar la chapuza.

Tengo un diagrama de clases, pero en él sólo he puesto las entidades, no los servlets puesto que no sabía cómo relacionar estos con las entidades.



Es decir, aparte de estas clases, tengo 20 más llamadas: RegistroServlet, LoginServlet, ModificarCuentaServlet, AnadirArticuloServlet, RealizarPedidoServlet, etc. Estas clases son todas muy similares, y lo único que hacen es recoger la información que el usuario pasa por medio de un formulario y pasarsela al controlador. Por ejemplo, este es el código de RegistroServlet:

Código:
@WebServlet("/registro")
public class RegistroServlet extends HttpServlet {
	
	@Override
	public void doPost(HttpServletRequest request, 
			HttpServletResponse response) 
		throws ServletException, IOException {
		
		
		HttpSession sesion = request.getSession(true);
		Usuario usuario = (Usuario) sesion.getAttribute("usuario");
		if (usuario == null) {
			Validador validador = new Validador();
			boolean dniValido = validador.validarDNI(request.getParameter("dni"),
					request.getParameter("letra"));
			boolean existeUsuario = validador.buscarUsuario(request.getParameter("dni")+
					request.getParameter("letra"),request.getParameter("email"));
			if (existeUsuario) {
				response.sendRedirect("error.jsp?tipo=registro");
			} else if (!dniValido) {
				response.sendRedirect("error.jsp?tipo=dni");
			} else {
				Usuario nuevoUsuario = new Usuario();
				nuevoUsuario.registrar(request);
				response.sendRedirect("exito.jsp?tipo=registro");
			}
		} else {
			response.sendRedirect("error.jsp?tipo=restringido");
		}
	}
}
El resto de servlet son todos muy similares a este. Primero se comprueba la sesión (en este caso comprueba que ningún usuario ha iniciado sesión ya, pero en otros servlets comprueba que el nivel de acceso del administrador es válido, etc), luego se verifican parámetros introducidos por el usuario en caso de que sea necesario, y si todo está bien se crea un objeto de la entidad que actuará de controlador (en este caso el objeto nuevoUsuario, que llama el método registrar() que inserta la información del registro en base de datos). En general siempre paso el objeto request al método del controlador.

Es decir, la relación entre servlet y entidades es que el servlet crea un objeto y emplea sus métodos para atacar la base de datos. Pero cómo expreso la creación del servlet en el diagrama de secuencia? Puesto que el servlet ha sido llamado mediante un formulario HTML en un documento HTML o JSP, y los objetos request y response que entran como parámetros han sido creados en el momento de esa llamada. Si no me equivoco...
Joer qué puto lío.

Gracias por tu tiempo.

Un saludo.
  #4 (permalink)  
Antiguo 12/06/2011, 12:39
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 10 meses
Puntos: 39
Respuesta: Problema con diagramas de secuencia

Hacer todos esos servlets está bien, o al menos yo no diría que está mal ya que no se lo suficiente sobre ese tema. Pero lo que si está mal es que los servlets hacen más cosas de las que deberían hacer.

Para el ejemplo que muestras, lees los datos, los validas y llamas al controlador, al llamar al controlador como ya está todo validado no tiene que validar nada, por lo que no hace ninguna interacción con ningún objeto. Eso si está mal, el servlet solo debería leer los datos y pasárselos al controlador, de esta forma si interactua con otras clases (Validador en este caso) para realizar la validación.

Los servlets creo que no deberían salir en el diagrama de clases ya que deben usarse para gestionar la interacción entre usuario y máquina, esto es leer datos introducidos por el usuario y mostrar errores que esos datos puedan producir, pero no comprobar esos datos (aunque como no conozco el tema de los servlets en profundidad no estoy muy seguro).

Al hacer el servlet comprobaciones que no debería hacer ahora resulta difícil hacer un diagrama de secuencia, lo correcto para hacer las cosas bien es revisarlo todo y arreglarlo, pero esto no siempre es posible, y por lo visto no te queda tiempo para eso. Yo veo 2 soluciones: realizar los diagramas de secuencia suponiendo que está bien implementado (esto no te lo aconsejo), o incluir los servlets como objetos en la interacción del diagrama de secuencia.

Para el próximo proyecto en el que tengas que realizar diagramas UML, hazlos primero y después implementas. Se que cuesta, porque puede parecer que estás perdiendo tiempo al no teclear código, pero ¿si al final tienes que hacer las 2 cosas que más da el orden? Además haciendo primero los diagramas UML es más fácil realizar una implementación mejor, y si están bien hechos todo el tiempo que dedicas a escribir el código es como si estuvieses pasando un documento escrito a mano a ordenador, ya que no tienes que pensar, solo escribir lo que pone.
  #5 (permalink)  
Antiguo 12/06/2011, 13:29
 
Fecha de Ingreso: marzo-2011
Mensajes: 20
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con diagramas de secuencia

Agradezco la ayuda y críticas. El problema ha sido ponerme a hacer un proyecto sin tener ni papa de ingeniería del software, y no tener a un tutor guiándome. Empecé allá por febrero y no había oído nunca aquello de 'servlets', 'JSP', 'UML', ni por el estilo. Lo he aprendido todo por mí cuenta (rápido y mal) para conseguir hacer el proyecto, y ello ha causado que aparte de lo que comentas seguro que hay 2000 cosas más que no debería haber programado como lo he hecho. Pero a estas alturas ya no tiene solución, sólo espero poder aprender del mayor número de errores cometidos y entregar la chapuza esta, que gracias a Dios funciona

Lo que comentas de que los servlets sólo deberían actuar como enlace, no tenía ni idea, de hecho si lo programé así es porque me parecía más lógico que el controlador (la clase Usuario, por ejemplo) se encargase única y exclusivamente de la inserción en base de datos y no de válidar nada (y registrarse() es justo lo que hace, insertar en base de datos sin comprobar nada, puesto que se presupone que las validaciones se han realizado antes).

Entonces me recomiendas, o bien modificar todos los servlets para que sólo actúen como enlace (y pasar el resto del código con las validaciones y verificaciones al controlador?), o bien incluir los servlets como objetos en los diagramas de secuencia. Lo primero podría hacerlo si fuera estrictamente necesario, pero preferiría evitarlo a estas alturas. ¿Podrías darme un ejemplo de lo segundo? No te pido que me dibujes el diagrama, pero si me pudieras describir cómo lo harías para por ejemplo el caso de uso Registrarse, me ayudaría bastante porque como ya te he dicho es la primera vez en mi vida que veo estas cosas. Lo único que se me ocurre es poner el objeto RegistroServlet, que mediante el método doPost crea un nuevo objeto Usuario, que mediante el método registrarse() ataca a la base de datos, etc. Pero no confío mucho en mis ideas, así que toda ayuda es bienvenida.

De nuevo gracias, Rubén.

Un saludo.
  #6 (permalink)  
Antiguo 12/06/2011, 14:07
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 10 meses
Puntos: 39
Respuesta: Problema con diagramas de secuencia

A estas alturas no te vas a poner a cambiar todo el código, eso esta claro jejeje. Lo importante es aprender para futuros proyectos.

Las validaciones no deben hacerse en el servlet por un motivo muy sencillo: ¿qué pasaría si quisieras hacer uso del método registrarse() en otro lugar del código? Podrías llamar al método sin hacer las comprobaciones y eso sería un problema. Evidentemente si solo programas tú no pasará nada porque no provocarás ese tipo de fallos, en cualquier caso repetirías código para validar, y eso si está mal programen 1 o 10 personas juntas.

Modificar los servlets y mover el código de las validaciones al sitio correcto puede ser algo muy costoso y si no tienes tiempo no hay que ponerse a hacer ese tipo de cambios. Lo mejor es que incluyas el servlet en el diagrama de secuencia. Para el caso de registrarse el diagrama sería bastante sencillo:
-El servlet llama al método validarDNI de Validador y después al método buscarUsuario de Validador, si el DNI es válido y no existe el usuario entonces llama al método registrar de Usuario.

Para que te hagas una idea de como sería si las validaciones estuviesen en la clase Usuario:
-Se llama al método validarDNI de Validador y después al método buscarUsuario de Validador, si el DNI es válido y no existe el usuario entonces se registra el usuario.

Para el caso tuyo (el del servlet), dibujarlo serían las 3 líneas verticales correspondientes a los 3 objetos (servlet, Validador y Usuario) y las correspondientes flechas entre ellos que representan las llamadas a los métodos.

He encontrado este ejemplo que se ajusta bastante al aspecto que deben tener tus diagramas de secuencia:

Lo que sale como InterfaceUsuario seria el servlet para que te hagas una idea más exacta.
  #7 (permalink)  
Antiguo 12/06/2011, 15:00
 
Fecha de Ingreso: marzo-2011
Mensajes: 20
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con diagramas de secuencia

Siguiendo tus consejos he dibujado este diagrama:



Creo que coincide con lo que me has dicho, y de hecho gracias a tu explicación creo que me voy enterando del asunto. Básicamente consiste en dibujar en el esquema todas las llamadas a métodos, por orden, que se hacen desde la primera clase. ¿No? Lo único que diría que me falta, es poner un 'if A & B true' antes de la última llamada al método registrarse() de usuario, puesto que sólo se debería de dar en caso de cumplirse dos condiciones. Pero no sé si esto entra en el terreno de los diagramas de secuencia, quizá sólo es necesario poner las llamadas a métodos sin importar cuáles sean los requisitos para que estas se den.

¿Qué te parece el bicho? Si me das el visto bueno sigo con el resto.

¡Gracias!

Un saludo.
  #8 (permalink)  
Antiguo 12/06/2011, 17:22
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 10 meses
Puntos: 39
Respuesta: Problema con diagramas de secuencia

La idea es esa, dibujar las llamadas por orden. Las llamadas como new() que crean objetos no es necesario ponerlas ya que es algo que se supone que tienes que hacer jejeje.

Las condiciones pueden indicarse, para este caso puedes hacer que se guarde el valor que devuelven las validaciones en variables y antes de la llamada puedes poner un if en pseudocódigo. El diagrama que has puesto ahí se ajusta a lo que he dicho (salvo por la llamada new() y porque falta el if).

No tiene muchas flechas porque el proceso es realmente sencillo, supongo que otras partes del código tendrán más llamadas, de todas formas no se trata de que aparezcan cuantas más llamadas mejor, se trata de que viéndolo se sepa que pasos sigue.
  #9 (permalink)  
Antiguo 16/06/2011, 13:51
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 20 años, 6 meses
Puntos: 2
Respuesta: Problema con diagramas de secuencia

En visual studio hay una apción para armar los diagramas de secuencia a partir del código, no se que ide estarás usando, pero verificá si no tiene esta funcionalidad.

saludos

Etiquetas: diagramas, ingeniería-del-software-y-gestión-de-proyectos, secuencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:49.