有效地将单位从一种系统转换为另一种系统

Efficient way to convert units from one system to another

本文关键字:系统 一种 转换 另一种 单位 有效地      更新时间:2023-09-26

我很难找到一种有效的方法来将不同类型的单位转换为各种其他类型。

切换情况会起作用,但在我看来,这不是一个有效的方法,因为我将有3个不同的系统(SI, Imperial和US)。

我的转换器(在我的应用程序内)将始终转换从SI到某物或从某物到SI。它降低了复杂性,但我仍然需要关于如何编写干净代码的建议。

我已经定义了转换的输入参数是Value(数字)和Unit(字符串)。
我有两个函数。SIToSomething(value, unit)和SOmethingToSi(value, unit).

单位是定义的,因为我将转换长度,重量,数量等。

你有什么建议?

这个怎么样:

var converters = {
    'SIToImperial' : {
        'cm' : function(val) {
            // implementation, return something
        },
        'kg' : function(val) {
            // implementation, return something
        } //, etc.
    },
    'SIToUS' : {
        'cm' : function(val) {
            // implementation, return something
        },
        'kg' : function(val) {
            // implementation, return something
        } //, etc.
    },
    'USToSI' : {
        'cm' : function(val) { /* ... */ } // etc
    } // , etc
}
SIToSomething(value, unit, system) {
    return converters["SITo" + system][unit](value);
}
var meterInImperial = SIToSomething(100, 'cm', 'Imperial');
var fiftyKilosInUS = SIToSomething(50, 'kg', 'US');

您可以做的是有一个基本单位,并为每个目标单位定义与该基本单位之间的转换函数。然后,要将A转换为B,例如,您可以这样做:

A -> base -> B

这样,每个单位(不包括基本单位)只需要两个转换函数:

var units = {
    a: {
        toBase: function(value) { return value * 2; },
        fromBase: function(value) { return value / 2; }
    },
    b: {
        toBase: function(value) { return 1.734 * value + 48; },
        fromBase: function(value) { return (value / 1.734) - 48; }
    }
}
function convertFromTo(unitA, unitB, value) {
    return unitB.fromBase(unitA.toBase(value));
}
convertFromTo(units.a, units.b, 36489);

完成与SI之间的所有转换。例如,如果转换为Imperial->US,您将执行Imperial->SI->US。

这是您可以投入的最小努力。

相关文章: