En el món de l'enginyeria de programari un diagrama de classes en UML (Unified Modeling Lenguage) és un tipus de diagrama estàtic que descriu l'estructura d'un sistema mostrant les seves classes, atributs i les relacions entre ells. Els diagrames de classes són utilitzats durant el procés d'anàlisi i disseny dels sistemes, a on es crea el disseny conceptual de la informació que utilitzarà el sistema, i els components que s'encarregaran del seu funcionament i de la relació entre l'un i l'altre.

Introducció El diagrama de classes és el bloc principal del modelatge orientat a objectes. Es fa servir tant per la traducció de models detallats a codi de programació com pel modelat conceptual general de la sistemàtica de l'aplicació. També es poden usar en el modelatge de dades. Les classes i les interaccions entre elles són els objectes més importants que s'han de representar en un diagrama de classes.

miniatura|esquerra|Una classe A amb les seves tres parts. Al diagrama, les diferents classes es representen amb una caixa dividida en tres parts: A dalt en negreta i centrat hi tenim el nom de la classe. La part del mig conté els atributs de la classe. Es representa de manera que primer posem el nom de la variable seguit del seu tipus, (p. ex.: nom : String). A la part baixa hi tenim els mètodes o operacions (públics, protegits o privats) que la classe pot implementar o usar.

En el disseny d'un sistema, el nombre de classes s'identifica i s'agrupa en un diagrama de classes que ajuda a determinar les relacions estàtiques que hi ha entre els objectes. Les classes sovint són separades amb subclasses per fer un disseny conceptual més detallat.

Amb l'objectiu de descriure més detalladament el comportament dels sistemes, aquests diagrames de classes es poden complementar amb un diagrama d'estats o una màquina d'estats d'UML.Scott W. Ambler (2009) UML 2 Class Diagrams. Webdoc 2003-2009. Accessed Dec 2, 2009

Parts UML proporciona mecanismes per representar les parts d'una classe, tals com els atributs i els mètodes i informació addicional sobre aquests.

Visibilitat Per especificar les visibilitat de la part d'una classe (per exemple qualsevol atribut o mètode) aquestes són les anotacions que s'han de posar just abans del nom:

+ Pública - Privada # Protegida / Derivada (es pot combinar amb una de les altres) ~ Paquet La visibilitat pública permet que qualsevol objecte d'aquesta classe pugui accedir al mètode o atribut. La visibilitat privada limita l'accés al mètode o l'atribut de manera que només hi pugui accedir l'objecte de la mateixa classe. La visibilitat protegida permet que només accedeixi a l'atribut o mètode l'objecte de la mateixa classe i algun objecte d'una classe que hereti a partir d'aquesta. Les classes es poden organitzar en paquets. Això s'acostuma a utilitzar quan tenim un conjunt de classes relacionades entre elles. Totes les classes no incloses explícitament en cap paquet i que estan situades en un mateix directori es consideren d'un mateix paquet.

Camps L'UML proporciona dos tipus de camps per les nostres parts: instància i classificador.OMG Unified Modeling Language (OMG UML) Superstructure, Version 2.3: May 2010. Retrieved 23 September 2010. Les parts classificadores són conegudes comunament com a estàtiques en diversos llenguatges de programació. El camp és la classe en si mateixa. Els valors dels atributs són iguals per a totes les instàncies La crida del mètode no afecta l'estat de la instància. Les parts instància són camps per a instàncies específiques. El valors dels atributs pot variar entre instàncies. La crida del mètode pot afectar l'estat de la instància. Per indicar un camp classificador per una part subratllem el nom. En canvi, les parts instància, s'assumeixen per defecte.

Relacions Les relacions són el terme general que cobreix els diferents tipus de connexions lògiques entre els objectes del diagrama. En UML podem veure les següents relacions:

Enllaços externs Els enllaços són les relacions bàsiques entre dos objectes. En UML es representen amb línes rectes entre els objectes.

Associació miniatura|Diagrama de clases amb un exemple d'associació entre dues classes

El diagrama de classes és un exemple d'associació entre dues classes. Una associació presenta un grup d'enllaços. Les associacions binàries solen ser representades com una línia. Una associació pot tenir qualsevol nombre d'enllaços cap a una classe. Si hi ha 3 enllaços llavors la podem denominar associació ternària. Una associació pot ser anomenada: als seus extrems es poden etiquetar amb els noms en funció del seu rol, indicadors de propietat, multiplicitat, visibilitat i altres propietats.

Hi ha quatre tipus diferents d'associacions: Bidireccional Unidireccional Agregació (incloent-hi composició d'agregacions) Reflexives

Les dues primeres són les més comunes. Per exemple: una classe vol es relacionaria amb la classe avió bidireccionalment. L'associació representa la relació estàtica entre els objectes de les classes. Per exemple: "El departament ofereix cursos", és una relació d'associació.

Agregació miniatura|Diagrama de clase d'exemple amb Agregació entre dues classes

El diagrama de classes mostra l'agregació entre dues classes. L'agregació és una variant dels objectes que tenen una relació d'associació; l'agregació és més específica que l'associació. És una associació que representa una part de la relació o la seva totalitat. Com a tipus d'associació, l'agregació pot ser anomenada i tenir les mateixes etiquetes que l'associació. Tot i això, l'agregació no pot incloure més de dues classes, per tant ha de ser una associació binaria.

L'agregació pot tenir lloc quan la classe és una col·lecció o un contenidor d'altres classes, però quan una classe continguda no té un cicle de vida fortament lligat amb la classe contenidora, si el contenidor és destruït el seu contingut no. A l'UML es representa gràficament com un rombe buit al costat de la classe contenidora en la línia que uneix les dues classes (contenidora i continguda). L'agregat és semànticament un objecte estès que es tracta com una unitat en moltes operacions, encara que físicament està fet de diversos objectes menors.

Composició La composició és una relació més forta que la relació d'associació i també és més específica que l'associació. La composició normalment té una dependència més forta del ‘’cicle de vida’’ entre les instàncies de la classe contenidor i de les instàncies de les classes contingudes: Si el contenidor es destrueix, totes les instàncies que estaven contingudes en el contenidor també es destrueixen. Cal veure que, quan es pugui, una part es pot eliminar del contenidor abans que el contenidor s'elimini i llavors no seria eliminada com a part del contenidor. La representació gràfica en UML de la composició és un rombe opac al costat de la classe contenidora en la línia que uneix la classe contenidora i la continguda.

Diferències entre composició i agregació Quan intentem representar relacions senceres reals; per exemple: un engranatge és una part d'un cotxe, llavors una relació de composició és més apropiada. En canvi, quan es representa un software o una relació en una base de dades; per exemple: L'engranatge amb el model ‘’ENG01’’ és una part del cotxe amb el model CM01, el millor és utilitzar una relació d'agregació, ja que l'engranatge ENG01 també podria ser part d'un altre cotxe a part del cotxe amb model ‘’CM01’’. És per això que sovint la relació d'agregació s'anomena contenidor “catàleg” per diferenciar-la dels contenidors “físics” de les composicions.

Definicions Propietats també anomenades atributs o característiques, són valors que corresponen a un objecte. És la informació que ens detallada com és l'objecte. Per exemple, si tractem un objecte cotxe, podem tenir com atributs la marca, el model, el color, els quilòmetres, etc.

Operacions habitualment anomenades mètodes, són aquelles activitats que es poden realitzar amb o a sobre aquest objecte de manera que realitzi alguna acció o es modifiqui algun dels seus atributs. De la mateixa manera que el nom d'un atribut, el nom d'una operació s'escriu amb minúscules si consta d'una sola paraula. Si el nom conté més d'una paraula, cada paraula serà unida a l'anterior i començarà amb una lletra majúscula, a excepció de la primera paraula que començarà en minúscula. Per exemple: afegirKm(), canviarMotor().

Interfície és un tipus abstracte que només declara les operacions que ha d'implementar la classe. Aquest tipus de classe només contindrà la signatura d'aquests mètodes i no podrà tenir cap implementació. Defineix els requeriments mínims de l'objecte. Fa referència a polimorfisme.

Herència es defineix com la reutilització d'un objecte pare ja definit per poder estendre la funcionalitat en un objecte fill. Els objectes fills hereten totes les operacions i/o propietats d'un objecte pare. Per exemple: Una persona pot especialitzar-se en Proveïdors, Creditors, Clients, Accionistes, Empleats; tots comparteixen dades bàsiques com una persona, però a més cadascun tindrà informació addicional que depèn del tipus de persona, com a saldo del client, total d'inversió de l'accionista, salari de l'empleat, etc.

En dissenyar una classe s'ha de pensar en com es pot identificar un objecte real, com una persona, un transport, un document o un paquet. Aquests exemples de classes d'objectes reals, és sobre el que un sistema es dissenya. Durant el procés del disseny de les classes es prenen les propietats que identifiquen com a únic a l'objecte i altres propietats addicionals com a dades que corresponen a l'objecte. Amb els següents exemples es defineixen tres objectes que s'inclouen en un diagrama de classes:

Exemple 1: Una persona té nombre de document d'identificació, noms, cognoms, data de naixement, gènere, adreça postal, possiblement també tingui número de telèfon de casa, del mòbil, FAX i correu electrònic.

Exemple 2: Un sistema informàtic pot permetre administrar el compte bancari d'una persona, per la qual cosa tindrà un número de compte, nombre d'identificació del propietari del compte, saldo actual, moneda en la qual es maneja el compte.

Exemple 3: Un altre objecte pot ser "Maneig de Compte", on les operacions bancàries d'un compte (com en l'exemple 2) es manejaran realitzant diferents operacions que en el diagrama de classes només es representen com a operacions, que poden ser:

Obrir Tancar Dipòsit Retirar Acreditar Interessos

Aquests exemples constitueixen diferents classes d'objectes que tenen propietats i/o operacions que contenen un context i un domini, els primers dos exemples són classes de dades i el tercer classe de lògica de negoci, depenent de qui dissenyi el sistema es poden unir les dades amb les operacions.

El diagrama de classes inclou molta més informació com la relació entre un objecte i un altre, l'herència de propietats d'un altre objecte, conjunts d'operacions/propietats que són implementades per a una interfície.

Tipus especials de classes miniatura|Representació d'una classe abstracta en UML. Classe abstracta Una classe abstracta és una classe de la qual no se'n poden instanciar directament objectes. Per tant, els objectes lligats a una classe abstracta s'han de crear necessàriament en alguna de les seves subclasses (especialització / generalització).

REPRESENTACIÓ UML: una classe abstracta s'acostuma a posar en itàliques (cursiva). miniatura|538x538px|Esquerra: Classe Associació Propietari. Dreta: Equivalència de la Classe Associació Propietari a través de dues associacions i una classe. Classe associació Una classe associació és una associació que té el mateix comportament que una classe. L'associació i la classe associació representen un sol element del model i, per tant, els noms de l'associació i de la classe associació han de coincidir.