2016-11-30 1 views
2

Ist es gute Idee Angle & Distancestruct zu haben, anstatt nur float oder double, das um?Ist es gute Idee Winkel & Distanz Struktur oder Klasse haben

Zum Beispiel in C#, kann ich eine Angle struct machen, es Methoden wie hätte:

angle.Sin(); 
angle.Cos(); 

So kann ich, wenn ich Radiant oder 360 Deg bin mit nicht zu denken.

Und für Distance, Speed, ... usw. ich die

gleiche tun können, ist es ein gutes Design dieser Klasse und structs zu bauen?

Antwort

3

Einige Vorteile der Einrichtung Klassen/structs:

  1. Sie mit verschiedenen Einheiten umgehen können. Sie haben bereits erwähnt, dass Sie sich keine Gedanken über Radianten/Grad machen müssen, aber das gilt auch für die Entfernung (Sie könnten eine Entfernung in km, , furlongs, was auch immer) und andere Messungen einrichten.

  2. Dies verhindert das versehentliche Vermischen von inkommensurablen Werten. Wenn Sie double für alles verwenden, könnten Sie versehentlich x = y; sagen, wobei x eine Messung der Entfernung ist und y eine Messung der Masse ist, zum Beispiel. Das Definieren eigener Klassen zur Darstellung von Messungen verhindert dies, wenn Sie es richtig machen. Sie können auch verhindern, dass ungleiche Messungen addiert und subtrahiert werden. (Handling Multiplikation und Division ist interessant, aber ...)

  3. Im Fall von Winkeln können Sie Dinge wie Behandlung von 90 ° die gleiche wie 450 ° oder -270 ° (dh schreiben Sie eine equals() Funktion, die sie behandelt als gleich).

2

Der Nachteil der Domain Klassen ist arithmetics. Stellen Sie sich vor, Sie möchten die Lichtbogenlänge berechnen. Bei double ist es ganz einfach:

double radius = 12.345; 
double angle = Math.PI/6.0; 

double arcLength = radius * angle; 

Bei Java diese einfache Lösung in etwas verwandelt combersome

Distance radius = new Distance(12.345); 
Angle angle = new Angle(Math.PI/6.0); 

// please, notice that we lose safety with getValue(), but "gain" wordiness 
Distance arcLength = new Distance(radius.getValue() * angle.getValue()); 

// An alternative version can be even worse: 
// Distance arcLength = radius.multiply(angle); 

In C # Sie diesen Wortreichtum unter Verwendung Betreiber lindern können:

Distance radius = 12.345; // implicit operator at work 
Angle angle = Math.PI/6.0; // implicit operator at work 

Distance arcLength = radius * angle; // * operator 

Aber selbst im Falle von C# können Sie feststellen, dass Sie ständig aktualisieren müssen die Exits-Domains: Stellen Sie sich vor, dass Sie Speed Klasse vorstellen möchten. Sie müssen über denken, wenn, sagen wir, Speed * Angle, Speed/Distance erlaubt sind und, falls sie sind, was die resultss Typen sind (zB nicht Speed/Distance == Frequency?)

+0

Eine verallgemeinerte Messklasse, in der Sie die Grade verschiedener Arten von Messungen angeben könnten, wäre nützlich (zB Geschwindigkeit wäre Abstand = 1, Zeit = -1, Masse = 0; Beschleunigung wäre Abstand = 1, Zeit = - 2, Masse = 0, da es in etwas wie m/(sec^2) gemessen wird Gibt es eine solche Bibliothek? – ajb

+0

@ajb: es ist eine Verbesserung, aber das Problem verschwindet nicht: "Winkel" ist ein besonderes case, da kann man sagen, man bekommt 'Sin (Angle)', kann aber nicht 'Sin (Mass)'. Im 3D-Raum gibt es ein Problem mit 'Angle' Addition (oder Multiplikation als Gruppentheorie):' A + B! = B + A' usw. In der Geschäftsroutine haben wir Probleme mit 'Währungs'-Arithmetik: Sie können sagen, * Dollar *, aber nicht summieren * Dollar * und * Euro *. –

0

auf Ihrem Endzweck Je würde ich Ihnen vorschlagen, betrachten mit .NET " Komplexe "Struktur in System.Numerics.Auf diese Weise wäre der Winkel & Abstand Vektoren, und Sie können auf diejenigen direkt mit einer der vielen enthaltenen mathematischen Funktionen arbeiten. Sie erwähnten eine angle.sin() und angle.cos() Methode. Sie würden diese nicht benötigen, da die komplexe Struktur eine FromPolarCoordinates(Double, Double) Methode enthält, um Ihren Winkel & Entfernung zu X & Y-Koordinaten zu konvertieren. Sie können auch Matrixberechnungen für komplexe Zahlen durchführen und Ihren generischen Code & für viele andere Arten von Anwendungen wiederverwendbar machen.

Verwandte Themen