【问题标题】:Javascript : Interface and DTOJavascript:接口和 DTO
【发布时间】:2013-02-08 21:21:49
【问题描述】:

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

调用者将收到一个用于实例化的 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 中的所有条件吗? 或者有更优雅的方法。

【问题讨论】:

    标签: javascript oop


    【解决方案1】:

    我正在寻找模拟界面

    动态类型语言 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);
    

    或者有更优雅的方法。

    让workers成为一个数组或对象。例如

    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);
                });
        }
    };
    

    【讨论】:

    • 我已经编辑了这个问题,我还需要一个建议。感谢您的帮助。
    • 我不需要 dynamicLoadWorker。我将在页面的第一次加载中包含所有活动的工作者 js 文件,并将生成数组工作者服务器端也感谢您的解决方案
    • 啊,我看到你想要pre-动态加载它们。但是,您可以看到使用集合的机会……
    • 是的,我将只预加载活跃的工作人员,甚至可能将所有 js 文件缩小到一个,因为它是一个公共网站,我需要高性能和高速加载
    【解决方案2】:

    JS.Class 允许您创建interfaces

    【讨论】:

    • 有很多js框架所以我不知道从哪里开始。 Microsoft with typescript, google ...你认为我最好学哪一个?或者只是 JS OOP 就足够了
    • 为什么要使用 JS.Class 而不是 Typescript?除非有原因,否则似乎是一个奇怪的建议
    【解决方案3】:

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

    【讨论】:

    • 我必须对动态类型的语言进行一些搜索。所以如果我理解你,我可以这样做:function doSomething(obj){ if obj.id == 1 obj.execute();如果 obj.id == 2 obj.doExecute(); };所以不需要实现接口,也许只是为了优雅的目的。
    【解决方案4】:

    关于界面:

    对于 javascript,有 JSDoc @interface

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

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

    /**
     * @typedef {Object} MyType
     * @property {boolean} foo
     * @property {function} bar
     * @property {(running|paused)} baz
     */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多