Как конвертировать между любыми двумя единицами в Java с помощью qudtlib

Мы только что выпустили версию 1.0 нового проекта, qudtlib, который предлагает конвертацию единиц измерения и связанные с ней функции для более чем 1700 единиц измерения, при этом он довольно мал: размер jar с зависимостями составляет ~400 кБ. Проект основан на онтологии QUDT. В настоящее время она доступна только в Java, но в дальнейшем планируется расширение.

Например

Допустим, вы хотите перевести футы в световые годы, вот как будет выглядеть ваш java-код:

    Qudt.convert(
        new BigDecimal("1"),
        Qudt.Units.FT, 
        Qudt.Units.LY);
    --> 3.221738542107027933386435678630668E-17ly
Войти в полноэкранный режим Выйти из полноэкранного режима

Хорошо, откуда мы знаем, что это правильно? Легко: мы знаем, что свет проходит примерно один фут за наносекунду, поэтому если мы умножим это число на количество наносекунд в году, что составляет…

    Qudt.convert(
        new BigDecimal("1"),
        Qudt.Units.YR, 
        Qudt.Units.NanoSEC);
    --> 31557600000000000ns
Войти в полноэкранный режим Выход из полноэкранного режима

… мы получим около 1. Давайте попробуем:

    Qudt.convert(
        new BigDecimal("1"),
        Qudt.Units.FT, 
        Qudt.Units.LY).getValue()
        .multiply(
            Qudt.convert(
                new BigDecimal("1"), 
                Qudt.Units.YR, 
                Qudt.Units.NanoSEC)
                   .getValue()));
    --> 1.01670336216396744710635782571955168476800000000000
Войти в полноэкранный режим Выйти из полноэкранного режима

Получилось около 1. Кажется, работает 😉

Взлом

Нужная нам часть онтологии QUDT, включая некоторые дополнительные данные, которые мы генерируем, имеет размер около 3,5 МБ. Библиотеки, необходимые для доступа к данным для обеспечения нужной нам функциональности, имеют еще 30+ МБ. Мы посчитали, что это слишком много для такой простой задачи, как преобразование градусов Цельсия в градусы Фаренгейта (или футов в световые годы).

Поэтому мы перенесли всю тяжелую работу в препроцессор (т.е. maven), чтобы создать java-класс, который при запуске инстанцирует все объекты, представляющие соответствующую часть онтологии QUDT. Никаких SPARQL-запросов или другого мувинга RDF во время выполнения, ни одной внешней зависимости во время выполнения, всегда пожалуйста.

Большим плюсом такого подхода является то, что решение будет относительно легко перенести на другие языки.

Что в дорожной карте?

Typescript.

Что еще?

Ну, вы все еще не знаете, сколько футов составляет световой год, так почему бы вам не попробовать qudtlib и не узнать это?

Оцените статью
devanswers.ru
Добавить комментарий