TL; DR - Ich versuche, eine optimale Datenstruktur zu entwerfen, um Einheiten innerhalb einer Maßeinheit zu definieren.
A Unit of measure
ist im Wesentlichen eine value
(oder eine Menge), die mit a assoziiert ist unit
. SI-Einheiten haben sieben Basen oder Dimensionen. Nämlich: Länge, Masse, Zeit, elektrischer Strom, Temperatur, Substanzmenge (Mol) und Lichtstärke.
Dies wäre recht einfach, aber es gibt eine Reihe von abgeleiteten Einheiten sowie Raten, die wir häufig verwenden. Eine kombinierte Beispieleinheit wäre der Newton: kg * m / s^2
und eine Beispielrate wäre tons / hr
.
Wir haben eine Anwendung, die sich stark auf implizite Einheiten stützt. Wir werden die Einheiten in den Variablen- oder Spaltennamen einbetten. Dies schafft jedoch Probleme, wenn wir eine Maßeinheit mit verschiedenen Einheiten angeben müssen. Ja, wir können die Werte bei der Eingabe und Anzeige konvertieren, aber dies generiert eine Menge Overhead-Code, den wir in einer eigenen Klasse einkapseln möchten.
Es gibt eine Reihe von Lösungen für Codeplex und andere kollaborative Umgebungen. Die Lizenzierung für die Projekte ist akzeptabel, aber das Projekt selbst ist in der Regel zu leicht oder zu schwer. Wir jagen unser eigenes Einhorn "genau richtig".
Idealerweise könnte ich eine neue Maßeinheit folgendermaßen definieren:
UOM myUom1 = neue UOM (10, Volt);
UOM myUom2 = neue UOM (43,2, Newton);
Natürlich verwenden wir eine Mischung aus imperialen und SI-Einheiten, die auf die Bedürfnisse unserer Kunden abgestimmt ist.
Wir müssen diese Einheitenstruktur auch mit einer zukünftigen Datenbanktabelle synchronisieren, damit wir auch in unseren Daten den gleichen Grad an Konsistenz gewährleisten können.
Wie lassen sich die Einheiten, abgeleiteten Einheiten und Kurse am besten definieren, die zum Erstellen unserer Maßeinheitenklasse verwendet werden müssen? Ich könnte eine oder mehrere Aufzählungen verwenden, aber das könnte für andere Entwickler frustrierend sein. Eine einzelne Aufzählung würde mit mehr als 200 Einträgen sehr umfangreich sein, während mehrere Aufzählungen auf der Grundlage von SI-Einheiten gegenüber imperialen Einheiten und einer zusätzlichen Aufschlüsselung auf der Grundlage der Kategorisierung der Einheit selbst verwirrend sein könnten.
Aufzählungsbeispiele, die einige meiner Bedenken aufzeigen:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
Unser Satz von Einheiten ist ziemlich gut definiert und es ist ein begrenzter Raum. Wir müssen in der Lage sein, neue abgeleitete Einheiten oder Raten zu erweitern und hinzuzufügen, wenn die Kundennachfrage danach besteht. Das Projekt ist in C #, obwohl ich denke, dass die umfassenderen Designaspekte auf mehrere Sprachen anwendbar sind.
Eine der Bibliotheken, die ich mir angesehen habe, ermöglicht die formlose Eingabe von Einheiten per String. Ihre UOM-Klasse analysierte dann die Zeichenfolge und schlitzte die Dinge entsprechend ein. Die Herausforderung bei diesem Ansatz besteht darin, dass der Entwickler gezwungen ist, über die richtigen Zeichenfolgenformate nachzudenken und sich diese zu merken. Und ich riskiere einen Laufzeitfehler / eine Laufzeitausnahme, wenn wir keine zusätzlichen Prüfungen im Code hinzufügen, um die im Konstruktor übergebenen Zeichenfolgen zu überprüfen.
Eine andere Bibliothek hat im Wesentlichen zu viele Klassen erstellt, mit denen der Entwickler arbeiten müsste. Zusammen mit einer äquivalenten UOM vorausgesetzt , es ist ein DerivedUnit
und RateUnit
und so weiter. Im Wesentlichen war der Code für die von uns gelösten Probleme zu komplex. Diese Bibliothek würde im Wesentlichen jede: beliebige Kombination zulassen (was in der Einheitenwelt legitim ist), aber wir sind glücklich, unser Problem zu erfassen (unseren Code zu vereinfachen), indem wir nicht jede mögliche Kombination zulassen.
Andere Bibliotheken waren lächerlich einfach und hatten zum Beispiel nicht einmal eine Überladung der Bediener in Betracht gezogen.
Außerdem mache ich mir weniger Sorgen über Versuche, falsche Umrechnungen vorzunehmen (zum Beispiel: Volt in Meter). Entwickler sind die einzigen, auf die auf dieser Ebene zu diesem Zeitpunkt zugegriffen werden kann, und wir müssen uns nicht unbedingt vor solchen Fehlern schützen.