首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中封装复杂计算

在JavaScript中封装复杂计算
EN

Code Review用户
提问于 2016-01-04 22:51:29
回答 1查看 84关注 0票数 8

这是用于执行应在不同级别和温度下重复的计算的代码。我关注这个代码的组织,因为我觉得它可能包含太多的助手函数,并且看起来有点不必要的复杂。只需要向浏览器公开getCharge()方法。

在初始定义之后有此代码的示例用法。

代码语言:javascript
复制
var hprVessel = function (level, temp) {
/**
* @params {Number} level - Percentage load for HPR 
* @params {Number} temp - temperature of fluid
*/
    var liquidCoefficients = [
        83.4485407734612,
        -0.111449280945489,
        0.000100022560084721,
        -0.00000206240663899928
    ];

    var vaporCoefficients = [
        0.895329190066827, 
        0.016635773286873, 
        -0.0000894924196507015, 
        0.00000206296636296276
    ];

    var vessel = {
        // Vessel-specific Params
        diameter: 1.9583 * level,
        height: 0.2937 * level,
        length: 15.9583 * level,

        // Calculations
        getLiquidVol: function () {     
            var r = this.diameter/2;
            var sectionArea = Math.pow(r, 2) * Math.acos((r - this.height) / r);
            var triangleArea = Math.sqrt(Math.pow(r, 2) - Math.pow((r-this.height), 2))*(r-this.height);

            return (this.length * sectionArea * triangleArea);
        },
        getVesselVol: function () {
            return (Math.PI * Math.pow(this.diameter, 2) * this.length);
        },
        getVaporVol: function () {
            return (vessel.getVesselVol() - vessel.getLiquidVol());
        },
        getLiquidCharge: function (temp) {
            return (vessel.getLiquidVol() * vessel.calcDensity(liquidCoefficients, temp));
        },
        getVaporCharge: function (temp) {
            return (vessel.getVaporVol() * vessel.calcDensity(vaporCoefficients, temp));
        },
        chargeHPR: function (temp) {
            return (1000 + vessel.getLiquidCharge(temp) + vessel.getVaporCharge(temp));
        },

        // Helper functions
        calcDensity: function (regressionCoefs, temp) {
            var liqDensityArray = regressionCoefs.map(function (coef) {
                return coef * Math.pow(temp, regressionCoefs.indexOf(coef));
            });

            return vessel.sum(liqDensityArray);
        },
        sum: function (arr) {
            return arr.reduce( function (prev, current) {
                return (prev + current);
            }
        }
    };

    return {
        getCharge: function() {
            return vessel.chargeHPR(temp);
        }
    };
}

var vessel = hprVessel(1, -30);
var result = vessel.getCharge();
EN

回答 1

Code Review用户

回答已采纳

发布于 2016-01-04 23:45:10

代码语言:javascript
复制
diameter: 1.9583 * level,
height: 0.2937 * level,
length: 15.9583 * level,

将这些数字放在一个常量中并适当地命名可能是明智的。这样,从长远来看,你不会忘记这些值是什么。

代码语言:javascript
复制
return (/* stuff */);

我注意到您在返回时也使用了parens。除非它们是个人偏好,否则它们实际上是可选的(你认为这是什么?PHP :P)

现在,使用原型继承而不是工厂模式,这些代码似乎更有好处。这是因为每次调用hprVessel时,它都会构建一个函数对象。通过原型继承,您的实例将只包含实例属性,也就是“容器特定的数据”。这些功能将通过原型在您的容器实例之间共享。

下面是一个简短的例子:

代码语言:javascript
复制
function HPRVessel(level, temp){

  // Instance data, aka vessel-specific data
  this.temp = temp;
  this.level = level;
  this.diameter = HPRVessel.SOME_CONSTANT * level,
  this.height = HPRVessel.ANOTHER_COSNTANT * level,
  this.length = HPRVessel.YET_ANOTHER_CONSTANT * level,

}

// pseudo-static properties
// Here we append general HPRVessel constants
HPRVessel.liquidCoefficients = [
  83.4485407734612,
  -0.111449280945489,
  0.000100022560084721,
  -0.00000206240663899928
];

HPRVessel.SOME_CONSTANT = 1.9583
HPRVessel.ANOTHER_COSNTANT = 0.2937
HPRVessel.YET_ANOTHER_CONSTANT = 15.9583

// Here, we define shared stuff. Best practice is to just put methods on it.
HPRVessel.prototype.getCharge = function(){
  // Anything on the instance is accessible via `this`
  return this._chargeHPR(this.temp);
};

// Since there's no "private", we use the convention of prefixing `_` to tell
// curious people not to call these methods directly
HPRVessel.prototype._chargeHPR= function(){
  return (1000 + this._getLiquidCharge(this.temp) + this._getVaporCharge(this.temp));
};

// Usage:
var vessel = new HPRVessel(1, -30);
var result = vessel.getCharge();
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/115846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档