Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

组件依赖级别与依赖树

  一个组件总是可以分为定义和实现两部分,也许在一些语言或框架中并没有直接区分这些,但这个概念确实很重要。在一些编程语言中确实有明确区分定义和实现,最典型的就是 C++。在 C++ 中我们通常会把程序的定义放在 .h 的头文件中,把实现放在 .cpp 的源文件中。
  组件之间的依赖关系可以分为三个级别:
  • 定义依赖
  • 直接依赖
  • 间接依赖
  一些组件会直接在定义时依赖另一些组件,如果依赖加载失败则无法成功定义组件。因为定义阶段的代码是顺序执行的,定义本身是一个有序的问题。所以定义依赖的级别上是不允许出现互相依赖的。通常定义依赖如果有问题,程序就根本 build 不起来。
  直接依赖的级别就相对弱一些,它是创建实例、调用静态方法或访问静态属性时产生的依赖。因为它是运行时才执行的,一个类定义后可能在程序执行过程中一次都没被用到过,所以即使定义有问题也未必会暴露出来。但是即便如此,直接依赖还是属于同步调用,如果调用一个不存在却依赖的方法会使程序出现致命错误而奔溃。
  我以前写过一个叫 predeclare.js 的 AMD 库,里面提供了一套将定义依赖降级为直接依赖的方案。不过现在看起来确实有点蠢,真正好的架构肯定不会存在在定义层的循环依赖问题。
  最后的间接依赖可以理解为异步调用,调用不是直接从主线程或主执行帧中发起的。即便调用出错也不会导致整个程序的奔溃,可能只是某个功能无法使用,或产生一些脏数据。
  不过也许有人对我的「间接依赖」表示有异议,那可能是因为脑子里将 pub/sub 或 Event Model 的概念往上套的缘故。实际上讨论模块间的依赖,其大前提就是模块间的。而 pub/sub 这样的东西已经属于独立的服务,也就是说如果两个模块通过 pub/sub 来共享数据,那就不能称之为模块间的依赖,而是两个模块共同依赖于一个服务。
  我扯上面这一推概念的目的是为了引出下面的话题,如何确定一棵依赖树?以前我也很迷茫,依赖树这东西到底要怎么理解?导致我迷茫的原因就是没有把依赖级别搞明白,想当然地就认为「一组模块的依赖关系可以分析出一棵依赖树」。实际上对于一组模块的依赖关系,在每一个依赖级别上都能分析出一棵依赖树。
  定义级的依赖树通常是扁平的,而且不可能有循环依赖的,它比较适合作为目录结构设计的参考。而直接依赖的依赖树可能就比较深,也可以存在循环依赖,所以它不应该作为目录结构设计的参考,但可以从这个级别的依赖上整理出类视图以便开发。间接依赖这个级别可能就更复杂,甚至已经无法用树结构来描述了,确切地说它应该是个图。
  这么一细分,概念就清晰多了。所以不要笼统地说什么「依赖树」,我·听·不·懂!
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^