2

这可能是一个维基问题,但仍然如此。哪种方法更符合 Javascript 精神:

var Report = function(data) {
    var that = this;
    that.send = function() { ... };
};

var r = new Report(data); // create and validate the data
r.send(); // encode and send the data

或者

var sendReport = function(data) {
    ...
    // create, validate, encode and send the data
    ...
};

第一种方法似乎更OO,第二种更实用?首先,似乎 的功能Report更易于测试(尽管例如我们仅send()在此阶段具有)。Report此外,当需要检查状态时,我喜欢在调试器中查看类型对象。

第二种方法可能更“简单”,但似乎不太可测试。

我个人采用第一种方法,但问题是我是否尝试在“错误”域中应用 OO“原则”(请帮助我更好地表达我的问题)。

4

5 回答 5

1

您的问题实际上似乎与new运营商无关;它更多的是关于您是否应该使用 OO 或函数式编程。

在这方面,OO 完全属于JavaScript 的范畴。您可以从 API(例如 eg)中看到 JavaScript 是一种非常面向对象的语言。

HTML5 更进一步,通过向对象添加新方法,让您可以更好地控制Object对象。

谈到使用new,以及是否避免使用,我会向您指出这个出色的答案(并告诉您使用new)。

于 2012-07-18T09:26:14.843 回答
1

data我现在看到的方式是,第二个是一个接收和发送它的简单函数。而且您想知道将其创建一个类并将其分解为多个方法是否有利。

所以代替这个:

sendReport(data);

你会这样做:

var a = new Report(data);
a.send();

WhereReport有 2 种用于验证和编码的内部方法。它肯定会更具可测试性,因为它们将是 3 个不同的功能,而不是一个只在一批中完成所有功能的功能。

性能无需考虑,它是 2 个额外的函数调用和 1 个额外的对象创建。您可能不会每秒发送数百万次报告。特别是因为它意味着网络 I/O。

也没有什么需要你构建一个新实例,你也可以这样做:

var report = {
    encode: function(){},
    validate: function(){},
    send: function( data ) {
        if( this.validate( data ) ) {
            data = this.encode(data);
        }
        else {
             //?
        }

        //send
    }
}

然后,您无需构建新实例即可获得上述好处:

report.send(data);
于 2012-07-18T09:51:36.567 回答
0

这取决于,但通常您希望在代码较小时使用第二个,并在代码变大时迁移到第一个。让所有东西都面向对象是没有意义的,但是当你拥有作为对象有意义的功能组时,那就是你想要创建对象的时候。

当单个函数做太多时,您的第二个选项只是不太可测试。否则它是非常可测试的,只需改变函数的参数并查看结果即可。

于 2012-07-18T09:24:52.870 回答
0

当您想要实例化变量的对象时,更多地使用 javascript 对象,当您可以使用 js 的原型并且还允许您覆盖方法和变量时。

于 2012-07-18T09:42:04.863 回答
0

正如其他人所建议的那样,我不认为这真的是关于 OO 与功能的。

真正的问题是报告本身是否是一个有用的抽象。如果是——即,如果你想对它执行其他操作而不是立即发送它——那么为它实现一个抽象是有用的。在 OO 中,这将是一个类或等价物(在 JS 中,一个构造函数)。在函数式语言中,您通常会在这种情况下引入模块或抽象数据类型。

如果您不需要抽象,只需使用单个过程/函数。

于 2012-07-18T09:56:50.083 回答