Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dungeon: improve readability by replacing implicit filtering (entityStream) with explicit filtering (filteredEntityStream, both System) #1564

Merged
merged 4 commits into from
Jul 1, 2024

Conversation

AMatutat
Copy link
Contributor

@AMatutat AMatutat commented Jul 1, 2024

fixes #1553

Überarbeitet den Umgang mit dem Entity-Stream in System#execute-Methoden, um eine bessere Code-Lesbarkeit zu erreichen.

Anmerkung: Durch die gemachten Änderungen kommt es zu Redundanz im Hinblick auf die Filterregeln. Diese werden weiterhin im System gespeichert, können jetzt aber optional als Parameter eigenständig verwendet werden. Wenn sich für das eigenständige Verwenden als Parameter entschieden wird, muss bei Änderungen an den Filtern darauf geachtet werden, diese überall einzutragen (im Konstruktor UND in der Execute-Funktion).

Für leichtere Bedienung und Abwärtskompatibilität ist die alte Variante aber weiterhin verfügbar.

Änderungen im Überblick:

  • Umbenennung der Methode System#entityStream in System#filteredEntityStream
  • Hinzufügen von parametisierten Varianten der Methode System#filteredEntityStream in zwei Geschmacksrichtungen:
    • Array-Style-Parameter: filteredEntityStream(final Class<? extends Component>... filterRules)
    • Set-Parameter: filteredEntityStream(Set<Class<? extends Component>> filterRules)
  • Tests
  • Anwenden der Methode System#filteredEntityStream(final Class<? extends Component>... filterRules) in den core- und contrib-Systemen
  • Kleinere Refactoring-Änderungen (Kommentare, Namen)

ACHTUNG: Veränderung der API. (keine Verhaltensänderung)

@AMatutat AMatutat self-assigned this Jul 1, 2024
@AMatutat AMatutat requested a review from cagix as a code owner July 1, 2024 08:41
Copy link
Member

@cagix cagix left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AMatutat An sich passt das. Bei zwei Sachen bin ich gestolpert und habe einen Vorschlag angetüdelt. Schau mal, ob das Sinn ergibt (ich hänge hier grad zwischen den Meetings - kann auch kompletter Nonsense sein).

@Flamtky Du hast ja auch viel mit entityStream gearbeitet. Wenn wir diesen PR jetzt mergen, macht Dir das ggf. das Leben schwerer, also sollten wir noch auf die vollständige Integration vom DevDungeon warten mit diesem PR?

dungeon/src/contrib/systems/SpikeSystem.java Show resolved Hide resolved
game/src/core/systems/CameraSystem.java Show resolved Hide resolved
@cagix cagix changed the title Improved Code Readability by Refactoring System#entityStream Dungeon: improve readability by replacing implicit filtering (entityStream) with explicit filtering (filteredEntityStream, both System) Jul 1, 2024
@cagix
Copy link
Member

cagix commented Jul 1, 2024

@AMatutat OK, dann schiebe ich die beiden Vorschläge nach dem Merge hier als separate PRs rein. Aber ich warte noch auf die Antwort von @Flamtky ...

@Flamtky
Copy link
Contributor

Flamtky commented Jul 1, 2024

@AMatutat OK, dann schiebe ich die beiden Vorschläge nach dem Merge hier als separate PRs rein. Aber ich warte noch auf die Antwort von @Flamtky ...

Hatte irgendwie keine Benachrichtigung erhalten 😅. Also ich muss sowieso im DevDungeon viel anpassen, da ich schon bereits vieles geändert habe. Somit kann das hier gemergt werden. Die IDE sollte mir ja alles markieren wo es Probleme macht durch die neuen Methodennamen.

@cagix
Copy link
Member

cagix commented Jul 1, 2024

@AMatutat OK, dann schiebe ich die beiden Vorschläge nach dem Merge hier als separate PRs rein. Aber ich warte noch auf die Antwort von @Flamtky ...

Hatte irgendwie keine Benachrichtigung erhalten 😅. Also ich muss sowieso im DevDungeon viel anpassen, da ich schon bereits vieles angepasst habe. Somit kann das hier gemergt werden. Die IDE sollte mir ja alles markieren wo es Probleme macht durch die neuen Methodennamen.

@Flamtky okay, dann mache ich hier zu - ich wollte dir nur den job nicht noch schwerer machen, als er eh schon ist .)

@cagix cagix merged commit 2e694e3 into master Jul 1, 2024
9 checks passed
@cagix cagix deleted the am/fix1553 branch July 1, 2024 13:27
cagix added a commit that referenced this pull request Jul 1, 2024
cagix added a commit that referenced this pull request Jul 7, 2024
…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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Refactoring der entityStream-Methoden
3 participants