4

我正在寻找在 javascript 中模拟接口和 DTO 来解决这个问题。对象 dto、对象调用者和同一接口 IWorker 的不同实现。

调用者将收到一个用于实例化的 dto,将用户输入提供给它,然后调用 Iworker 的正确实现(方法执行)。

我希望在我的代码中我只有一个 dto 实例和一个调用者实例,所以每次用户做出另一种选择时我都会调用 caller.CallWorker()

请告诉我这个想法是否好,欢迎使用 javascript 实现

非常感谢

编辑:感谢您的帮助,将采用 Bergi 解决方案,但我还需要一件事 所以我的实现将是这样的:

var caller = {
    callWorker: function(obj) {
        if(obj.id == 1)  Worker1.execute();
        if(obj.id == 2)  Worker2.execute();
        if(obj.id == 2)  Worker3.execute();
    }
};

但这意味着我必须在 html 页面中添加所有工作人员定义(每个实现一个 js 脚本)。我只想动态添加脚本,实际上活动工作者依赖于很多业务逻辑,所以我将动态包含它们以使页面中只有活动工作者。你建议我怎么做?做 caller.callworker 中的所有条件吗?或者有更优雅的方法。

4

4 回答 4

6

我正在寻找模拟界面

动态类型语言 JavaScript 中没有“接口”,也没有类。最近模拟是检查给定对象是否具有特定方法集的函数;但它不能进行任何类型或功能测试。

和 DTO

最接近 DTO 的是 JSON 可序列化对象。这意味着它没有循环,不包含Date对象甚至宿主对象。

我希望在我的代码中我只有一个 dto 实例和一个调用者实例,所以每次用户做出另一种选择时我都会调用 caller.CallWorker()

那是另一种设计模式:单例。它们可以很容易地用 JS 编码,因为可以动态创建对象,并且不需要需要防止多次实例化的类和构造函数。只需为它们使用对象文字。

欢迎使用 javascript 实现

这只是一个简单的示例,但您可以在需要的地方扩展它:

function makeDTO(id) {
    // creates a basic data structure, with empty or default values or from parameters
    return {
        id: id,
        userInput: [],
        validate: false,
        …
    };
}
var caller = {
    callWorker: function(obj) {
        // do something
    }
};

var dto = makeDTO(14);
caller.callWorker(dto);
var asString = JSON.stringify(dto);

或者有更优雅的方法。

使工人成为一个数组或对象。例如

var workers = {
    1: {/* std worker #1 */},
    …
};
// then the caller will look like this:
var caller = {
    callWorker: function(obj) {
        var workerName = obj.id; // just the id? Or something more complex
        if (workerName in workers)
            workers[workerName].execute(obj);
        else
            dynamicallyLoadWorker(workerName, function callbackWhenLoaded(worker) {
                workers[workerName] = worker;
                worker.execute(obj);
            });
    }
};
于 2013-02-08T22:13:05.000 回答
2

由于 JavaScript 是动态类型的,因此不需要interface构造。您可以为每个实现调用您的方法,而无需从接口继承。就 DTO 而言,同样的答案确实适用。您可以根据需要使用 JSON 构造一个对象,并通过网络传输它,而无需您提到的任何静态类型构造。

于 2013-02-08T21:59:13.997 回答
2

JS.Class允许您创建接口

于 2013-02-08T22:02:17.583 回答
0

关于接口:

对于 javascript,有JSDoc @interface

如果您更喜欢 Typescript,请选择Interfaces

如果您只想从 IDE 中获得一些关于已定义和未定义的代码提示,我最近使用了JSDoc @typedef

/**
 * @typedef {Object} MyType
 * @property {boolean} foo
 * @property {function} bar
 * @property {(running|paused)} baz
 */
于 2021-12-15T08:16:49.423 回答