7 Stimmen

Bewährte Java-Praktiken in der Matrix/Vektor-Bibliothek

Ich muss eine einfache Vektor/Matrix-Bibliothek für ein kleines Geometrie-bezogenes Projekt schreiben, an dem ich arbeite. hier ist, was ich mich frage.

Ist es beim Ausführen mathematischer Operationen mit Vektoren in einer Java-Umgebung besser, eine neue Instanz eines Vektors zurückzugeben oder den Zustand des Originals zu ändern?

Ich habe es hin und her gesehen und würde nur gerne eine mehrheitliche Meinung einholen.

einige Leute sagen, dass die Vektoren unveränderlich sein sollten und statische Methoden verwendet werden sollten, um neue zu erstellen, andere sagen, dass sie veränderbar sein sollten und normale Methoden verwendet werden sollten, um ihren Zustand zu ändern. ich habe es in einigen Fällen gesehen, in denen das Objekt unveränderlich ist und normale Methoden aufgerufen werden, die einen neuen Vektor aus dem Objekt zurückgeben, ohne den Zustand zu ändern - das scheint mir ein wenig falsch.

Ich möchte nur ein Gefühl dafür bekommen, ob es irgendeine bewährte Methode dafür gibt - ich stelle mir vor, dass es etwas ist, das schon eine Million Mal gemacht wurde, und ich frage mich wirklich nur, ob es eine Standardmethode gibt, dies zu tun.

Ich habe bemerkt, dass die Apache-Commons-Mathe-Bibliothek jedes Mal einen neuen Vektor aus dem Original zurückgibt.

5voto

Miserable Variable Punkte 27724

Wie wichtig wird die Leistung sein? Wird die Vektorarithmetik eine große Komponente sein, so dass sie die Leistung des Gesamtsystems beeinflusst?

Wenn dies nicht der Fall ist und es viel Gleichzeitigkeit geben wird, sind unveränderliche Vektoren nützlich, da sie Gleichzeitigkeitsprobleme reduzieren.

Wenn es viele Mutationen auf Vektoren gibt, dann wird der Overhead von neuen Objekten, die unveränderliche Vektoren benötigen, signifikant und es kann besser sein, veränderbare Vektoren zu haben und die Gleichzeitigkeit auf die harte Tour zu erreichen.

2voto

Reverend Gonzo Punkte 37720

Das kommt darauf an. Im Allgemeinen ist die Unveränderlichkeit besser.

In erster Linie ist es automatisch thread-sicher. Es ist einfacher zu warten und zu testen.

Manchmal ist jedoch Schnelligkeit gefragt, wenn die Erstellung neuer Instanzen zu viel Zeit in Anspruch nimmt.

(Hinweis: Wenn Sie nicht zu 100 % sicher sind, dass Sie diese Geschwindigkeit benötigen, brauchen Sie sie nicht. Denken Sie an den Hochfrequenzhandel und mathematikintensive Anwendungen in Echtzeit. Und selbst wenn, sollten Sie zunächst einfach vorgehen und später optimieren).

Was statische vs. normale Methoden betrifft, so sollten Sie nach guten OOP-Prinzipien keine statischen Methoden haben. Um neue Vektoren/Matrizen zu erstellen, können Sie den Konstruktor verwenden.

Wie sieht Ihre Unterstützungsstruktur aus? Am besten sind wahrscheinlich eindimensionale Arrays aus Doubles für Vektoren und mehrdimensionale Arrays aus Doubles für Matrizen. So können Sie zumindest relativ schnell bleiben, indem Sie primitive Objekte verwenden.

Wenn Sie noch mehr Leistung benötigen, können Sie Ihrem Vektor/ihrer Matrix Modifikatoren hinzufügen, die die zugrunde liegenden Daten ändern können. Sie könnten sogar entscheiden, dass die Dimensionen unveränderlich sind, aber der Inhalt veränderbar ist, was Ihnen auch einige andere Sicherheiten bieten würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X