Redux

Eintrag zuletzt aktualisiert am: 27.03.2021


Das Flux-Pattern ist eine Variante des Observer-Pattern, die in von der Firma Facebook im Jahr 2014 veröffentlicht wurde. Redux ist eine modifizierte Implementierung von Flux, die 2015 erschienen ist (vgl. [https://redux.js.org/understanding/history-and-design/prior-art]).
Redux verwendet "Pure Funktionen" (Pure Functions) im sogenannten "Reducer", die einen Zustand nicht modifizieren, sondern einen neuen Zustand erzeugen (Immutable Objects).

Praxisbeispiel: Immutable Objects mit Record-Typen (ab C# 9.0) beim Redux-Pattern

Ohne Record-Typen sieht die Implementierung eines Zustands für einen einfachen Zähler und eines Reducers zum Ändern des Zählers in C# so aus:
public class CounterState
{
public int ClickCount { get; }

public CounterState(int clickCount)
{
ClickCount = clickCount;
}
}

public static class Reducers
{
[ReducerMethod]
public static CounterState ReduceIncrementCounterAction(CounterState state, IncrementCounterAction action) =>
new CounterState(state.ClickCount + 1);
[ReducerMethod]
public static CounterState ReduceDecrementCounterAction(CounterState state, IncrementCounterAction action) =>
new CounterState(state.ClickCount - 1);
}

Mit Record-Typen ist dies wesentlich prägnanter implementierbar:

public record CounterState(int ClickCount);

public static class Reducers1
{
[ReducerMethod]
public static CounterState ReduceIncrementCounterAction(CounterState state, IncrementCounterAction action) =>
state with { ClickCount = state.ClickCount + 1 };

[ReducerMethod]
public static CounterState ReduceDecrementCounterAction(CounterState state, DecrementCounterAction action) =>
state with { ClickCount = state.ClickCount - 1 };
}

Weitere Teile des Redux-Patterns (Feature, Actions) sind hier nicht wiedergegeben, da sie sich durch den Einsatz von Record-Typen nicht ändern. Siehe dazu die Bibliothek Fluxor, die Redux für .NET realisiert: https://github.com/mrpmorris/Fluxor