Valides Dreieck erzeugen

temi

Top Contributor
Hallo zusammen,

aufgrund einer vor Kurzem geführten Diskussion, wie ein korrektes Dreieck erzeugt werden kann (sollte), habe ich mir auch Gedanken zu dem Thema gemacht. Das hat keinen tieferen Hintergrund und ist eher theoretischer Natur. Ich bin ja schließlich auch noch Anfänger ;)

Eine bereits angesprochene Lösung war, der Klasse "Dreieck" mehrere Konstruktoren zu geben, um Dreiecke z.B. mit drei Seiten, zwei Seiten und Winkel oder einer Seite und zwei Winkeln zu erzeugen. Ergänzen, könnte man jetzt noch Konstruktoren mit Fläche und Seiten (und/oder Winkeln) usw.

Das finde ich jetzt aber auch nicht so richtig flexibel, da habe ich mich an CAD erinnert, wo es den Begriff der Constraints gibt, also geometrische Grenzen, die ein Objekt einhalten muss.

Mein Ansatz wäre demnach eine sehr einfache Klasse "Dreieck", mit einem simplen "drei bekannte Seiten Konstruktor" und eine Fabrik-Klasse. Die "Idee" ist, dieser Klasse solange Werte für Dreiecksparameter zu geben (Seitenlängen, Winkel, Fläche, Umfang) bis ein gültiges Dreieck erzeugt werden kann. Ungefähr so:
Java:
TriangleFactory factory = new TriangleFactory();

factory.setSide(SIDE.a, 10);
factory.setSide(SIDE.b, 10);
factory.setAngle(ANGLE.alpha, 60);
// validate and then
Triangle triangle = factory.getInstance();

Damit ist allerdings das "Wissen" über die Erzeugung (und auch einiges an Berechnung) nicht in der Klasse Dreieck, sondern in der Fabrik. Die Klasse Dreieck hat Berechnungsmethoden für alle Winkel, Fläche und Umfang (was leider ggf. doppelten Code mit der Fabrik bedeuten kann). Denkbar wäre es das alles in der Klasse Dreieck zu veranstalten, aber dann würde durch den Konstruktor zunächst ein ungültiges Dreieck erzeugt, was mich nicht überzeugt.

Ist das vom Design her in Ordnung oder gibt es bessere Ansätze?
 

mrBrown

Super-Moderator
Mitarbeiter
Man könnte da mit Builder-Pattern und Method-Chaining arbeiten.
Kommt deinem Factory-Ansatz nah, lässt sich aber manchmal mehr mit erreichen und ist besser zu benutzen.

Java:
a(10).b(10).alpha(60)

Möglicherweise lässt sich da mit viel Trickserei mit Interfaces noch mehr erreichen, z.B. sicher stellen, dass mindestens eine Länge angegeben wird und danach die entsprechend nötigen anderen Werte.




Ansonsten u.U. der Factory-Method einfach eine "Menge von Werten" übergeben und intern wird dann einfach für die Werte die passend Formel rausgesucht und das passende Dreieck ausgespuckt, z.B. mit chain of responsibility.
Benutzung wäre etwa so:
Java:
triangle(a(10), b(10), alpha(60)); //a,b,alpha entsprechende statische Methoden für Seiten/Winkel
Könnte man u.U. auch wieder mit entsprechenden Typen arbeiten (ist aber vllt auch nicht umsetzbar?)
 

temi

Top Contributor
Method-Chaining halte ich für eine gute Idee. :cool:
Java:
TriangleBuilder.a(10).b(10).alpha(60).tryGetInstance();

Zwischenfrage: Wird das auch Fluent-Interface genannt, oder ist das was anderes?

Wegen dupliziertem Code wäre es möglicherweise sinnvoll eine zusätzliche Klasse mit den Berechnungen zum Dreieck zu erstellen und sowohl aus der Factory (oder Builder) und auch aus Triangle auf die benötigten Methoden zuzugreifen. Oder das Dreieck erhält durch den Builder bereits alle berechneten Werte übergeben und dient nur als POJO.
 

CSHW89

Bekanntes Mitglied
Ja die Methode heißt auch Fluent-Interface. Persönlich finde ich diese Idee auch die beste. Eine andere, die mir noch eingefallen ist, ist folgende. Ein Interface oder abstrakte Klasse Dreieck, die Methoden hat wie getA, getB, getC, dann noch z.b. getPerimeter, die schon eine default-Implementierung besitzt mit "return getA() + getB() + getC()" usw. So nun kommt der Clou, es wird nun für jede Möglichkeit, ein Dreieck zu bilden eine Klasse erstellt. Zum Beispiel für SWS (also Seite-Winkel-Seite) gibt es eine Klasse, die auch nur diese drei Werte speichert. Die Methode getC berechnet dann die dritte Seite, ohne sie zu speichern. Zusätzlich könnte man noch abstrakte Klassen für bestimmte Eigenschaften schreiben, wie GleichseitigesDreieck, RechtwinkligesDreieck ect., die weitere Methoden default implementieren.
Wenn ich jetzt so drüber nachdenke, könnte man dies sogar mit Fluent-Interfaces verbinden. Die Kette stopt immer bei einer dieser Klasse, jenachdem welchen Weg man geht.
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Wegen dupliziertem Code wäre es möglicherweise sinnvoll eine zusätzliche Klasse mit den Berechnungen zum Dreieck zu erstellen und sowohl aus der Factory (oder Builder) und auch aus Triangle auf die benötigten Methoden zuzugreifen.

Naja, der Code zum Berechnen eines gültigen Dreieckes aus gegebenen Werten und der, um aus einem gültigem Dreieck die anderen Wert zu berechnen, hat nur im mathematischen Sinne was miteinander zu tun. Wirklich doppelter Code wird da nicht anfallen, von daher kann man das super trennen ;)


Oder das Dreieck erhält durch den Builder bereits alle berechneten Werte übergeben und dient nur als POJO.
POJO ist so ein Dreieck hoffentlich in jedem Fall ;P das sagt im wesentlichen nicht mehr aus, als das eine Klasse nicht irgendwelche speziellen technischen Konventionen, sondern nur fachliche einhält ;)

Zwischenfrage: Wird das auch Fluent-Interface genannt, oder ist das was anderes?
Kommt dem nah, wobei man das vermutlich noch "sprechender" schreiben könnte.
 

temi

Top Contributor
POJO ist so ein Dreieck hoffentlich in jedem Fall ;P das sagt im wesentlichen nicht mehr aus, als das eine Klasse nicht irgendwelche speziellen technischen Konventionen, sondern nur fachliche einhält
Ich hatte das immer so interpretiert, dass die Klasse nichts (oder fast nichts) außer Daten enthält.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T auf Valides Datum prüfen Allgemeine Java-Themen 12
N lwjgl Projection Matrix löscht Dreieck Allgemeine Java-Themen 1
U Java Dreieck Winkel Allgemeine Java-Themen 1
R Dreieck-Dreieck Kollision (triangle-triangle intersection) Allgemeine Java-Themen 11
T Pascalsches Dreieck ohne array und rekursion Allgemeine Java-Themen 9
I Module-Info für Jar erzeugen Allgemeine Java-Themen 7
S Klickbare Stacktraces selber erzeugen..? Allgemeine Java-Themen 9
I OpenPDF (ehem. iText) will kein PDF mit CMYK only erzeugen Allgemeine Java-Themen 6
J Runable jar erzeugen Allgemeine Java-Themen 2
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
dereki2000 Windows Benachrichtigung erzeugen Allgemeine Java-Themen 2
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
F Objekte erzeugen Allgemeine Java-Themen 1
M Variabe a[i] erzeugen Allgemeine Java-Themen 8
Meeresgott Kapselung Tabellen der Datenbank erzeugen. Allgemeine Java-Themen 7
Thallius String erzeugen sehr langsam Allgemeine Java-Themen 16
L ICS-Kalenderdatei aus PDF erzeugen Allgemeine Java-Themen 0
A Jasper Report Performance bei PDF erzeugen Allgemeine Java-Themen 0
F Java Spintax: Alle Kombinationen Erzeugen Allgemeine Java-Themen 2
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
H Vektor rekursiv erzeugen Allgemeine Java-Themen 2
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
V 2D-Grafik BufferdImage aus gif Datei in Jar erzeugen geht nicht. Allgemeine Java-Themen 6
R Aus Eclipse Projekt ein UML erzeugen Allgemeine Java-Themen 3
G Texte erzeugen Allgemeine Java-Themen 3
R Großes Hash-Set erzeugen Allgemeine Java-Themen 12
P Excel-Sheets erzeugen aus Report Allgemeine Java-Themen 2
Ollek Barcode mit Barcode4J erzeugen - Exception Allgemeine Java-Themen 4
P Arrays erzeugen Allgemeine Java-Themen 5
G Strings erzeugen Allgemeine Java-Themen 20
C QR-Codes erzeugen. Allgemeine Java-Themen 43
M Input/Output Datei erzeugen funktioniert nicht (immer) vom .jar aus Allgemeine Java-Themen 5
T "Platzsparende" und "schnelle" Indizes erzeugen Allgemeine Java-Themen 10
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
E Objekt beim Erzeugen in ArrayList Allgemeine Java-Themen 9
D 2D-Grafik Funktionierende .jar datei mit Images (jpg) erzeugen Allgemeine Java-Themen 2
S Schnell eine fortlaufende nummer erzeugen SQL, kein Primkey Allgemeine Java-Themen 8
M Graphen erzeugen und visualisieren, jgraph oder was was anderes? Allgemeine Java-Themen 2
M Klassen Zugriff auf getMethode ohne Klasse zu erzeugen Allgemeine Java-Themen 6
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
Y Eclipse ppt Folie erzeugen + text plazieren Allgemeine Java-Themen 4
G log4j File erzeugen und Pfad bestimmen Allgemeine Java-Themen 3
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
A HashCode von DatagrammPacket(content) erzeugen. Allgemeine Java-Themen 3
A auführbare Jar erzeugen mit ant Allgemeine Java-Themen 5
D Browser-Objekt erzeugen Allgemeine Java-Themen 8
Developer_X Java ton erzeugen Allgemeine Java-Themen 3
D character kodierung, barcode für barcode font erzeugen Allgemeine Java-Themen 4
D Worddocumente erzeugen Allgemeine Java-Themen 4
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
A Dummy-Objekte für Webgui erzeugen Allgemeine Java-Themen 12
S JUnit: Erzeugen einer IOException Allgemeine Java-Themen 9
S Neue Instanz eines Objekts erzeugen - Konstruktor erhaelt Parameter. Allgemeine Java-Themen 5
A AES Key aus Text erzeugen Allgemeine Java-Themen 2
N JFrame Icon selbst erzeugen Allgemeine Java-Themen 2
D Objekte nur unter bestimmten Voraussetzungen erzeugen Allgemeine Java-Themen 4
F Klasse vorhanden - wie daraus Objekt erzeugen Allgemeine Java-Themen 8
C PDF erzeugen Allgemeine Java-Themen 3
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
F Zufallszahl erzeugen Allgemeine Java-Themen 4
P Objekt einer Klasse erzeugen, die als String vorliegt Allgemeine Java-Themen 3
multiholle Objekt einer Klasse anhand eines String erzeugen Allgemeine Java-Themen 3
M odt-Datei erzeugen Allgemeine Java-Themen 6
G File zur Laufzeit erzeugen Allgemeine Java-Themen 4
G Windows Pipe erzeugen Allgemeine Java-Themen 12
A Wie eine Seriennummer erzeugen und auswerten? Allgemeine Java-Themen 11
G erzeugen von "ArrayList<Integer>[][]" Allgemeine Java-Themen 7
T Log4J: Bei Programmstart immer eine neue LogDatei erzeugen Allgemeine Java-Themen 9
S Zweidimensionales Array neue Zeile erzeugen Allgemeine Java-Themen 3
A Objekt in einem Array erzeugen Allgemeine Java-Themen 6
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
V Enums aus Datei-Einträgen erzeugen? Allgemeine Java-Themen 6
M KML Datei automatisch erzeugen Allgemeine Java-Themen 3
H Problem mit erzeugen eienr neuen Session Allgemeine Java-Themen 3
G zweierKompliment erzeugen Allgemeine Java-Themen 12
L Objekt erzeugen Allgemeine Java-Themen 2
R Jasper iReport erzeugen Allgemeine Java-Themen 7
MQue über iBatis Tabellen erzeugen Allgemeine Java-Themen 4
V Aus String -> Objekt einer Klasse erzeugen Allgemeine Java-Themen 7
P UML erzeugen Allgemeine Java-Themen 3
M wav datei/ ton erzeugen Allgemeine Java-Themen 4
M eigenen Desktop erzeugen Allgemeine Java-Themen 3
S Asymmetrisches Array dynamisch erzeugen Allgemeine Java-Themen 4
T Objekte dynamisch über eine Methode erzeugen Allgemeine Java-Themen 10
X PowerPoint Files in Java erzeugen Allgemeine Java-Themen 2
M File im memory erzeugen Allgemeine Java-Themen 5
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
B Grafik erzeugen in java Allgemeine Java-Themen 2
P Image erzeugen Allgemeine Java-Themen 7
S Uml erzeugen (nicht: JavaCode-Erzeugung) Allgemeine Java-Themen 4
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
L iText: Mehrseitiges PDF erzeugen Allgemeine Java-Themen 9
G UML automatisch erzeugen lassen Allgemeine Java-Themen 2
S Demoversion erzeugen? Allgemeine Java-Themen 17
H In Testklasse Objekte erzeugen und in einer Schleife ausgebe Allgemeine Java-Themen 4
G Problem mit ArrayList bzw. dem erzeugen derer Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben