class: center, middle, inverse # Diagrama de classes (o estàtic) ### Model de domini .footnote[Mateu Yábar Valles] --- # Diagrama estàtic o de classes - Descriu les classes els atributs i les operacions. - Descriu les seves associacions i relacions amb altres classes. - associació - agregació - dependència - herència - Indica la multiplicitat en les relacions i la seva navegació --- # Classe És un abstracció sobre una col·lecció d’objectes amb la mateixa estructura, comportament i relacions.
classDiagram class NomDeLaClasse{ +int atributPublic -String atributPrivate #bool atributProtected ~bool aributPackageInternal +funcioDeLaClassePublic(atribut) bool -funcioDeLaClassePrivat(atribut) int }
- Damunt del nom de la classe hi podem indicar el tipus: interface, enum, abstract... --- # Relacions Les relacions són les connexions lògiques entre els objectes del diagrama. - Tipus de relacions: - Dependència - Associació - Agregació - Composició - Herència --- # Associació - Una associació és una relació entre classes, que estableix connexions amb un cert significat entre les instàncies respectives. - És una línia contínua entre les dues classes associades, i pot incloure un nom d'associació, noms de rol i multiplicitats.
classDiagram direction LR class Person{ +String name +String dni +String birthday +String address } class Magazine{ +String name +Double price +Date endSubscription } Person "0..*" -- "0..*" Magazine : subscribes
--- # Associació ``` class Person(var name: String, var dni: String, var birthDay: String, var address: String){ var subscriptions = mutableListOf
() } class Magazine (var name:String, var price:Double, var endSubscription : Date){ var subscriptors = mutableListOf
() } ``` --- # Associació recursiva - La relació s'estableix amb la pròpia classe
classDiagram direction LR class Modul{ +String name +Int number +Int hours } Modul "*" -- "*" Modul : requirement
``` class Modul(var name:String, var number: Int, var hours: Int){ var isRequirementOf = mutableListOf
() var requirements = mutableListOf
() } ``` --- # Multiplicitat i rols Representada per uns valors [min….max], indica el nombre màxim d’enllaços possibles que es podran donar en una relació. Aquesta multiplicitat no podrà ser mai negativa - __N__ o __*__ representa sense número màxim. - Els extrems d'una associació es poden anomenar amb el seu rol
classDiagram direction LR class Teacher{ +String name +String dni +String birthday } class Department{ +String name } Teacher "1" -- "0..1" Department : head Teacher "1..*" -- "1" Department : works
--- # Relació d’agregació - És una associació que representa el lligam entre una entitat i les seves ”parts” - L'agregació pot tenir lloc quan la classe és una col·lecció o un contenidor d'altres classes, la classe filla (continguda) pot existir independentment del pare.
classDiagram direction LR class Book{ +String title +String author } class Shelf{ +int position +int size } Shelf "1" o-- "*" Book : stores
--- # Agregació codi ``` class Shelf( var position: Int, var size : Int){ var booksStored = mutableListOf
() } class Book (var title: String ,var author: String){ var stored :Shelf? = null } ``` --- # Relació de composició - Un cas més fort d’agregació on les classes dependents no tenen sentit sense la classe pare - Si el contenidor es destrueix, totes les instàncies que estaven contingudes en el contenidor també es destrueixen. ![diagram](https://mermaid.ink/svg/pako:eNplULsOwjAM_BXLI9CBNTNsICFYs1ixSyM1DkrdoUL8O1FbBsDT-XR3fjwxZBZ0GHoahkOke6HkFWpxLBIsZoXTdWFmDVykDFmfCwWwvVmJegelJL8ca_T6-jLTlETtLNZl_ssIVHg2LDPA494jbJqmok1FX24Hj6XFHSYpiSLXO-ZMj9ZJXQddhSwtjb15rMlVOj6YTI4cLRd0LfWD7JBGy7dJAzoro3xE6ztW1esNoT1j3A) --- # Composició - codi ``` class Person(var name: String, var dni: String) { var paymentMethod: PaymentMethod? = null } class PaymentMethod(var card: String) {} ``` --- # Generalització - Especialització - És una relació d'__herència__ entre dues classes, una de les quals és superclasse de l'altra (subclasse). - La subclasse és considerada una forma "d'__especialització__", subtipus, de la superclasse i la superclasse una "__generalització__", supertipus, de la subclasse. - Una instància de la subclasse és també una instància de la superclasse. --- # Generalització - Especialització ![diagram](https://mermaid.ink/svg/pako:eNpdkDFuwzAMRa9CcE1yASNLg3Yv4IxeCJFJBMhUQVGDkeTuVW0HKcyJ-Hj8_OQdQ2bBDkOiUj4jXY3GQaEVR5PgMSucT4syM_AtVrLeFwlg17tFvYLSKFuNNQ76_D_ce2VRf0-fck5CCrF8cE2-wc9C4Sb2xqM6FEpk00wuWQCOj8Ph5b1RVwvc4yg2UuR27Ow3oN-kZcautSwX-luPzbah9YfJ5YujZ8PuQqnIHql67icN2LlVeUHrz1bq-Qvrz3CF) --- # Generalització - especificació ``` open class Person(var name: String, var dni: String) {} class Student(name: String, dni: String, var birthDay: Date) : Person(name, dni) { val isAdult: Boolean get() { TODO() } } class Teacher(name: String, dni: String, var salary: Double) : Person(name, dni) {} ``` --- # Realització (implementa interfície) ![diagram](https://mermaid.ink/svg/pako:eNpdj7sOwjAMRX_F8gRS1Q-ImMpjRoIxi5W4ECkPlMdQlf47oSkLnuyjo2vdGVXQjAKVpZROhh6RnPRQR5vIKpvg4T40sjpwJH-x09wQwGin3V765Xs3Jn1TAA7vvofBRP2HrpY8Y4eOoyOj6_s1TmJ-smOJoq6aRyo2S6zZVS0vTZnP2uQQUYxkE3dIJYfb5BWKHAv_pK3FZi0fShpKcQ) --- # Bibliografia i material de consulta - http://ioc.xtec.cat/materials/FP/Materials/2252_DAM/DAM_2252_M05/web/html/index.html - https://www.youtube.com/watch?v=JioEGJIlg88 - https://www.youtube.com/watch?v=Z0yLerU0g-Q