Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“帮助”;可扩展JavaScript应用程序体系结构“;_Javascript_Design Patterns_Publish Subscribe - Fatal编程技术网

“帮助”;可扩展JavaScript应用程序体系结构“;

“帮助”;可扩展JavaScript应用程序体系结构“;,javascript,design-patterns,publish-subscribe,Javascript,Design Patterns,Publish Subscribe,我正在构建一个大型javascript应用程序,并决定使用Nicholas Zakas的可伸缩应用程序架构设计: 根据他的系统,模块是自封装的,彼此不了解。。。然而,在我的项目中,我遇到过许多这样的例子,模块之间似乎有必要相互了解,因为它们本质上是一个更大整体的各个部分 例如。。我有三个模块:上传、窗口和管理器 单击上载选项时,会打开一个带有上载表单的弹出窗口。窗口“管理器”上还有一个链接 单击管理器链接更新弹出窗口以显示管理工具 这对我来说是最有意义的(伪代码): 。。。然而,这与原理背道

我正在构建一个大型javascript应用程序,并决定使用Nicholas Zakas的可伸缩应用程序架构设计:

根据他的系统,模块是自封装的,彼此不了解。。。然而,在我的项目中,我遇到过许多这样的例子,模块之间似乎有必要相互了解,因为它们本质上是一个更大整体的各个部分

例如。。我有三个模块:上传、窗口和管理器

单击上载选项时,会打开一个带有上载表单的弹出窗口。窗口“管理器”上还有一个链接

单击管理器链接更新弹出窗口以显示管理工具

这对我来说是最有意义的(伪代码):

。。。然而,这与原理背道而驰,因为上传和管理模块专门“请求”窗口模块做一些事情,因此他们知道它

因此,我能想到的唯一其他方法是:

upload module:
  upload option click --> sandbox.notification('upload option clicked', [...html markup for form...])

manager module:
  manager link click --> sandbox.notification('manager link clicked', [...html markup for admin tools...])

window module:
  sandbox.listen('upload option clicked') --> calls createPopUpWindow( passed in html markup  )
  sandbox.listen('manager link clicked') --> calls createPopUpWindow( passed in html markup  )
。。但这感觉不那么直观,老实说,我认为这让我的代码不那么清晰,因为查看上传模块的通知“upload option clicked”(上传选项已点击),根本无法告诉我点击时应该发生什么。。我必须在所有其他文件中查找正在侦听的模块。。。。。我想这可以看作是一个好处,因为多个模块可能希望响应“单击上载选项”,其中“需要弹出窗口”显然只能由一个模块来解决

但是当采用这种方法时,让我的上传模块传递一堆它不知道的与弹出窗口相关的html标记对我来说就没有什么意义了,它开始看起来像是窗口模块应该负责生成标记——但是很多标记是“上传”特定的,并且标记将事件侦听器绑定到upload模块中的函数——因此在窗口模块中使用它并不是真正合乎逻辑的。。。所以它开始变得非常混乱,什么是构建所有这些的最佳方式

我还有另外一种情况,问题更大。。两个模块:轨道和集装箱。容器有很多轨道,最初我只是在容器模块的内部有轨道函数——但是随着模块中的代码长度开始增长,为了干净的代码,我决定将这些分离到它们自己的模块中。。。无论如何,因为容器需要知道它的轨迹,并且能够在内部引用它们,所以我设置它的唯一方法是:

containerObject = function(name) {
    this.name                       = name;
    this.video_track                = {'name': 'video',   'markup': sandbox.notification('create-track', 'video')}
    this.audio_track                = {'name': 'audio_1', 'markup': sandbox.notification('create-track', 'audio')}
    ....etc....
};
因此,Track模块正在执行一个沙盒。listen('create-Track')并将其指向一个函数,该函数返回给定类型的新Track对象。。。。。也许它只是不值得有轨道,因为它是自己的模块。。。。。。因为这是我根据通知调用分配值的唯一地方

我很想听听其他熟悉pub/sub架构的程序员对这个话题有什么看法

请给我你的想法和建议


谢谢。

有许多模式处理对象间通信——这就是您真正的问题所在:通信

您的问题可以归纳为:

  • 您希望将功能分解为模块
  • 您希望模块尽可能独立,外部链接尽可能少
  • 然而,模块需要在“宏大的方案”中与其他模块协同工作
  • 第三个问题是给您带来的问题——您希望模块是独立的,但它需要与其他模块通信,以便您的程序能够工作

    一个典型的解决方案是模块向外部世界开放“标准化”的通信渠道。它不应该关心(或关心)这些通道的另一侧有多少、哪些、在哪里或什么对象。它只从输入通道接收命令,并向输出通道发送通知。一个很好的好处是能够轻松地对模块进行单元测试

    请注意,您的模块不应该关心另一面——四个W

    什么--不应该关心它正在与什么类或对象交谈(或倾听)

    where--不应该关心另一端在哪里(服务器?或在同一浏览器上)

    哪一个——不应该关心它与哪一个特定对象(总统,或者仅仅是一个工人)交流

    多少--不应该关心它同时与多少个对象交谈/倾听

    然后用主配置连接整个图形。这是依赖注入背后的基本概念

    至于管道,有几种方法/模式可以做到这一点:

  • 事件和处理程序
  • 发布/订阅
  • IOC/DI容器
  • 上面的组合

  • 在这里可以找到一个非常简单的实现,它与本次演讲密切相关:在这篇过去对我非常有用的文章中,我直接链接到N.Zakas和他的团队创建的“为代码提供核心结构的最简JavaScript框架”。几天前,Zakas自己在博客上介绍了这一点。希望这也会有用。
    containerObject = function(name) {
        this.name                       = name;
        this.video_track                = {'name': 'video',   'markup': sandbox.notification('create-track', 'video')}
        this.audio_track                = {'name': 'audio_1', 'markup': sandbox.notification('create-track', 'audio')}
        ....etc....
    };