TL; DR - J'essaie de concevoir une structure de données optimale pour définir les unités au sein d'une unité de mesure.
A Unit of measure
est essentiellement une value
(ou quantité) associée à a unit
. Les unités SI ont sept bases ou dimensions. À savoir: longueur, masse, temps, courant électrique, température, quantité de substance (moles) et intensité lumineuse.
Ce serait assez simple, mais il existe un certain nombre d'unités dérivées ainsi que des taux que nous utilisons fréquemment. Un exemple d'unité combinée serait le Newton: kg * m / s^2
et un exemple de taux serait tons / hr
.
Nous avons une application qui dépend fortement des unités implicites. Nous incorporons les unités dans le nom de la variable ou de la colonne. Mais cela crée des problèmes lorsque nous devons spécifier une unité de mesure avec différentes unités. Oui, nous pouvons convertir les valeurs en entrée et afficher mais cela génère beaucoup de code de surcharge que nous aimerions encapsuler dans sa propre classe.
Il existe un certain nombre de solutions sur le codeplex et d'autres environnements collaboratifs. Les licences pour les projets sont agréables mais le projet lui-même finit généralement par être trop léger ou trop lourd. Nous chassons notre propre licorne de "juste ce qu'il faut".
Idéalement, je pourrais définir une nouvelle unité de mesure en utilisant quelque chose comme ceci:
UOM myUom1 = nouvelle UOM (10, volts);
UOM myUom2 = nouvelle UOM (43.2, Newtons);
Bien sûr, nous utilisons un mélange d'unités impériales et SI en fonction des besoins de nos clients.
Nous devons également garder cette structure d'unités synchronisée avec une future table de base de données afin que nous puissions également fournir le même degré de cohérence dans nos données.
Quelle est la meilleure façon de définir les unités, les unités dérivées et les taux que nous devons utiliser pour créer notre classe d'unités de mesure? Je pouvais voir utiliser une ou plusieurs énumérations, mais cela pourrait être frustrant pour d'autres développeurs. Une énumération unique serait énorme avec plus de 200 entrées, tandis que plusieurs énumérations pourraient être source de confusion en fonction des unités SI vs impériales et d'une ventilation supplémentaire en fonction de la catégorisation de l'unité elle-même.
Enum exemples montrant certaines de mes préoccupations:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
Notre ensemble d'unités utilisées est assez bien défini et c'est un espace fini. Nous avons besoin de pouvoir étendre et ajouter de nouvelles unités ou taux dérivés lorsque nous avons la demande des clients pour eux. Le projet est en C # bien que je pense que les aspects de conception plus larges sont applicables à plusieurs langues.
L'une des bibliothèques que j'ai examinées permet la saisie sous forme libre d'unités via une chaîne. Leur classe UOM a ensuite analysé la chaîne et placé les choses en conséquence. Le défi de cette approche est qu'elle oblige le développeur à réfléchir et à se souvenir des formats de chaîne corrects. Et je court le risque d'une erreur / exception d'exécution si nous n'ajoutons pas de vérifications supplémentaires dans le code pour valider les chaînes transmises dans le constructeur.
Une autre bibliothèque a essentiellement créé trop de classes avec lesquelles le développeur devrait travailler. En plus d'un UOM équivalent , il a fourni un DerivedUnit
et RateUnit
et ainsi de suite. Essentiellement, le code était trop complexe pour les problèmes que nous résolvons. Cette bibliothèque permettrait essentiellement n'importe quelle: n'importe quelle combinaison (ce qui est légitime dans le monde des unités) mais nous sommes heureux d'étendre notre problème (simplifier notre code) en n'autorisant pas toutes les combinaisons possibles.
D'autres bibliothèques étaient ridiculement simples et n'avaient même pas envisagé la surcharge de l'opérateur par exemple.
De plus, je ne suis pas aussi inquiet des tentatives de conversions incorrectes (par exemple: volts en mètres). Les développeurs sont les seuls à accéder à ce niveau à ce stade et nous n'avons pas nécessairement besoin de nous protéger contre ce type d'erreurs.