Christian H. Kuhn
2019-05-02 20:31:06 UTC
Liebe Gemeinde,
bevor hier ganz zugemacht wird:
Ich bastele an einem Programm zur Verwaltung von Schachturnieren. Die
möglichen Ergebnisse einer Partie habe ich in einem Enum Chessresult mit
den Werten WIN, DRAW, LOSS dargestellt. Für die Berechnung der Paarungen
der nächsten Runde nach Schweizer System ist der aktuelle Punktestand zu
bestimmen. Der kann aus diesen drei Werten durch mindestens drei
gebräuchliche Wertgruppen berechnet werden:
- 1, 0,5, 0 (bei Einzelpartien gebräuchlich)
- 2, 1, 0 (eher für Mannschaftskämpfe)
- 3, 1, 0 (sowohl bei Einzel- als auch Mannschaftsturnieren gelegentlich
anzutreffen)
Das riecht nach dem Strategy Pattern. Also etwa
interface ResultToScore {
public float score(Chessresult result);
}
Die einzelnen Strategien möchte ich als nicht-anonyme Klasse definieren.
Eine Lambda-Expression an geeigneter Stelle liest sich elegant, ist aber
nicht wiederverwendbar. Egal, wo ich lese, ist die Implementation sowas wie
public class OnePoint implements ResultToScore {
@Override
public float score(Chessresult result) {
switch (result) {
case Chessresult.WIN: return 1;
case Chessresult.DRAW: return 0.5;
case Chessresult.LOSS:
default: return 0;
}
}
}
Ich brauche aber gar kein Objekt, es würde mir reichen, wenn score()
static wäre. Wenn ich ein Objekt nehme, reicht mir ein Singleton. Und
überhaupt haben alle diese Strategien keinen Zustand und sind
automatisch immutable. Gibt es einen Grund, warum in allen Beispielen,
die ich finde, die Strategy-Klassen so implementiert werden, dass es von
jeder verschiedene unterscheidbare Instanzen gibt, obwohl das auch in
den meisten Beispielen sinnlos ist? Oder mache ich mir zuviel Gedanken?
TIA
QNo
bevor hier ganz zugemacht wird:
Ich bastele an einem Programm zur Verwaltung von Schachturnieren. Die
möglichen Ergebnisse einer Partie habe ich in einem Enum Chessresult mit
den Werten WIN, DRAW, LOSS dargestellt. Für die Berechnung der Paarungen
der nächsten Runde nach Schweizer System ist der aktuelle Punktestand zu
bestimmen. Der kann aus diesen drei Werten durch mindestens drei
gebräuchliche Wertgruppen berechnet werden:
- 1, 0,5, 0 (bei Einzelpartien gebräuchlich)
- 2, 1, 0 (eher für Mannschaftskämpfe)
- 3, 1, 0 (sowohl bei Einzel- als auch Mannschaftsturnieren gelegentlich
anzutreffen)
Das riecht nach dem Strategy Pattern. Also etwa
interface ResultToScore {
public float score(Chessresult result);
}
Die einzelnen Strategien möchte ich als nicht-anonyme Klasse definieren.
Eine Lambda-Expression an geeigneter Stelle liest sich elegant, ist aber
nicht wiederverwendbar. Egal, wo ich lese, ist die Implementation sowas wie
public class OnePoint implements ResultToScore {
@Override
public float score(Chessresult result) {
switch (result) {
case Chessresult.WIN: return 1;
case Chessresult.DRAW: return 0.5;
case Chessresult.LOSS:
default: return 0;
}
}
}
Ich brauche aber gar kein Objekt, es würde mir reichen, wenn score()
static wäre. Wenn ich ein Objekt nehme, reicht mir ein Singleton. Und
überhaupt haben alle diese Strategien keinen Zustand und sind
automatisch immutable. Gibt es einen Grund, warum in allen Beispielen,
die ich finde, die Strategy-Klassen so implementiert werden, dass es von
jeder verschiedene unterscheidbare Instanzen gibt, obwohl das auch in
den meisten Beispielen sinnlos ist? Oder mache ich mir zuviel Gedanken?
TIA
QNo