Ga naar hoofdinhoud

Voorbereiding

1. Introductievideo aggregates

📺 Bekijk deze video aan de hand van onderstaande kijkwijzer:

  • De eerste 4 delen van de video tot en met 2:21 is herhaling. Check voor jezelf je dat geen nieuwe dingen hoort.
  • Deel 5 "Domain Events" van 2:22 tot en met 2:50 behandelen we niet verder in deze cursus. De details hiervan hoef je niet te begrijpen of te kennen.
  • Deel 6 "Aggregates" van 2:51 tot en met 3:38 is het belangrijkste van de video. Zorg dat je dit stuk conceptueel begrijpt
  • Deel 7 van 3:39 tot einde gaat over Repositories. Een repository is te vergelijken met wat wij tot nu toe de Store hebben genoemd. Zie het info-blok hieronder om te zien hoe dit er in een sequentiediagram uitziet.

❓ Neem deze quiz om je kennis over Aggregates te toetsen.

info

Hieronder zie je hoe je de aggregate Car in een klassendiagram kan weergeven. Klap evt. de balk eronder open om de originele PlantUML code te bekijken of te kunnen kopieren of een automatisch gegenereerde tekst 'in natuurlijk taal' van het diagram te krijgen (in Beta) voor extra begrijpelijkheid of accessibility (A11y).

9f77308820b3d7225edc4e18f69b2e7e

PlantUML broncode voor "Voorbeeld klassendiagram"
@startuml
hide circle
skinparam linetype ortho

rectangle "Aggregate" {
class Car <<AR>> {
+ changeTire()
- addTire()
- removeTire()
}

class Tire <<Entity>>

class Gear <<Entity>>

class Color <<Value Object>>
}

Car "1" -l- "4" Tire
Car "1" -r- "*" Gear
Car "1" -- "1" Color
@enduml

Klassendiagram met 4 klasse(n) en 3 relatie(s).

Klassen:

  • Klasse Car met stereotype AR met:
    • publieke methode 'changeTire', zonder parameters, return type void
    • private methode 'addTire', zonder parameters, return type void
    • private methode 'removeTire', zonder parameters, return type void
    • geen attributen
  • Klasse Tire met stereotype Entity zonder methoden en attributen
  • Klasse Gear met stereotype Entity zonder methoden en attributen
  • Klasse Color met stereotype Value Object zonder methoden en attributen

Relaties:

  • Car heeft een associatie-relatie met Tire, multipliciteit 1 naar 4
  • Car heeft een associatie-relatie met Gear, multipliciteit 1 naar *
  • Car heeft een associatie-relatie met Color, multipliciteit 1 naar 1

Het sequentiediagram hieronder laat zien dat een gewijzigde Car in de Store wordt opgeslagen. Zoals in de vorige les behandelt mag alleen een 'app-type klasse' met de Store communiceren. Dus de app slaat de Car op.

86b32aa24359a6343567b927fafa7698

PlantUML broncode voor "Voorbeeld sequentiediagram"
@startuml

actor Mechanic
participant app as "app:\nCarApp"
participant car as "car:\nCar"
participant oldTire as "oldTire:\nTire"
participant newTire as "newTire:\nTire"
database Store

Mechanic -> app: changeTire(\n\
carId, tireId)
app -> Store: car = findCar(carId)
app -> newTire **: newTire = new Tire()
app -> car: changeTire(tireId, newTire)
car -> car: oldTire = findTire(tireId)
car -> car: removeTire(oldTire)
note over car
De aggregate Car moet
voorkomen dat removeTire
wordt aangeroepen zonder
dat deze wordt gevolgd door
een addTire.
end note
car -> car: addTire(newTire)
app -> Store: saveCar(car)

@enduml

Sequentiediagram met 7 deelnemers: Mechanic, "app van het type \nCarApp", "car van het type \nCar", "oldTire van het type \nTire", "newTire van het type \nTire", Store en newTire **.

Interacties:

  • Mechanic roept "app.changeTire(\n\() aan
  • "app roept Store.car = findCar(carId) aan
  • "app roept newTire **.newTire = new Tire() aan
  • "app roept "car.changeTire(tireId, newTire) aan
  • "car roept "car.oldTire = findTire(tireId) aan
  • "car roept "car.removeTire(oldTire) aan
  • "car roept "car.addTire(newTire) aan
  • "app roept Store.saveCar(car) aan

De aggregate Car is bedoeld om te voorkomen dat een car die niet in een valide state is (omdat er maar drie wielen zijn bijvoorbeeld) wordt opgeslagen in de Store.

notitie

Volgende week gaan we een Spring Boot applicatie maken die daadwerkelijk gebruik maakt van een repository; deze week gebruiken we nog het begrip Store.

2. Verdieping Aggregates

  • 📺 Bekijk deze video tot en met 3:32.
  • 📝 Maak het klassendiagram in <jouw repo van week 2>/les3/voorbereiding/onderdeel2 af op basis van de beschrijving die je daar vindt en de video.
tip

Wees niet al te lang bezig met de oefening. Het is vooral bedoeld om te zorgen dat je de video goed begrijpt en een beetje handigheid krijgt in aggregates aangeven in plantuml.

notitie

Na 3:32 behandelt de spreker het voorbeeld in code. Dit kan interessant zijn om te bekijken als je geïnteresseerd bent. Het is echter C#-code en dat kan wellicht wat verwarrend zijn, daarom is het niet verplicht.

3. Oefening met kiezen van Aggregate

  • 📃 Lees de casus 'Budget' in<jouw repo van week 2>/les3/voorbereiding/onderdeel3/README.md
  • 📝 Maak de opgaven in <jouw repo van week 2>/les3/voorbereiding/onderdeel3/README.md