Ich arbeite an einer Game-Engine, und derzeit stehe ich fest, das IO-System zu entwerfen. Ich habe es so gemacht, die Engine selbst behandelt keine Dateiformate, sondern lässt den Benutzer alles implementieren, was er will, indem er eine *.dll
Datei mit nützlichen Funktionen erstellt. Während das selbst kein großes Problem war, sind meine Hauptanliegen die Implikationen, die wahrscheinlich während der Verwendung der Engine sichtbar werden.Maßeinheiten in C++
Ich entwarf eine einfache resource
Schnittstelle als Basisklasse für alle Dinge, die der Benutzer ausdenken kann, und ich versuche, es zu erweitern, indem einfache untergeordnete Klassen für die gemeinsamen Datentypen gewidmet, so dass der Benutzer nicht muss die Grundlagen selbst implementieren (derzeit denke ich an audio
, image
, data
und). Beginnend mit der audio
Klasse, habe ich auf ein besonderes Problem sublobiert, während zu versuchen zu entscheiden, in welchem Typ ich Informationen über Abtastrate speichern sollte. Die übliche Einheit sind Hertz, also entschied ich mich, es zu unsigned int
zu machen.
Allerdings gibt es ein kleines Problem hier - was ist, wenn der Benutzer versucht, es in Kilohertz setzen? Nehmen wir an, dass ein abstraktes Dateiformat es in beiden Einheiten für einen Moment speichern kann. Ich habe eine einfache Wrapper-Klasse machte den Einheitentyp zu nennen:
class hertz{
private:
unsigned int value;
hertz(){};
public:
operator unsigned int();
hertz(unsigned int value);
};
und entschied sich der Benutzer auch kHz verwenden zu lassen:
class kilohertz{
private:
float value;
kilohertz(){};
public:
operator hertz();
kilohertz(float value);
};
Während die Funktion innerhalb der audio
Klasse, die es dem Benutzer ermöglicht Stellen Sie die Abtastrate als track& samplingRate(units::hertz rate);
deklariert. Der Benutzer hat es zu nennen explizit zu sagen, was Größenordnung er verwendet:
someAudioFile.samplingRate(hertz(44100));
someAudioFile.samplingRate(kilohertz(44.1));
Meine Frage ist:
Gibt es einen besseren Weg, um die Benutzer zu zwingen, eine Messeinheit in einem einfach zu bedienen und eleganter Weg? Vielleicht ein Designmuster oder eine clevere Verwendung von typedefs?
Bitte beachten Sie auch, dass ich bei der Erstellung der Engine möglicherweise mehr Einheiten benötige, die nicht mit Hertz kompatibel sind. Von Anfang an möchte ich, dass der Benutzer eine Pixelfarbe festlegen kann, indem er units::rgb(123,42,120)
und units::hsl(10,30,240)
ausführt.
Ich habe versucht, eine tragfähige Antwort zu suchen und fand nur this question, aber das OP wollte nur Größenordnungen, ohne sicherzustellen, dass die Einheiten nicht mit anderen kompatibel sind.
Bitte beachten Sie auch, ich verwende die alte C++
Version, nicht C++11
. Während das Posten einer in jeder Version gültigen Lösung großartig ist, wäre es schön, wenn ich es auch benutzen könnte :)
Können Sie nicht einfach Ihre API richtig dokumentieren? –
Ja, um Verwirrung zu vermeiden, sollten Sie Ihre API auf einen Standard, Hertz oder Kilohertz, beschränken, nicht beides. – leetNightshade
Dokumentieren meiner API wird nichts ändern, da ich möchte, dass der Benutzer beide verwenden kann, wenn es zum Beispiel darum geht, eine Farbe einzustellen. Das ist also nicht gerade eine Lösung. Vielleicht würde es mit Hertz funktionieren, aber das ist nur eine Einheit. –