TL; DR : estoy tratando de diseñar una estructura de datos óptima para definir unidades dentro de una unidad de medida.
A Unit of measurees esencialmente una value(o cantidad) asociada con a unit. Las unidades SI tienen siete bases o dimensiones. A saber: longitud, masa, tiempo, corriente eléctrica, temperatura, cantidad de sustancia (moles) e intensidad luminosa.
Esto sería bastante sencillo, pero hay una serie de unidades derivadas, así como tasas que usamos con frecuencia. Una unidad combinada de ejemplo sería el Newton: kg * m / s^2y una tasa de ejemplo sería tons / hr.
Tenemos una aplicación que depende en gran medida de las unidades implícitas. Incorporaremos las unidades dentro del nombre de la variable o columna. Pero esto crea problemas cuando necesitamos especificar una unidad de medida con diferentes unidades. Sí, podemos convertir los valores en la entrada y en la pantalla, pero esto genera muchos códigos generales que nos gustaría encapsular dentro de su propia clase.
Existen varias soluciones en codeplex y otros entornos colaborativos. La licencia para los proyectos es aceptable, pero el proyecto en sí mismo generalmente termina siendo demasiado ligero o demasiado pesado. Estamos persiguiendo a nuestro propio unicornio de "justo".
Idealmente, podría definir una nueva unidad de medida usando algo como esto:
UOM myUom1 = nueva UOM (10, voltios);
UOM myUom2 = nueva UOM (43.2, Newtons);
Por supuesto, utilizamos una combinación de unidades imperiales y SI basadas en las necesidades de nuestros clientes.
También necesitamos mantener esta estructura de unidades sincronizadas con una tabla de base de datos futura para que podamos proporcionar el mismo grado de consistencia dentro de nuestros datos también.
¿Cuál es la mejor manera de definir las unidades, las unidades derivadas y las tasas que necesitamos usar para crear nuestra clase de unidad de medida? Pude ver el uso de una o más enumeraciones, pero eso podría ser frustrante para otros desarrolladores. Una sola enumeración sería enorme con más de 200 entradas, mientras que varias enumeraciones podrían ser confusas en función de las unidades SI frente a las imperiales y un desglose adicional basado en la categorización de la unidad en sí.
Ejemplos de Enum que muestran algunas de mis preocupaciones:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
Nuestro conjunto de unidades en uso está bastante bien definido y es un espacio finito. Necesitamos la capacidad de expandir y agregar nuevas unidades derivadas o tasas cuando tengamos la demanda de los clientes. El proyecto está en C #, aunque creo que los aspectos de diseño más amplios son aplicables a múltiples lenguajes.
Una de las bibliotecas que miré permite la entrada de unidades de forma libre a través de una cadena. Su clase de UOM luego analizó la cadena y las cosas ranuradas en consecuencia. El desafío con este enfoque es que obliga al desarrollador a pensar y recordar cuáles son los formatos de cadena correctos. Y corro el riesgo de un error / excepción de tiempo de ejecución si no agregamos verificaciones adicionales dentro del código para validar las cadenas que se pasan en el constructor.
Otra biblioteca esencialmente creó demasiadas clases con las que el desarrollador tendría que trabajar. Junto con un equivalente UOM proporcionó una DerivedUnity RateUnitetcétera. Esencialmente, el código era demasiado complejo para los problemas que estamos resolviendo. Esa biblioteca esencialmente permitiría cualquiera: cualquier combinación (que es legítima en el mundo de las unidades), pero nos complace analizar nuestro problema (simplificar nuestro código) al no permitir todas las combinaciones posibles.
Otras bibliotecas eran ridículamente simples y ni siquiera habían considerado la sobrecarga del operador, por ejemplo.
Además, no estoy tan preocupado por los intentos de conversiones incorrectas (por ejemplo: voltios a metros). Los desarrolladores son los únicos que tendrán acceso a este nivel en este momento y no necesariamente tenemos que protegernos contra ese tipo de errores.