Modelado Conceptual 2024-2025 PDF
Document Details
Uploaded by Deleted User
Miguel Alemán Flores, Agustín Salgado, Ana Plácido
Tags
Summary
This document provides lecture notes on object-oriented programming (OOP) and introduces the Unified Modeling Language (UML). It covers fundamental OOP concepts like classes, objects, attributes, and methods, complemented by an overview of UML diagrams. The content will appeal to students studying software engineering at an undergraduate level.
Full Transcript
INGENIERÍA DEL SOFTWARE 1 CURSO 2024-2025 Modelado Conceptual Introducción a los Diagramas de Clases Miguel Alemán Flores, Agustín Salgado, Ana Plácido El valor de la experiencia 2 “Si escucho olvido, si veo recuerdo, si hago comprendo”. Prov...
INGENIERÍA DEL SOFTWARE 1 CURSO 2024-2025 Modelado Conceptual Introducción a los Diagramas de Clases Miguel Alemán Flores, Agustín Salgado, Ana Plácido El valor de la experiencia 2 “Si escucho olvido, si veo recuerdo, si hago comprendo”. Proverbio chino Conceptos 3 Objeto Generalización Bag Clase Especificación Sequence Instancia Restricción Relación Clase abstracta Histórico Controlador Atributo Clase de asociación Inmutable Público/Privado Estereotipo Modelo Composición Enumeración … Asociación Encapsulamiento Autoasociación Tipos primitivos Rol CamelCase Agregación Ocultación de información Operación/Método Clases de especificación Navegabilidad Colección Multiplicidad Set Herencia Ordered POO: Características principales 4 Abstracción Modularidad Herencia Programación Orientada a Objetos Encapsulamiento Polimorfismo POO: Características principales 5 ◼ Abstracción: Representa las características esenciales de un objeto, donde se capturan sus comportamientos. La abstracción es clave en el proceso de análisis y diseño orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar. ◼ Encapsulamiento: Significa reunir todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistema. https://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos POO: Características principales 6 ◼ Modularidad: Propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes. ◼ Polimorfismo: Comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. ◼ Herencia: Mecanismo que permite definir nuevas clases a partir de clases existentes. Las nuevas clases definidas son clases derivadas o subclases. https://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos POO: Conceptos básicos 7 http://damoviles-informatica.blogspot.com/2015/04/programacion-orientada-objetos.html POO: Conceptos básicos 8 http://damoviles-informatica.blogspot.com/2015/04/programacion-orientada-objetos.html Desarrollo de productos 9 Idea Modelo Producto Necesidades Modelo Aplicación ◼ Neces1 ◼ Neces2 ◼ Neces3 https://www.imagui.com/a/foto-casa-TbKaGERbL Creación de modelos 10 1. Necesidades del producto 2. Trasladarlas a un modelo https://picale.mx/2020/09/08/asi-puedes-ahorrar-y-comprar-tu-primera-casa/ Antes de construir el producto demandado por el cliente es necesario realizar un modelo que refleje las necesidades y restricciones. Diagramas en UML 11 Unified Modeling Language Tipos de Diagrama 12 Estructura vs Comportamiento ¿Qué elementos hay? ¿Para qué se usa? Tijeras Cortar Destornillador Limar Cuchillo Abrir Botella Lima Ampliar Sacatapas Atornillar Gancho Desatornillar Regla Medir Lupa … … Diagrama de Diagrama de Clases (DC) Casos de Uso (DCU) Modelo conceptual 13 Representa un conjunto de En el desarrollo de software, conceptos interrelacionados ayuda a entender el dominio del mundo real que describen del problema del cliente y un dominio o sistema. diseñar la solución. Objetos y clases 14 ◼ Clase: Es una plantilla, un prototipo para crear objetos. Todas las propiedades y métodos comunes a los objetos se encapsulan o agrupan en clases. ◼ Objeto: Es una instancia de una clase. Se corresponden con los objetos reales del mundo que nos rodea. Atributos 15 ◼ Atributos: Representan las características o propiedades que tiene la clase. color peso origen Métodos 16 ◼ Métodos: Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. ◼ Un método puede producir un cambio en las propiedades del objeto, o generar un “evento” en otro objeto. trocear pelar quitarSemillas Clases 17 Del código a su representación en UML public class Rectangle{ Rectangle int centerX; int centerY; centerX: Integer int width; centerY: Integer int height; width: Integer Color borderColor; height: Integer Color fillingColor; borderColor: Color fillingColor: Color void translate(int tx, int ty){ translate(tx: Integer, ty: Integer) centerX+=tx; centerY+=ty; } } Instancias 18 Creación y manipulación de un objeto public main () { R1: Rectangle Rectangle R1; R1= new Rectangle(…); centerX: 5 R1.centerX = 5; centerY: 3 R1.centerY = 3; width: 2 R1.width = 2; height: 4 R1.height = 4; R2: Rectangle Rectangle R2; centerX: 0 R2= new Rectangle(…); centerY: 1 R2.centerX = 0; width: 3 R2.centerY = 1; height: 2 R2.width = 3; R2.height = 2; } Clases 19 Representaciones alternativas Rectangle Rectangle centerX: Integer centerY: Integer centerX: Integer width: Integer Rectangle centerY: Integer Rectangle height: Integer translate(tx: Integer, ty: width: Integer borderColor: Color Integer) height: Integer fillingColor: Color borderColor: Color translate(tx: Integer, fillingColor: Color ty: Integer) Clases 20 Denominación usando CamelCase UserAccount firstName calculateTax() Clases 21 Paquetes, clases e instancias sales customer1: sales :: Customer Customer firstName: String = “John” firstName: String lastName: String = “Smith” lastName: String phone: Telephone = 555666777 phone: Telephone Clases 22 Visión general Atributos Tipos, tipos primitivos y definidos por el usuario 23 Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial public class Address { Address Tipos básicos de UML: street: String String street; number: Integer int number; String city: String String city; Boolean zipCode: String String zipCode; Integer country: String String country; } Real/Float UnlimitedNatural public class ISBN { ISBN public String value; + value: String private boolean valid(); } - valid(): Boolean Atributos 24 Tipos enumerados Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial Employee Weekday name: String Monday afternoonShift: Weekday Tuesday Wednesday Thursday Friday enum Weekday { public class Employee { Monday, Tuesday, String name; Wednesday, Weekday afternoonShift; Thursday, Friday } } Atributos 25 Tipos enumerados Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial Weekday Employee Monday afternoonShift name: String Tuesday Wednesday * 1 Thursday Friday enum Weekday { public class Employee { Monday, Tuesday, String name; Wednesday, Weekday afternoonShift; Thursday, Friday } } Atributos Multiplicidad 26 Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial Employee public class Employee { name: String String name; address : Address Address[] address; telephone [0..2]: PhoneNumber PhoneNumber[] telephone; Employee() { address = new Address; telephone = new PhoneNumber; } } Atributos 27 Visibilidad Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial Customer + phone: PhoneNumber - privado ~ paquete + público # protegido Atributos Encapsulamiento y ocultación de información 28 Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial Termometer public class Termometer { - temperature: double private double temperature; + setTemperature(…) public void setTemperature(…) { … } + getFahrenheit() public double getFahrenheit() { … } + getCelsius() public double getCelsius() { … } } El encapsulamiento agrupa datos con los métodos que operan sobre esos datos. Atributos Encapsulamiento y ocultación de información 29 Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial public class Triangle { Triangle private … centerX; private … centerY; - centerX - centerY public void setPosition(…) { … } + setPosition(…) public … getX() { … } + getX() public … getY() { … } + getY() public void translate(…) { … } + translate(…) public void rotate(…) { … } + rotate(…) } La ocultación de información protege a las propiedades de un objeto de modificaciones por quien no tenga derecho de acceso. Atributos Valores derivados, únicos, inmutables 30 Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial Book public class Book { + isbn: ISBN public final ISBN isbn; + cost: Money public Money cost; + price: Money public Money price; +/ benefit: Money = price-cost public Money benefit; Book(ISBN id, Money c, Money p) { this.isbn = id; this.cost = c; this.price = p; this.benefit = p - c; } } Atributos Valores estáticos e iniciales 31 Visibilidad Nombre Multiplicidad : Tipo = Valor Inicial Ticket public class Ticket { - nextTicketNumber: int=1 private static int nextTicketNumber = 1; - ticketNumber: int private int ticketNumber; } Order public class Order { + date: Date public Date date; + totalValue: Money=0 public Money totalValue = 0; } Abstracción 32 Figura El proceso de abstracción permite seleccionar las características relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. Herencia Generalización, especialización y clases abstractas 33 Rectangle Circle width: int radius: int height int center: Point center: Point borderColor: Color borderColor: Color fillingColor: Color fillingColor: Color translate(tx:int, ty:int) translate(tx:int, ty:int) rotate(alfa: Angle) Herencia Generalización, especialización y clases abstractas 34 Figure center: Point borderColor: Color fillingColor: Color translate(tx:Integer, ty:Integer) Rectangle Circle width: Integer radius: Integer height Integer rotate(alfa: Angle) Herencia Generalización, especialización y clases abstractas 35 abstract class User { User … name: String } address: String telephone: String class Teacher extends User { penalization: Date … } penalize(duration: Integer) class Student extends User { … } Teacher Student category: Category exchange: Boolean Herencia Generalización, especialización y clases abstractas 36 BankAccount Customer * 1 firstName: String + number: AccountNumer lastName: String CheckAccount SavingsAccount fee: Money interestRate: Percentage Herencia Generalización, especialización y clases abstractas 37 Student name: String birthDate: Date … Especialización sin clases abstractas IncomingStudent OutgoingStudent sendingUniversity receivingUniversity Herencia 38 Operaciones polimórficas Payment name: String amount: Money … confirm() CreditCardPayment PayPalPayment confirm() confirm() Asociación 39 Multiplicidad/cardinalidad Subject Teacher teachers[*]: Teacher * 1..* subjects[*]: Subject ¿Cuántas asignaturas imparte un profesor? ¿Cuántos profesores imparten una asignatura? Atributos o métodos sobreentendidos (no se indican en la clase). Las multiplicidades se analizan en un estado estable. class Subject { class Teacher { … … List teachers; List subjects; … … } } Asociación 40 Roles 1 owner * Person Car * driver * 1 ,=o 0..1.. = desde/hasta * (también 0..*) 1..* Asociación 41 Roles 1 owner * Person Car * driver * public class Person { public class Car { … … private List owner; private Person p; private List driver; private List d; Person(…) { Car(…) { this.owner = new ArrayList(); this.p = new Person(); this.driver = new ArrayList(); this.d = new ArrayList(); … … } } } } Asociación 42 Nombre de la asociación vs roles borrows User Book is borrowed User Book User Book borrower borrowed Person Company employee employer Asociación 43 Nombre de los roles * 1 Exercise Chapter belongs to contains * 1 Exercise Chapter [exercises] [chapter] El nombre de los roles no aporta public class Chapter { más información al dado por las public Listexercises; clases. } public class Exercise { public Chapter chapter; } Asociación 44 Navegabilidad Table TableStyle numberOfColumns: Integer numberOfRows: Integer fontColor: Color … * 1 fillingColor: Color borderWidth: Integer style: TableStyle … (sobreentendido, no se indica) public class Table { public int numberOfColumns; public class TableStyle { public int numberOfRows; public TableStyle style; public Color fontColor; public Color fillingColor; public int borderWidth; Table(TableStyle st, …) { } this.style = st; } } Asociación 45 Navegabilidad Employee Contract 1 1..* Employee Contract 1 1..* Employee Contract 1 1..* Employee Contract 1 1..* Employee Contract 1 1..* Asociación 46 Autoasociación o asociación reflexiva * sibling Person siblings[*]:Person * (sobreentendido, no se indica) public class Person { public List siblings; Person(…) { this.siblings = new ArrayList(); } } Asociación 47 Diferencia entre asociación y operación buys Person Car * 1..* owns Person Car 1 1..* 1 * * 1..* Person Sale Car buyer Asociación 48 Diferencia entre asociación y operación owns Person Car 1 1..* public class Person { public class Car { private List owner; private Person p; Person(…) { Car(…) { this.owner = new ArrayList(); this.p = new Person(); } } Car getOwn(int i) { Person getOwner() { return this.owner.get(i); return this.p; } } void addCar(Car c) { void addOwner(…) { this.owner.add(c); this.p.setPerson(…); } } } } Asociación 49 Diferencia entre asociación y operación 1 * * 1..* Person Sale Car buyer public class Person { private List buyer; } public class Sale { private Person buyer; private List cars; } public class Car { private List sales; } Asociación 50 Restricciones Student Course * 1..* * 1..* {self.degree=self.course.degree} Degree 1 1 Asociación 51 Restricciones public class Student { public class Degree { … private Degree degree; private String name; private List courses; private List students; private List courses; Student(…, Degree d) { } … this.degree = d; public class Course { courses = new ArrayList(); } … private Degree degree; void addCourse (Course c) { private List students; if (this.degree.getName().equal(c.getDegree().getName())) } courses.add(c); } } Asociación 52 Restricciones subordinate * * 1 Employee Department 0..1 supervisor {Employee.department= Employee.supervisor.department} member * * Teacher 1 {subset} Commission * president Asociación 53 Restricciones subordinate * * 1 Employee Department 0..1 supervisor {Employee.department= Employee.supervisor.department} public class Employee { Department department; List subordinate; Employee supervisor; public class Department { void setSupervisor(Employee sup) { List employees; if (this.department.getName().equals(sup. } department.getName())) this.supervisor = sup; } } Asociación 54 Restricciones member * * Teacher 1 {subset} Commission * president public class Teacher { public class Commission { private List member; private List member; private List president; private Teacher president; void addMember (Teacher t) { void addMember (Commission c) { member.add(t); member.add(c); t.addMember(this); } } void addPresident (Commission c) { void setPresident (Teacher t) { president.add(c); if (this.member.indexOf(t) != -1) } president = t; } t.addPresident (this); } } Asociación 55 Restricciones 1 supervises * Teacher Dissertation 3 {xor} * evaluates La restricción se aplica sobre la asociación, no sobre la multiplicidad. Plantear cómo implementar esta restricción, tomando como ejemplo la diapositiva anterior. Asociaciones de todo-parte 56 Agregación y composición Lista de reproducción Cesta de la compra Asociación, agregación y composición 57 Asociación Agregación Composición Agregación 58 Shared Aggregation PlayList Song name: String * * songs[*]: Song title: String artist: String play() play() addSong(song: Song) removeSong(position: Natural) Whole Part Agregación 59 Shared Aggregation Group Contact name: String * * members[*]: Contact name: String telephone: String addMember(contact: Contact) removeMember(position: Natural) Agregación 60 Shared Aggregation public class Group { Group public String name; public Listcontacts; // CONSTRUCTOR Group(String name){ this.name = name; * contacts = new List(); } * // ADD EXISTING CONTACT TO A GROUP Contact public void addMember(Contact contact) { contacts.add(contact); } } public class Contact { public String name; public String telephone; } Composición 61 Composite Aggregation Order También se pueden 1 añadir después * OrderItem Book * 1 Composición 62 Composite Aggregation 1 * OrderItem * 1 Order Book public class Order { public class OrderItem { private List items; private Book book; void addItem(Book b, int amount) { private int amount; OrderItem it = new OrderItem (b, amount); OrderItem (Book b, int n) { items.add(it); this.book = b; } this.amount = n; void delItem(int id) { items.remove(it); } } } void getItem(int id) { return items.get(it); } } public class Book { … } Composición 63 Composite Aggregation Address Customer + street: String 1 1..* + number: Integer + name: String + zipCode: Integer + telephone: Phone + city: String + country: String Instancias diferentes Address Customer + street: String + name: String + number: Integer + telephone: Phone + zipCode: Integer + addresses[*]: Address + city: String + country: String Instancias identificadas por sus valores Composición 64 Composite Aggregation Address Customer 1 1..* + street: String + name: String + number: Integer + telephone: Phone + zipCode: Integer + city: String + country: String Customer1 Address 1 name Address 2 telephone Address 3 Composición 65 Composite Aggregation Address Customer 1 1..* + street: String + name: String + number: Integer + telephone: Phone + zipCode: Integer + city: String + country: String public class Customer { public List address; public String name; public class Address { public Phone telephone; public String street; … public int number; public int zipCode; void addAddress(String Street, int number, int public String city; zipCode, String city, String country) { public String country; Address a = new Address (Street, number, zipCode, … city, country); } address.add( a ); } } Composición 66 Composite Aggregation Agenda 1 * contacts[*]: Contact Contact addContact(…) // ADD A NEW CONTACT TO THE AGENDA public class Agenda { public Listcontacts; public void addContact(String firstName, String lastName, String telephone) { Contact newContact = new Contact(firstName, lastName, telephone); contacts.add(newContact); } } Composición 67 Composite Aggregation Presentation Slide1 Slide2 Slide3 Slide4 Slide5 Slide6 Slide7 Slide8 Slide9 Slide10 1 1..* Presentation Slide Composición 68 Composite Aggregation Circle Circle center: Point Circle radius: Integer CenterPoint Color: Color centerX: Integer centerY: Integer x: Integer radius: Integer y: Integer Color: Color 0..1 center 1 radius: Integer Color: Color Point x: integer y: Integer Composición 69 Composite Aggregation Circle public class Circle { centerX: Integer int centerX; centerY: Integer int centerY; radius: Integer int radius; color: Color Color color; } Circle Circle public class Circle { center: Point Point center; radius: Integer int radius; Point Color: Color Color color; x: Integer } y: Integer 0..1 center 1 public class Point { radius: Integer Point int x; Color: Color x: integer int y; y: Integer } Composición 70 Composite Aggregation Segment Segment Segment End1 Color: Color end1X: Integer x: Integer end1Y: Integer y: Integer end2X: Integer end2Y: Integer Color: Color 0..1 End2 ends x: Integer 2 y: Integer Point x: Integer y: Integer Color: Color Composición 71 Composite Aggregation public class Segment { Segment List ends; Color color; Color: Color Segment(Color c, int x1, int y1, int x2, int y2) { this.color = c; Point p1 = new Point(x1, y1); Point p2 = new Point(x2, y2); this.ends = new List(); this.ends.add( p1 ); 0..1 this.ends.add( p2 ); } ends } 2 Point public class Point { x: Integer int x; y: Integer int y; } Composición 72 Composite Aggregation Circle 0..1 Point center: Point 1 3 x: Integer y: Integer Triangle 2 0..1 vertices: Point Segment 0..1 {xor} ends: Point Las instancias de punto de las diferentes figuras son distintas. Cada punto pertenece, como mucho, a una figura. Composición 73 Composite Aggregation 0..1 Student 1 {xor} Address 1 0..1 Department Colecciones 74 Orden y repetición en las asociaciones Orden Repetición * *{set} enrolment Student Subject (es el tipo por defecto) 1 *{ordered} vertices Polygon Point * *{bag} visited Guest Hotel * *{sequence} songs PlayList Song Clase de control del sistema 75 System controller / Façade controller BookApp BookApp Clase de control del sistema 76 System controller / Façade controller BookApp 1 * 1 * Customer Order 1 1 * 1 * Reservation OrderItem * 1 * Book * 1 Conceptos independientes y dependientes Clase de asociación 77 selectedOption? Student Exercise * * question: String name: String options: String … … Answer selectedOption: Natural Clase de asociación 78 selectedOption? Student Exercise name: String * * question: String … options: String … Answer selectedOption: Natural public class Exercise { public class Student { String question; String name; String[] options; … … } } public class Answer { Student student; Exercise exercise; int selectedOption; } Clase de asociación 79 * * Student Exercise Answer selectedOption ≠ 1 * Answer * 1 Student Exercise selectedOption Clase de asociación 80 1 * Reservation * 1 User Book * * User Book Reservation * {bag} * reservedBooks User Book Reservation Clase de asociación 81 1 * OrderItem * 1 Order Product Amount * * Order Product OrderItem Amount * * {bag} selectedProducts Order Product OrderItem Amount Clase de asociación 82 * * Company ComunityManager * 1 Contract PrivacyPolicy Clases de especificación 83 Copy Book * 1 +isbn +copynumber +title specification +state +year Históricos 84 Person Company * 0..1 job Person Company * 0..1 currentJob * {sequence} * formerJobs Clases modales 85 Order OrderState +state: OrderState = Ongoing Ongoing Concluded Paid Clases modales 86 Baja cohesión Invoice InvoiceState + dueDate:Date New + dueMoney:Money Paid + paymentDate: Date + paidValue: Money + state: InvoiceSate Pérdida de cohesión Clases modales 87 Fuerte cohesión, bajo acoplamiento Invoice + dueDate:Date InvoiceState + dueMoney:Money New + state: InvoiceState Paid 1 0..1 Payment +date: Date +paidValue: Money Clases modales 88 Fuerte cohesión, bajo acoplamiento public class Invoice { Invoice public Date dueDate; + dueDate:Date public Money dueMoney; + dueMoney:Money public InvoiceState state; +/state: InvoiceState public Payment payment; Invoice(Date d, Money m) { this.state = New; 1 this.payment = null; } 0..1 public void pay(Date d, Money p) { Payment this.payment = new Payment(d, p); +date: Date this.state = Paid; +paidValue: Money } } public class Payment { public Date date; public Money paidValue; enum InvoiceState { New, Paid } } Caso práctico 89 SubscriptionApp SubscriptionManager … + subscribe() 1 1 * * 1 * * 1 Customer Subscription Magazine Caso práctico 90 class SubscriptionManager public class SubscriptionManager { private final List customers; private final List magazines; public SubscriptionManager(){ customers = new ArrayList(); magazines = new ArrayList(); } public void addCustomer (…) { … } public void addMagazine (…) { … } public void subscribe(Customer customer, Magazine magazine) { Subscription subscription = new Subscription(customer, magazine); customer.addSubscription(subscription); magazine.addSubscription (subscription); } … } Caso práctico 91 class Main (opción 1) public class Main { public static void init(SubscriptionManager subscriptionManager) { //Crear cliente subscriptionManager.addCustomer(…); // Crear revista subscriptionManager.addMagazine(…); } public static void main(String[] args) { SubscriptionManager subscriptionManager = new SubscriptionManager(); init(subscriptionManager); //Suscribir al primer cliente a la primera revista subscriptionManager.subscribe(subscriptionManager.getCustomer(0), subscriptionManager.getMagazine(0)); //Obtener el título de la primera revista a la que se suscribió el primer cliente subscriptionManager.getCustomer(0).getSubscription(0).getMagazine().getTitle(); //Obtener el nombre del primer cliente que se suscribió a la primera revista subscriptionManager.getMagazine(0).getSubscription(0).getCustomer().getName(); } } Caso práctico 92 class Main (opción 2) public class Main { public static void init(SubscriptionManager subscriptionManager) { //Crear cliente subscriptionManager.addCustomer(…); // Crear revista subscriptionManager.addMagazine(…); } public static void main(String[] args) { SubscriptionManager subscriptionManager = new SubscriptionManager(); init(subscriptionManager); //Suscribir al primer cliente a la primera revista subscriptionManager.subscribe(subscriptionManager.getCustomers().get(0), subscriptionManager.getMagazines().get(0)); //Obtener el título de la primera revista a la que se suscribió el primer cliente subscriptionManager.getCustomers().get(0).getSubscriptions().get(0).getMagazine().getTitle(); //Obtener el nombre del primer cliente que se suscribió a la primera revista subscriptionManager.getMagazines().get(0).getSubscriptions().get(0).getCustomer().getName(); } } Proceso de modelado conceptual 93 1. Analizar la información sobre el dominio del problema (glosario) y los requisitos. 2. Identificar posibles clases (entidades) y atributos (propiedades). 3. Identificar posibles asociaciones (relaciones) entre las entidades. 4. Construir incrementalmente el modelo conceptual e identificar las multiplicidades de las asociaciones. 5. Identificar clasificaciones entre entidades con propiedades (atributos y/o asociaciones) comunes. 6. Identificar agregaciones y composiciones entre entidades. 7. Añadir las restricciones que no puedan expresarse gráficamente. Bibliografía 94 OMG Unified Modeling Language Specification (Version 2.5.1) https://www.omg.org/spec/UML/2.5.1/. OMG, December 2017 El Lenguaje Unificado de Modelado. Manual de Referencia / Unified Modeling Languge Reference Manual, 2nd Edition James Rumbaugh, Ivar Jacobson y Grady Booch. Addison Wesley, 2004 Object-Oriented Analysis and Design for Information Systems. Modeling with UML, OCL and FML Raul Sidnei Wazlawick. Morgan Kaufmann (ed.), 2014 UML Distilled: A Brief Guide to the Standard Object Modeling Language, 3rd Edition Martin Fowler. Addison Wesley Professional, 2003 UMLTM Bible Tom Pender. John Wiley & Sons 2003