Skip to content

Commit

Permalink
Dungeon: do not throw exceptions in stream operations (refactoring, S…
Browse files Browse the repository at this point in the history
…pikeSystem) (#1567)

see
#1564 (comment)

In 

```java
public void execute() {
     filteredEntityStream(SpikyComponent.class)
         .forEach(e -> e.fetch(SpikyComponent.class).orElseThrow().reduceCoolDown());
}
```

wird ein Stream aller Entitäten mit einer `SpikyComponent` vom `System`
angefordert. Bei der Iteration über diese Entitäten wird dann (a) die
`SpikyComponent` extrahiert, (b) eine Exception geworfen im
Nichtvorhandensein-Fall, und (c) auf der Component eine Methode
aufgerufen.

Dies ist aus zwei Gründen problematisch: Zum werden mehrere Operationen
in die `forEach`-Schleife verpackt, und zum anderen sollte man keine
Exceptions in einer Stream-Operation werfen. (OK, das dürfte hier in der
Realität auch nie passieren, da wir ja vorher exakt nach der Component
gefiltert hatten. Dennoch.)

Dieser PR führt ein Refactoring durch und erledigt **in jedem
Stream-Step eine Sache**. Außerdem wird **keine Exception** mehr in der
Stream-Verarbeitung geworfen, sondern Entitäten, die zwischen
`System#filteredEntityStream` und dem `forEach` auf geheimnisvolle Weise
ihre `SpikyComponent` verloren haben sollten, werden einfach ignoriert.

Keine Änderung der API und/oder des Verhaltens.
  • Loading branch information
cagix authored Jul 7, 2024
1 parent adebc9f commit 0067800
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion dungeon/src/contrib/systems/SpikeSystem.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import contrib.components.SpikyComponent;
import core.System;
import core.components.PositionComponent;
import java.util.Optional;

/**
* Reduces the current cool down for each {@link SpikyComponent} once per frame. Entities with the
Expand All @@ -20,6 +21,8 @@ public SpikeSystem() {
@Override
public void execute() {
filteredEntityStream(SpikyComponent.class)
.forEach(e -> e.fetch(SpikyComponent.class).orElseThrow().reduceCoolDown());
.map(e -> e.fetch(SpikyComponent.class))
.flatMap(Optional::stream)
.forEach(SpikyComponent::reduceCoolDown);
}
}

0 comments on commit 0067800

Please sign in to comment.