Implementieren von Klassen, die sich wie Optional verhalten sollten

8

Stellen Sie sich vor, Sie würden herausfinden, ob sich zwei Formen schneiden. Ein Schnittpunkt zweier Formen kann entweder eine andere Form oder nichts sein. Wenn es keine intersects(Shape) -Methode in Shape gibt, dann wäre, glaube ich, die richtige objektorientierte Lösung:

%Vor%

In% JDK ist Optional eine Klasse final , keine Schnittstelle. Um Probleme wie diese richtig zu lösen, schreibe ich meine eigene Maybe -Schnittstelle, die wie folgt aussehen wird:

%Vor%

Welche Vorbehalte gibt es, wenn ich mich an diese Lösung halte, wenn ich optionales Verhalten brauche? Diese Aufgabe scheint auch ziemlich universell zu sein. Erfinde ich das Rad hier neu und stelle meine eigene Maybe -Schnittstelle vor?

Ich sollte hinzufügen, dass der ganze Aufwand bei einer separaten Klasse und Schnittstelle darin besteht, das Verhalten mit statischen Methoden zu umgehen.

    
gvlasov 19.04.2015, 15:43
quelle

2 Antworten

5
Wie gesagt, das ist eine seltsame Idee. Stellen Sie sich vor, Sie möchten x y für zwei int s berechnen. Manchmal ist es nicht definiert. Würden Sie also Maybe<Integer> implementieren? Und dann eine andere Implementierung für z.B. nCr ( x , y )?

Das klingt falsch, oder? Das Problem ist, dass du den Ursprung der Sache (Schnittpunkt, Macht, wähle) an die Sache selbst bindest. Aber ein Schnittpunkt von zwei Shape s ist nichts anderes als ein Shape wieder (oder gar nichts, was schön dargestellt werden kann mit Optional . Oder noch besser mit null ; Nenn mich einfach Old School ).

Der OO-Ansatz ergibt hier keinen Sinn, da es kein neues Objekt gibt. 2 2 ist genau dasselbe wie nCr (4, 1) und beide sind genau von der gleichen Art wie 4.

Eine andere Sache ist, dass Sie den Konstruktor ShapesIntersection aufrufen müssen. Dies ist eigentlich ein statischer Aufruf, also können Sie stattdessen auch eine statische Hilfsmethode schreiben.

Die Erweiterung von Shape um einige IntersectableShape könnte sinnvoll sein. Es gibt Fälle, in denen einige Operationen für solch eine Sache üblich sind, siehe z.B. FluentIterable , aber ich bezweifle, dass Sie das machen würden viele Kreuzungen.

    
maaartinus 19.04.2015, 17:56
quelle
8

Sie erfinden das Rad hier neu. Der Grund dafür, dass "Optional" endgültig ist, liegt darin, dass es eigentlich keinen Grund gibt, sie zu ändern, und dass die interne Semantik eine konsistente Nutzung erfordert.

Das eigentliche Problem ist die Logik Ihres Konstruktors. Sie sollten keinen Konstruktor verwenden, um die Logik der Schnittmenge zu bestimmen. Was Sie wollen, ist eine (statische?) Methode, die die Berechnung für Sie durchführt und das entsprechende Optional zurückgibt.

%Vor%

Beachten Sie, dass die Optional.empty() und Optional.of(....) sind Factory-Methoden, die entsprechende Methoden erstellen Instanzen des Optional. Java 8-Streams, -Funktionen und andere unterstützende Strukturen verwenden eine Reihe von statischen Factory-Methoden, um Instanzen dieser ansonsten endgültigen Klassen zu erstellen.

    
rolfl 19.04.2015 15:58
quelle

Tags und Links