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: do not throw exceptions in stream operations (refactoring, SpikeSystem) #1567

Merged
merged 5 commits into from
Jul 7, 2024

Conversation

cagix
Copy link
Member

@cagix cagix commented Jul 1, 2024

see #1564 (comment)

In

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.

@cagix cagix added the dungeon label Jul 1, 2024
@cagix cagix self-assigned this Jul 1, 2024
@cagix cagix requested a review from AMatutat July 1, 2024 14:03
@cagix
Copy link
Member Author

cagix commented Jul 2, 2024

@AMatutat Ich habe nochmal map und flatMap gesplittet - ist das lesbarer als die vorige Variante?

    filteredEntityStream(SpikyComponent.class)
        .flatMap((e -> e.fetch(SpikyComponent.class).stream()))
        .forEach(SpikyComponent::reduceCoolDown);

vs.

    filteredEntityStream(SpikyComponent.class)
        .map((e -> e.fetch(SpikyComponent.class)))
        .flatMap((Optional::stream))
        .forEach(SpikyComponent::reduceCoolDown);

Meinungen?

@AMatutat
Copy link
Contributor

AMatutat commented Jul 2, 2024

    filteredEntityStream(SpikyComponent.class)
        .map((e -> e.fetch(SpikyComponent.class)))
        .flatMap((Optional::stream))
        .forEach(SpikyComponent::reduceCoolDown);

Aus einem Studi gezielten Blickwinkel finde ich Nummer 2 besser. Da wird die Optional geschichte nochmal sichtbar.

@cagix
Copy link
Member Author

cagix commented Jul 2, 2024

ja, finde ich auch. flatmap sagt zwar auch schon alles an sich, aber das extra .stream() ist typisch java - die java-designer haben vermutlich im meeting gesessen und gedacht "lasst mal sehen, was ist die bescheuertste ausdrucksform? supi, das nehmen wir so." 🫣🤣

@cagix
Copy link
Member Author

cagix commented Jul 2, 2024

@AMatutat Noch eine andere Variante:

(A)

    filteredEntityStream(SpikyComponent.class)
        .map(e -> e.fetch(SpikyComponent.class))
        .forEach(sc -> sc.ifPresent(SpikyComponent::reduceCoolDown));

vs. Vorschlag (2) von oben

(B)

    filteredEntityStream(SpikyComponent.class)
        .map(e -> e.fetch(SpikyComponent.class))
        .flatMap((Optional::stream))
        .forEach(SpikyComponent::reduceCoolDown);

Im Grunde führen .flatMap((Optional::stream)) und sc.ifPresent() zum selben Ergebnis: Das Optional aus dem e.fetch(SpikyComponent.class) wird ausgepackt und falls vorhanden mit SpikyComponent::reduceCoolDown behandelt.

Meinungen? Eine dieser beiden Varianten würde ich tatsächlich einchecken, d.h. aus meiner Sicht sind beide besser als das Original.

@cagix cagix force-pushed the refactor-spikesystem branch from 98cafc4 to 26d87f1 Compare July 2, 2024 07:47
@cagix
Copy link
Member Author

cagix commented Jul 4, 2024

@AMatutat Präferenzen? (A) oder (B)?

Copy link
Member Author

@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.

klammerpaar zuviel/doppelt

dungeon/src/contrib/systems/SpikeSystem.java Outdated Show resolved Hide resolved
@cagix
Copy link
Member Author

cagix commented Jul 7, 2024

keine reaktion von @AMatutat ... going w/ (b).

@cagix cagix merged commit 0067800 into master Jul 7, 2024
8 checks passed
@cagix cagix deleted the refactor-spikesystem branch July 7, 2024 10:15
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.

2 participants