UML

Sven-Olof Nyström
OOP med Java sommaren 10
Informationsteknologi
Uppsala Universitet

Skansholm: Kapitel 4

Litteratur

Skansholm: Kapitel 4

Se även

UML—Unified Modelling Language

UML är inte ett programspråk utan en samling notationer för att beskriva olika aspekter av program och de uppgifter vi vill lösa.

UML konstruerades av Grady Booch, Ivar Jacobson och James Rumbaugh. (Utgångspunkten var de system som tidigare föreslagits av de tre författarna.)

Man kan se UML som ett försök att strama upp informella konstruktionsskisser. Det liknar mera en verktygslåda än ett verktyg.

UML är stort. Vi har (om jag räknar rätt) 13 typer av diagram. Systemet beskrivs i ett antal läroböcker och manualer. (Wikipediaartikeln för UML har ett diagram över de olika typerna av diagram i UML.)

Vi kommer att titta på diagram för klasstrukturer och användningsfall (use cases).

UML

Några exempel på olika typer av diagram i UML (som jag inte tar upp).

Use cases

Här kom den svenska termen först: användningsfall.

Begreppet uppfannas av Ivar Jacobson 1986. Idén var att beskriva systemkrav i termer av systemets önskade interaktion.

Det är lätt att se flera poänger med den här idén. Vi uttrycker problemet i termer som är förståeliga för kunden, men tillräckligt konkreta för att fungera som guide vid utveckling. Dessutom kan de testas.

Use case, exempel: i affären, huvudscenario

Enstaka användningsfall presenteras ofta i textform, utan någon särskild notation. Till exempel:

  1. Kunden kommer till kassan med varor
  2. Kassören startar en ny försäljning
  3. Kassören för in en ny vara

    (kassören repeterar detta steg så länge det finns varor)

  4. Kassören talar om totalsumman för kunden
  5. Kunden betalar
  6. Systemet skriver ett kvitto

Exempel: variationer

Vi kan tänka oss många variationer av scenariot ovan, till exempel:

Ett användningsfallsdiagram (nätbutik)

Ett use-case diagram visar olika användningsfall (ritas som ovaler) och hur de relaterar till aktörer (ritas som streckgubbar).

Exempel 1:

I detta fall har vi tre aktörer; kund, betalningsprocessor samt customer support.

Exempel 2:

Student:

Om ett användningsfall inkluderar med ett annat uttrycks detta med en pil mellan användningsfall, i detta fall måste poängtalet kontrolleras vid ansökan om slutbetyg.

Klassdiagram

är en formalisering av de diagram som vi alla spontant ritar när vi vill resonera om klasser och samband mellan dem, tex att en klass ärver av en annan.

Huvudanvändningar

En klass

Ofta utelämnas attribut och metoder för att spara plats eller för att göra modellen tydligare. Å andra sidan definierar UML notation för att beskriva klassens attribut och i ännu större detalj.

Generalisering

(I Java: Att en klass ärver en annan, att den ärvande klassen på nåt sätt är mera specifik)

Association

Noll eller flera böcker associerade till ett visst bibliotek

Associationen kan tillåta både

Ettan vid klassen Bibliotek betyder att varje bok tillhör exakt ett bibliotek. Vid klassen Bok skriver vi 0..* för att tala om att ett biblitek har noll eller fler böcker.

Mera komplext exempel

Låt oss betrakta ett mera komplext exempel:

Förklaring:

Ett fordon är antingen en bil eller en cykel.

Varje cykel har en associerad person (cyklisten).

Pilen anger att vi kan gå från cykel till cyklist, men ej tvärtom.

Den svarta pilen vid "äger" anger hur associationen ska läsas. I detta fall har vi alltså två namn på relationen.

Samband mellan klasser

"Två klasser har nåt att göra med varandra"

Klassen Almanacka använder klassen Datum.

Multirelationer

Om inget annat anges är en association (relation) många till många. Bra eller dåligt?

Det kanske är en bra idé att utgå från den mest generella relationen och föra in information om riktning och multiplicitet när vi lär oss mer om problemställningen.

Det visar sig ofta att man vill öka multiplicitet (att en person kan ha flera telefonnummer eller adresser, tex).

Det visar sig ofta att man vill kunna gå åt båda hållen.

Implementera unika relationer

Varje cykel tillhör en unik ägare.

class Cykel {
    private Person ägare;
    public Cykel(Person ägare) {
        this.ägare = ägare;
        ...
    }
    ...
}

Enkla relationer

Exempel: "Alla personer har noll eller en cykel, Varje cykel tillhör en unik ägare."

Ett sätt att se till att relationen alltid har önskad form.

class Person {
    private Cykel cykel;

    public void nyCykel (Cykel c) {
        if (cykel != null) {
            "felmeddelande";
        }
        else {
            cykel = c;
        }
    }
    ...
}

class Cykel {
    private Person ägare;
    public Cykel(Person ägare) {
        this.ägare = ägare;
        ägare.nyCykel(this);
        ...
    }
    ...
}

Klassen Person definierar en metod nyCykel(). Varje gång en cykel skapas anropas metoden. Notera att med denna lösning finns det inte nåt sätt att ta bort cyklar ur systemet.

Multirelationer

Med collection classes är det enkelt att implementera en relation med godtycklig multiplicitet.

class Person {
    private Set<Cykel> cyklar = new HashSet<Cykel>();

    public void nyCykel (Cykel c) {
        cyklar.add(c);
    }
    ...
}