Как преобразователь, единицы измерения - это данные, которые на самом деле не принадлежат к коду.
Однако вы можете делать действительно классные вещи, если разбить свои единицы на «базовые» компоненты (длина, температура,Время, ...)
Таким образом, у вас может быть база данных, которая выглядит следующим образом:
минута = 1 x Время (где Время - это базовая единица измерения времени)
секунда = время / 60
час = время * 60
метр = 1 x расстояние
Klometer = 1000 x расстояние
...
Приятно то, что вы начинаете получать реальные гибкие возможности с формулами.Например, если бы у меня была некоторая информация, например, тот факт, что наблюдаемая мной улитка переместилась на 20 см за 3 минуты, я мог бы легко передать ее в уравнение скорости (скорость = дистанция / время), чтобы получить показатель скорости «Корень»,затем запросите результаты в единицах измерения (скажем, в милях и часах), чтобы я мгновенно получил результат в милях в час.
Вы даже знаете, какой информации вам не хватает - например, если вы дали расстояниеи спросить о скорости, он может ответить «Вам все еще нужно время».Или, если вы дадите расстояние и скорость, она может рассчитать время в выбранных вами единицах.
В любом случае, это все данные.Вероятно, у вас даже не должно быть разных классов для расстояния и времени.
Полагаю, я бы использовал фиксированный набор объектов измерения, как описано выше, который можно использовать для поиска преобразования (имя единицы, тип единицы,коэффициент преобразования) например («Минуты», ВРЕМЯ, 1)
Когда пользователь вводит значение с единицей измерения (скажем, пользователь вводит 3 часа), я просто смотрю эту единицу («Часы»), вычислите преобразование (180, ВРЕМЯ) и сохраните (180, ВРЕМЯ) где-нибудь.
Когда они просили отсчет в минутах, я бы посмотрел преобразование за минуты («Минуты», ВРЕМЯ,1) и используйте масштабный коэффициент (1), чтобы определить, что вам нужно напечатать 180 минут.
Если пользователь вводит значение, например 3 часа, и запрашивает скорость в метрах / секунду, вы можете запроситьрасстояние (которое пользователь может указать, используя любой тип расстояния) и легко преобразовать в требуемый результат.Преобразование в базовые единицы и использование масштабных коэффициентов устраняет почти все трудности.
Обоснование / обоснование:
Мое утверждение о том, что единицы измерения и коэффициенты преобразования не должны указываться в коде, вероятно,меня будут задавать вопросы ...
Я считаю, что вы НИКОГДА не должны иметь объектов, которые не имеют УНИКАЛЬНОЙ бизнес-логики.
Единственное различие между минутами и секундами будет заключаться в формуле, которая будетизменяются только в константе (где бы ни использовалась минута, вы также можете использовать секунду x 60 или час * (1/60), так что константа (1, 60, 1/60) не может вызвать создание нового класса сам по себе --это было бы абсолютно преступно.
Это верно для всех основных типов измерений, ни у одного из них нет уникальной бизнес-логики.