Man hat eine Bedingung, deren Einhaltung man prüfen muss und damit verbunden hat man immer das gleiche Muster:
Was mich stört ist die Bedingung sowohl im if als auch in der Nachricht (wahlweise als Exception, Anzweige auf der View oder Logging). Warum nicht in etwas wie dieses Konstrukt verpacken, wobei sich die Condition intern um das Logging kümmert (Bedingung und eigentlicher Wert).
Conditions sollten so gestaltet sein, dass man Ausdrücke bilden kann. Ich kenne das bereits von JavaFX Bindings.
Vor allem, wenn man Prädikate einsetzt geht die Information verloren, warum ein Element gefiltert wurde. Das erschwert das Debugging meiner Meinung nach.
Schöner wäre so ein Konstrukt. Wo auch das Logging intern wieder erfolgt und test()-Aufrufe eines Prädikats, die false zurückliefern, loggt mit Bedingung und eigentlichem Wert.
Kennt jemand einen bestehenden Ansatz/Lib dafür? Ich lande bei Recherchen immer bei Constraint Programming, was jedoch die falsche Richtung ist.
Java:
int x = userInput();
if( x <= 5 ) {
String msg = "x muss größer als 5 sein, ist aber '" + x + "'";
log.warn(msg)
throw new IllegalStateException(msg);
} else {
return x + 9;
}
Java:
int x = userInput();
Condition c = Condition.greaterThanOrEqual(5, "%d muss größer als $1 sein");
return c.testOrThrow(x).andThen(() -> return x + 9);
Conditions sollten so gestaltet sein, dass man Ausdrücke bilden kann. Ich kenne das bereits von JavaFX Bindings.
Java:
int x = userInput();
Condition c = Condition.and(
Condition.greaterThanOrEqual(5, "%d muss größer als $1 sein")
otherCondition);
return c.testOrThrow(x).andThen(() -> return x + 9);
Vor allem, wenn man Prädikate einsetzt geht die Information verloren, warum ein Element gefiltert wurde. Das erschwert das Debugging meiner Meinung nach.
Java:
Predicate<Integer> greaterThanOrEqual = i -> i >= 5;
List<Integer> ints = IntStream.iterate(0, i -> i+1)
.limit(10)
.boxed()
.collect(toList());
Java:
Condition c = Condition.greaterThanOrEqual(5, "%d muss größer als $1 sein");
List<Integer> filteres = ints.stream()
.filter(c)
.collect(toList());
return c.testOrThrow(x).andThen(() -> return x + 9);
Kennt jemand einen bestehenden Ansatz/Lib dafür? Ich lande bei Recherchen immer bei Constraint Programming, was jedoch die falsche Richtung ist.