# Diagrama d'estats

Un diagrama d'estats és un tipus de diagrama utilitzat en informàtica i àrees similars per descriure el comportament de sistemes. Els diagrames d'estat requereixen que el sistema descrit estigui compost d'un nombre finit d'estats; de vegades per a la seva creació cal una capacitat d'abstracció notable. Hi ha moltes formes de diagrames d'estat, que difereixen lleugerament i tenen una semàntica diferent.
Quant a la representació, un diagrama d'estats és un gràfic que els nodes del qual són estats i els arcs dirigits del qual són transicions etiquetades amb els noms dels esdeveniments. Un estat es representa com una caixa arrodonida amb el nom de l'estat en el seu interior. Una transició es representa com una fletxa des de l'estat origen a l'estat destí. La caixa d'un estat pot tenir 1 o 2 compartiments. Al primer compartiment apareix el nom de l'estat. El segon compartiment és opcional, i en ell poden aparèixer accions d'entrada, de sortida i accions internes.
En UML, un diagrama d'estats és un diagrama utilitzat per identificar cadascuna de les rutes o camins que prendrà un flux d'informació després d'efectuar-se cada procés. Permet identificar sota quins arguments s'executen cadascun dels processos i en quin moment podran tenir una variació. El diagrama d'estats permet visualitzar d'una forma seqüencial l'execució de cadascun dels processos.
Els diagrames d'estat s'utilitzen per donar una descripció abstracta del comportament d'un sistema. Aquest comportament és analitzat i representat en una sèrie d'esdeveniments, que podrien passar en un o més estats possibles. Normalment cada diagrama representa en general els objectes d'una sola classe i realitza un seguiment dels diferents estats dels objectes a través del sistema.
Els diagrames d'estat es poden utilitzar per representar gràficament les màquines d'estats finits, aquest camp fou presentat per Taylor Booth en el seu llibre de 1967 "Màquines seqüencials i teoria d'autòmats". Una altra representació possible és la taula de transició d'estats.

## Graf dirigit

Una manera clàssica d'un diagrama d'estats per a una màquina d'estats finits és un graf dirigit amb els següents elements:
* Estats Q : un conjunt finit de vèrtexs representats normalment per cercles i etiquetats amb símbols designadors únics o paraules escrites dins d'ells (Booth (1967) p. 69, Hopcroft i Ullman (1979) p. 16, Sipser (2006) p. 34).
* Símbols d'Entrada S : una col·lecció finita de "símbols" d'entrada o designadors S (Booth, Hopcroft i Ullman, Sipser). Per a una autòmat finit (AFD), màquina d'estats finits no determinista (AFN), màquina d'estats finits no determinista generalitzada (GNFA), o una Màquina de Moore, l'entrada està significada a cada aresta, normalment a prop de l'estat originador. Per a una Màquina de Mealy, l'entrada i la sortida estan significats sobre cada aresta normalment separats per una barra "/":
    Les etiquetes d'entrada/Mealy sobre cada aresta (fletxa): "1/0" designa que el símbol "1" va causar el símbol "0" com a sortida.
* Símbols de sortida Z : una col·lecció finita de "símbols" de sortida o designadors (Booth, Hopcroft i Ullman, Sipser). Per a una Màquina de Mealy, l'entrada i la sortida estan significats en cada aresta com es pot veure a continuació. Per a una Màquina de Moore la sortida de l'estat està escrita normalment dins del cercle de l'estat, separat del designador de l'estat amb una barra "/".
    Exemple: Si un estat té diverses sortides el diagrama ha de reflectir això: eg "q5/1,0" designa que l'estat q5 té sortides a = 1, b = 0. Aquest designador serà escrit dins del cercle de l'estat.
La "Funció de sortida?" representa el mapejat ? de símbols d'entrada R x estats Q en símbols de sortida Z (Booth).
* Arestes d : representa les "transicions" entre dos estats causats per l'entrada (identificats els seus símbols dibuixats en els "arestes"). Un 'aresta' està dibuixat normalment com una fletxa dirigida des de l'estat present en el següent estat. d representa el mapejat dels símbols d'entrada R x estats Q en els símbols de sortida Z (Booth, Hopcroft i Ullman, Sipser).
* Estat inicial qo : (no vist en els exemples anteriors). L'estat inicial qo està representat normalment per una "fletxa des de cap part" (cf. Sipser (2006) p. 34, Hopcroft i Ullman (1979) p. 16). En textos antics (per exemple Booth (1969), McCluskey (1965), Hill i Peterson (1974)) l'estat inicial no es mostrava i era inferit del text.
* Estat (s) d'Acceptació F : Si es fa servir - una col·lecció de cercles dobles usats per designar els estats d'acceptació (Hopcroft i Ullman, Sipser). De vegades la funció de el/estat/s d'acceptació s'entén com a estat/s " F inal/s" (cf. Hopcroft i Ullman (1979) Figure 2.15, p. 33).

### Exemples
#### Màquina de Mealy
## Quadre d'estats Harel

Els quadres d'estats (statecharts) Harel (desenvolupats en 1987 per David Harel) estan guanyant en ús ampli atès que una variant ha arribat a ser part del UML. El tipus de diagrama permet modelar superestat, diagrames d'estats concurrents i modelar les activitats com a part d'un estat.
Els diagrames d'estats clàssics són anomenats diagrames "or", ja que la màquina només pot estar en un estat o en un altre. Amb els quadres d'estats Harel és possible modelar màquines "and", on una màquina està en dos o més estats al mateix temps. Això és degut a la possibilitat de tenir superestat.

## Diagrama d'estats UML

El llenguatge unificat de modelat (UML) especifica una notació estandarditzada per diagrames d'estat que es pot utilitzar per descriure classes, sistemes, subsistemes o fins i tot processos de negoci. Els diagrames d'estat també mostren el conjunt d'estats pels quals passa un objecte, durant la seva vida en una aplicació en resposta a successos (per exemple, missatges rebuts, temps sobrepassat o errors), junt amb les seves respostes i accions. També il·lustren quins successos poden canviar l'estat dels objectes de la classe. Normalment contenen estats i transicions. Com els estats i les transicions inclouen a la vegada, successos, accions i activitats, anem a veure primer les seves definicions.
Un succés és un esdeveniment important a tenir en compte per al sistema. Un estat és la condició d'un objecte en un moment determinat: el temps que transcorre entre successos. Una transició és una relació entre dos estats, i indica que, quan ocorre un event, l'objecte passa de l'estat anterior al següent.
Igual que altres diagrames, en els diagrames d'estat poden aparèixer notes explicatives i restriccions.
Hi ha moltes formes de diagrames d'estats, cadascuna amb semàntica lleugerament diferent. La més popular que s'empra en les tècniques de Programació orientada a objectes (POO) es basa en la taula d'estats de David Harel (Vol 8). OMT va ser qui la va fer servir per primera vegada per als mètodes de Programació orientada a objectes (POO) i va ser adoptada per Grady Booch en la seva segona edició (1994).

## Alternatives semàntiques

Hi ha altres maneres de representar diagrames d'estat. Per exemple, existeixen eines per a la modelització i la lògica per al disseny de controladors encastats. Es combinen diagrames jeràrquics, gràfics de flux i taules de veritat en un sol llenguatge, donant lloc a un formalisme diferent.

## Diagrama d'estats vs diagrama de flux

Molt sovint es confonen els diagrames d'estat amb diagrames de flux.
Per exemple, una màquina d'estats realitza accions en resposta als esdeveniments explícits, per contra, el diagrama de flux no necessita esdeveniments explícits, sinó més aviat la transició d'un node a un altre, en la seva gràfica de forma automàtica al final de les activitats.
En un diagrama d'estat, el tractament s'associa als arcs (transicions), mentre que en un diagrama de flux, estan associats amb els vèrtexs.
La figura següent mostra una comparació d'un diagrama d'estat amb un diagrama de flux. Una màquina d'estat (figura (a)) realitza accions en resposta a esdeveniments explícits. En canvi, el diagrama de flux (figura (b)) no necessita esdeveniments explícits, sinó transicions d'un node a node en el seu gràfic automàticament en finalitzar les activitats.

## successos

Un succés és una ocurrència que pot causar la transició d'un estat a un altre d'un objecte. Aquesta ocurrència pot ser una:
* Condició que pren el valor de verdader (normalment descrita com una expressió booleana). És un EventCanvi.
* Recepció d'un senyal explícit d'un objecte a un altre. És un EventSenyal.
* Recepció d'una crida a una operació. És un Eventcrida.
* Pas de cert període, després d'entrar a l'estat actual, o de certa hora i data concretes. És un EventTemps.
El nombre d'un succés té dintre del paquet en el qual està definit i pot ser utilitzat en els diagrames d'estats per les classes que tenen visibilitat dintre del paquet. Un succés no és local a la classe on està declarat

## Accions

Una acció és una operació atòmica, que no es pot interrompre per un succés i que s'executa fins a la seva finalització. Una acció pot ser:
* una crida a una operació (a l'objecte al qual pertany el diagrama d'estats o també a un altre objecte visible),
* la creació o la destrucció de l'altre objecte o
* l'enviament d'un senyal a un objecte.

## Activitats

Quan un objecte està en un estat, generalment està esperant que succeeixi algun esdeveniment. Encara que, a vegades, volem modelar una activitat que s'està executant. És a dir, mentre un objecte està en un estat, dit objecte realitza un treball que continuarà fins que sigui interromput per un esdeveniment.
Llavors, una acció contrasta amb una activitat, ja que aquesta última pot ser interrompuda per altres esdeveniment.

## Estats

Quan un estat identifica una condició o una situació en la vida d'un objecte durant la qual satisfà alguna condició, executa alguna activitat o espera que succeeixi algun event. Un objecte es queda en un estat durant un temps finit (no instantani). A continuació es definiran els element bàsics de notació.

## Elements bàsics de notació que poden ser utilitzats per compondre un diagrama d'estats i altres

* Cercle ple, apuntant a un estat inicial
* Cercle buit que conté un cercle ple més petit a l'interior, indicant l'estat final (si existís)
* Rectangle arrodonit, denotant un estat. A la part superior del rectangle hi ha el nom de l'estat. Pot contenir una línia horitzontal a la meitat, sota de la qual s'indiquen les activitats que es fan a l'estat
* Fletxa, denotant transició. El nom de l'esdeveniment (si existís) que causa aquesta transició etiqueta el cos de la fletxa. Es pot afegir una expressió de Guarda, tancada en claudàtors () denotant que aquesta expressió ha de ser certa perquè la transició tingui lloc. Si es realitza una acció durant la transició, s'afegeix a l'etiqueta després de "/". NomDeEvent [ExpressióGuarda] /acció
* Línia horitzontal gruixuda amb x> 1 línies entrant i 1 línia sortint o 1 línia entrant ix> 1 línies sortint. Aquestes denoten Unió/Separació, respectivament.

## Altres extensions

Una extensió interessant és els arcs que es deriven de qualsevol nombre d'estats a qualsevol nombre d'estats. Això només té sentit si el sistema se li permet estar en diversos estats a la vegada, el que implica que un estat individual només descriu un estat o un altre aspecte parcial de la situació general i global. El formalisme resultant es coneix com una xarxa de Petri.
Una altra extensió permet la integració dels diagrames de flux dins de gràfics d'estat Harel. Aquesta extensió dona suport al desenvolupament de programari que és alhora per esdeveniments i fluxos de treball impulsats.

## Referències

* ↑ Samek, Miro. Newnes. Practical UML Statecharts in C/C++, Second Edition: Event-Driven Programming for Embedded Systems, 2008, p. 728. ISBN 978-0-7506-8706-5.

## Vegeu també

* Teoria de grafs
* Transductor d'estats finits

## Enllaços externs

* Introduction to UML 2 State Machine Diagrams by Scott W. Ambler
* UML 2 State Machine Diagram Guidelines by Scott W. Ambler