DIAGRAMA DE CLASES ¿QUÉ ES UN DIAGRAMA DE CLASES? Es uno de los diagramas más importantes dentro del proyecto, ya que nos permite definir la estructura del sistema a construir. Es un diagrama estático o de estructura. Nos permite ver cómo se relacionan entre sí las clases del sistema. ¿QUÉ ES UNA CLASE? Una clase es una abstracción de la realidad. Dicho de otra manera, una clase es, al mismo tiempo, un molde a partir del cual creamos objetos. Un objeto es, entonces, una instancia de una clase. Animal Nombre de la Clase Atributos, indicando nombre, tipo y modi cador de acceso fi fi Operaciones, indicando nombre, valor devuelto (en caso de tenerlo) y modi cador de acceso - nombre: string - peso: double - edad: int - moverse() - comer() MODIFICADORES DE ACCESO Los modificadores de acceso sirven para controlar la visibilidad de los atributos y operaciones de una clase con respecto a las otras. Existen tres tipo de modificadores de acceso: - Private: Los atributos/operaciones de la clase sólo son visibles para la clase contenedora. # Protected: Se utiliza en la generalización. Sirve para que los atributos/ operaciones de una clase sean visibles para las clases derivadas o hijas. + Public: Los atributos/operaciones son visibles para todas las clases. RELACIONES ENTRE CLASES Como se mencionó, las clases están relacionadas entre sí. Las relaciones pueden llevar un nombre que las describa, y en sus extremos se puede hacer indicaciones, como el rol que desempeña la clase, los nombres de las clases relacionadas, su multiplicidad, su visibilidad, y otras propiedades. Persona Revista 1 Suscriptor Se suscribe a * Revistas suscritas MULTIPLICIDAD Es la cantidad de instancias de una clase que se relacionarán con las instancias de otras. Podemos encontrar: 0 … 1 : De cero a una instancia (opcional) (1 persona, 1 suscripción) n : Número específico. Por ejemplo, 1 (1 factura, 1 cliente) 0 … * : De cero a muchos (opcional) (1 profesor, n alumnos) 1 … * : De uno a muchos (1 casa, 1 baño) M … n : Rango específico. (Relación de muchos a muchos) (1 programador, 2 proyectos) TIPOS DE RELACIONES ENTRE CLASES Asociación. Es una relación débil, bidireccional, en la cual las clases saben de la existencia de la otra, pueden interactuar, pero no dependen una de la otra. Se representa con una línea sólida, sin flecha. Personaje Animal - nombre: string - vida: int - nivel: int - nombre: string - peso: double - edad: int - moverse() - comer() - atacar() - moverse() - comer() EJEMPLO Steve come de cero a n animales o puede alimentar de 0 a n Ambos existen conociendo la existencia del otro e interactúan También existen asociaciones unidireccionales, pero no son comunes. Por ejemplo, un detector de velocidad de autos, que es consciente de la existencia del auto, pero el auto (hasta que llega la multa) AGREGACIÓN Es una relación parte-todo. Tiene un grado de acoplamiento más alto que la asociación, pero menor a la composición. En esta relación, una clase actúa de contenedora de otra, pero el tiempo de vida de la clase contenida no está limitada por el tiempo de vida de la clase contenedora. Se representa con una línea sólida con un diamante vacío en el extremo de la clase contenedora. EJEMPLO Tabla de Madera Mesa La espada se crea de forma independiente de Steve, y se almacena en su inventario (Steve la contiene). Sin embargo, si Steve muere la espada seguirá existiendo por sí misma. COMPOSICIÓN Es similar a la agregación, pero más acoplada. La vida del objeto contenido depende de la vida del objeto contenedor. Si se destruye el objeto contenedor, el o los objetivos contenidos también lo hacen. Se representa con una línea sólida, con un diamante negro hacia la clase contenedora. Cuentas Almacén Clientes EJEMPLO El horno contiene un objeto fuego, el cual, si destruimos el horno, se destruye con éste GENERALIZACIÓN Es una relación mediante la cual una clase, denominada superclase o clase padre, hereda todos sus atributos y comportamiento a una o más clases hijas. Las clases hijas pueden agregar atributos y comportamientos propios. Se representa con una línea sólida, con una flecha blanca hacia la superclase EJEMPLOS Animal # nombre: string # peso: double # edad: int # moverse() # comer() Perro - ladrar() Nutria EJEMPLOS Cubo # nombre: strin # puntos: int # textura: string # colocarMundo() # romper(): item DEPENDENCIA En una relación de dependencia, una clase depende de otra para poder cumplir con su comportamiento. Se representa con una línea puntada con una flecha hacia la clase a la cual se depende. Gestor de Pago Pasarela de Pago EJEMPLO CONSEJOS! 1. Encontrar el nombre de las clases. Por ejemplo, Persona, Automóvil, Figura, etcétera. 2. Encontrar las relaciones entre las distintas clases. Por ejemplo, una persona conduce un automóvil. 3. Construir el diagrama, colocando las clases y sus relaciones, tratando de que las líneas se crucen lo menos posible. CADA CLASE ES RESPONSABLE DE SU COMPORTAMIENTO! DIAGRAMA DE OBJETOS ¿EN QUÉ CONSISTEN? Muestran una fotografía del sistema en un momento específico del sistema. Mientras que el diagrama de clases es una vista ESTÁTICA del sistema, el diagrama de objetos no. Comparten similitudes con el diagrama de clases, siendo el diagrama de objetos más sencillo de graficar. Nos sirven para entender mejor el diagrama de clases, sobre todo el proceso de abstracción realizado para llegar a éste. OBJETOS Steve :Jugador vida = 100 textura = “/skins/Steve.png” fuerza = 10 velocidad = 5 :Jugador vida = 100 textura = “/skins/Steve.png” fuerza = 10 velocidad = 5 Objeto Anónimo Steve vida = 100 textura = “/skins/Steve.png” fuerza = 10 velocidad = 5 RELACIONES ENTRE OBJETOS Las relaciones simplemente se representan mediante líneas sólidas y el nombre de la misma. Steve :Jugador vida = 100 textura = “/skins/Steve.png” fuerza = 10 velocidad = 5 :Animal Come vida = 50 textura = “/skins/vaca.png” alimento = “Trigo” velocidad = 3 EJEMPLO EJERCICIO! Realizar el diagrama de clases y de objetos de un juego, que contenga lo visto en las diapositivas! 1. Personaje. 2. Herramientas/Armas (o ambos). 3. Animales. 4. Cubos. DIAGRAMA DE SECUENCIA DEFINICIÓN - Sirven para describir cómo y en qué orden un grupo de objetos funcionan en conjunto en un escenario en particular. Estos diagramas pueden encontrar su utilidad en los siguientes aspectos: - Detallar un caso de uso. Modelar la lógica de una operación compleja. Ver la interacción entre los objetos y sus componentes para lograr un objetivo. Entender la funcionalidad de un escenario en particular. ELEMENTOS Objeto: se representa por un rectángulo. Se aplican las mismas reglas de Diagrama de Objetos para nombrarlos. Si quien invoca la operación es un actor externo, se representa con un monigote. :NOMBRE_CLASE Línea de vida. Representa el tiempo de vida de un objeto. Se trafica con una línea discontinua. :NOMBRE_CLASE ELEMENTOS Casilla de activación. Es el tiempo que le toma al objeto ejecutar una tarea en específico. Se representa con un rectángulo blanco encima de la línea de vida. :NOMBRE_CLASE ELEMENTOS Mensajes. Se grafican para representar los mensajes enviados entre los distintos objetos. Pueden ejecutar una operación. Existen distintos tipos de mensajes: Síncronos: El objeto que envía el mensaje debe esperar a que termine la operación invocada para poder continuar con su responsabilidad. Asíncrono: El objeto que envía el mensaje puede seguir su trabajo mientras espera la respuesta del mensaje enviado. ELEMENTOS Bucle: Se utiliza para encerrar parte del diagrama e indicar que el mismo se puede repetir a partir de una determinada condición. :NOMBRE_CLASE :NOMBRE_CLASE realizarOperación( ) Loop <condición> acumularValor( ) recibirResultado( ) ELEMENTOS Alternativa: Se utiliza para encerrar parte del diagrama e indicar que el mismo debe cumplir una condición para ejecutarse. :NOMBRE_CLASE :NOMBRE_CLASE realizarOperación( ) Alt <Si> acumularValor( ) <Sino> multiplicarValor( ) recibirResultado( ) ELEMENTOS Destrucción de un objeto: Para simbolizar la destrucción de un objeto se debe colocar una cruz al final de la línea de vida del objeto. :NOMBRE_CLASE ¿ES NECESARIO CONTAR CON UN DIAGRAMA DE CLASES? El diagrama de secuencia se puede utilizar para poder completar, por ejemplo, requerimientos de un sistema que tal vez todavía no se tienen muy en claro. En general, no sería necesario utilizar un diagrama de clases como base para realizar un diagrama de secuencia, pero es en donde se encuentra su mayor provecho. Nos permitirá ver la interacción entre objetos de una manera más detallada, en donde el orden de éstas juega un papel fundamental. También se debe recordar de que sirven para detallar un caso de uso. PROCESO PARA ARMAR EL DIAGRAMA DE SECUENCIA - En primer lugar, es importante determinar el escenario que se va a representar, debido a que éste diagrama representa un escenario en - específico. Una vez identificado el escenario, se deberá identificar los objetos participantes en el escenario, y determinar si hay algún actor externo al - sistema que participe en el escenario. Recordar que todos los eventos o mensajes enviados deben tener una respuesta. EJEMPLO Herramienta utilizada: draw.io