# Klassen Diagramme

https://www.hanser-elibrary.com/doi/epdf/10.3139/9783446431973

- Klassen werden als Boxen dargestellt mit
    - Name
    - Attribute
    - Methoden

### Aufbau Klassen-Diagramm
#### 1. Bereich: Name der Klasse
- beginnt mit Großbuchstaben
- ist ein Nomen
- sollte die Klasse beschreiben
#### 2. Bereich: Attribute der Klasse
Es gibt zwei Arten die Attribute darzustellen
- Inline, dabei muss angegeben werden:
    - [Sichtbarkeit](UMLKlassenDiagramme.md#sichtbarkeit-von-attributen-methoden)
    - Name
    - Typ (primitiv / komplex)
- Durch [Assoziation](UMLKlassenDiagramme.md#association)
    - bspw.: entries ![image_96.png](image_96.png)
#### 3. Bereich: Methoden der Klasse
- Haben 4 Elemente:
    - [Sichtbarkeit](UMLKlassenDiagramme.md#sichtbarkeit-von-attributen-methoden)
    - Name
    - ggf Parameter
    - Rückgabewert
- Bspw.: ```+ addEntry(int number, string description): void```

### Sichtbarkeit von Attributen / Methoden
- **Public (+)**
    - Jedes Objekt anderer Klassen kann zugreifen
- **Protected (#)**
    - Jedes Objekt der Klasse und der Unterklassen kann darauf zugreifen
- **Package (~)**
    - Jedes Objekt, deren Klasse im selben Package ist, kann darauf zugreifen
- **Private (-)**
- Nur das Objekt selbst kann darauf zugreifen

### Beispiel Klassen Diagramme:
- 3 Klassen (Student, Course, LectureHall)
- Student kann keine bis n Lectures beitreten
- Courses können in keine bis einer LectureHall stattfinden
- Student hat einen first name, last name, date of birth...
- etc.

![image_87.png](image_87.png)


### Erstellung eines Klassen-Diagramms
1. Identifizierung der Klassen
    - ![image_107.png](image_107.png)
2. Identifizierung der Attribute
    - ![image_108.png](image_108.png)
3. Identifizierung von Generalisierungen
    - ![image_109.png](image_109.png)
4. Identifizierung von Assoziationen und Aggregationen
    - ![image_110.png](image_110.png)

_Entstandenes UML-Diagramm ist nicht einzig korrektes!_

## Objekt Diagramme
### Beispiel Objekt Diagramme:
- 4 Instanzen / Objekte vom Typ Student (Helen, Mike, Paul)
- Helen ist im Kurs oom und iprog
- Der Kurs db ist in der LectureHall lh2
- ![image_88.png](image_88.png)

## Relationship Overview
Klassen arbeiten zusammen über verschiedene Arten von Relationships

- Relationships werden als Linie zwischen den Boxen dargestellt mit
    - Name
    - Leserichtung
    - Multiplizität
        - Sind als Intervall dargestellt _[Min..Max]_
            - Falls es kein Limit gibt: *
            - Falls Min = Max: nur eins hinschreiben
        - Bsp.:
            - ```[0..1]```: Attribut hat 0 - 1 Wert
            - ```[5]```: Attribut hat genau 5 Werte
            - ```[*]```: Attribut hat 0 bis unendlich Werte
            - ```[3..*]```: Attribut hat 3 bis unendlich Werte

### Association
Wenn ein Objekt einer Klasse mit Objekten einer anderen Klasse arbeitet

![image_89.png](image_89.png)
- schwächstes Relationship
    - Kommunikationspartner können auf Attribute und Methoden des Anderen zugreifen
- Bsp.:
    - ![image_98.png](image_98.png)

#### Navigatability
- **x**: Darauf ist nicht zugreifbar
- **>**: Darauf kann zugegriffen werden
- nix: undefined


### Aggregation
Wenn eine Klasse eine Referenz zu Objekten einer anderen Klasse besitzt und teilt

![image_90.png](image_90.png)

- Objekte existieren auch unabhängig
- Es können auch [mehrere Objekte](UMLKlassenDiagramme.md#relationship-overview) in einer Aggregation verbunden werden

### Composition
Wenn eine Klasse Objekte einer anderen Klasse enthält

![image_91.png](image_91.png)

- Nur maximal eine Instanz
- Objekt kann nicht allein existieren

### Generalization (Inheritance)
Wenn eine Klasse ein Typ einer anderen Klasse ist

![image_92.png](image_92.png)


## Erstellung von Klassen
### Appropriate Level of detail
Detail der Zeichnung sollte abhängig vom [SDLC](IntroductionOOAD.md#software-development-lifecycle-sdlc) sein.
1. keine Details (erste Analyse für die ersten Diskussionen des Domänen-Konzepts)
    - ![image_93.png](image_93.png)
2. mehr Details (während späterer Analysen)
    - ![image_94.png](image_94.png)
3. sehr detaillierte Beschreibung (detaillierte Analyse oder während Implementierung)
    - ![image_95.png](image_95.png)

## N-Ary Association
- Relationship zwischen mehr als zwei Klassen
    - Wird durch hohle Raute in der Mitte der Klassen dargestellt
        - bspw.: ![image_99.png](image_99.png)

### Implementierung in Code von N-Ary Association
- nicht existent in Standard-Programmiersprachen

#### Using Two Binary Associations
![image_100.png](image_100.png)

#### Using additional Class
![image_101.png](image_101.png)

## Association Class
### Introduction Association Class
Erlaubt [N-Ary Associations](UMLKlassenDiagramme.md#n-ary-association)

### Possible Implementations of Association Classes
![image_102.png](image_102.png) ![image_103.png](image_103.png)


## Abstract Class
![image_104.png](image_104.png)

- nur im Kontext von Generalisierungsbeziehungen sinnvoll

## Interface
![image_106.png](image_106.png)