Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.java > #13245

Re: Strategy-Objekte

From Patrick Roemer <sangamon@netcologne.de>
Newsgroups de.comp.lang.java
Subject Re: Strategy-Objekte
Date 2019-05-03 10:58 +0200
Organization news.netcologne.de
Message-ID <qagvrq$87u$1@newsreader4.netcologne.de> (permalink)
References <gj12cbF43i4U1@mid.individual.net>

Show all headers | View raw


Responding to Christian H. Kuhn:
> 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?

Irgendwie schon.

Die einfache Klasse dürfte dem Tutorial-Autor schlicht didaktisch
intuitiver vorkommen als ein Mix von Strategy und Singleton. In
"richtigem" Code hätte ich wohl eine leichte Präferenz für die
Singleton-Variante - mehr Boilerplate, aber saubere Objektidentität.

In Scala hingegen gibt es Singletons als Sprachkonstrukt, da hat man
diesen Tradeoff nicht:

<snip>
type ResultToScore = Chessresult => Float

object OnePoint extends ResultToScore {
  override def apply(result: Chessresult): Float =
    result match {
      case Chessresult.WIN => 1
      case Chessresult.DRAW => 0.5F
      case Chessresult.LOSS => 0
    }
  }

println(OnePoint(Chessresult.WIN))
</snip>

Viele Grüße
Patrick

Back to de.comp.lang.java | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Strategy-Objekte "Christian H. Kuhn" <qno-news@qno.de> - 2019-05-02 22:31 +0200
  Re: Strategy-Objekte Patrick Roemer <sangamon@netcologne.de> - 2019-05-03 10:58 +0200
  Re: Strategy-Objekte Patrick Roemer <sangamon@netcologne.de> - 2019-05-03 12:32 +0200
  Re: Strategy-Objekte Joerg Meier <joergmmeier@arcor.de> - 2019-05-03 13:37 +0200
    Re: Strategy-Objekte Patrick Roemer <sangamon@netcologne.de> - 2019-05-03 14:42 +0200
      Re: Strategy-Objekte "Christian H. Kuhn" <qno-news@qno.de> - 2019-05-03 19:13 +0200
        Re: Strategy-Objekte Thomas Noll <-_tn_-@web.de> - 2019-05-03 17:58 +0000
          Re: Strategy-Objekte "Christian H. Kuhn" <qno-news@qno.de> - 2019-05-03 20:58 +0200
    Re: Strategy-Objekte "Christian H. Kuhn" <qno-news@qno.de> - 2019-05-03 19:05 +0200

csiph-web