为什么那么多框架都设计有Context?

为什么需要context?把所有环境上的东西都挂载到context,是不是类似于全局变量的作用?不担心各个插件会对context上的“环境变量/全局变量”造成重名?

context比起全局变量的一个巨大优势,就是他可以有很多套同时存在组成sandbox。这就好像你可以同时创建多个appdomain,然后跑.net的程序一样。

被人用来构造超大规模软件系统的语言,只有C++一个在几年前升级到了有闭包的概念,可想而知context是你永远也逃避不了的事情,一定会出现在你的系统里。

另一个原因是,context是optional的,在运行的时候他可以存在或者不存在。你可没办法在程序运行了一半的时候把一部分代码删掉,然后其他调用这些函数的代码就假装他没了然后跳过。你要做这种事情,不管语言多高级,都只能用context。

这在设计模式里面有时被称作“足球模式”

即,整个调用链把一个足球从最上层的调用者踢到最下层的被调用者,然后再一层层踢回来

虽然名字很搞笑,但是复杂度到一定程度的系统都需要或多或少的“足球模式”,因为把足球打散成几十个变量更愚蠢。即使是函数式编程也毫不例外(当然他们的做法是每次复制一个新球,继续踢,这样就immutable了,多棒!)

  1. 在多线程出现之前,就已经有软件工程论在否定全局变量。然而全局变量除了臭名昭彰的耦合效果外,他却有一个很好用的效果:间接提升了某些数据的作用域,并保证了这些数据的生命周期(放在很多脚本语言里,就是挂载在这个全局变量下的成员)。这个效果让很多同学们爱不释手。
  2. 于是就有了那么些语言设计出不那么全局的“变量”, 例如线程局部的全局变量来避免线程冲突;例如有栈协程局部的“全局变量”;当然还有那个最出名的,,this指针,类局部的“全局变量”(我也是用this指针来实现了无栈协程局部的“全局变量”)。他们通过把场景所对应的数据粒度划分细为各种context,避免了使用冲突和过度的耦合
  3. 还有“匿名”形式的闭包局部的 “全局变量”,如闭包的捕获的那些局部变量, 其实也属于一个新的结构体。他通过拷贝延长了一部分局部变量的生命周期,为此创建了一个匿名context

综上: 出现在各种场景下的 context,不外乎上面提到的种种,主要是为了 1. 场景划分,局部处理 2. 延长或者转移局部变量的生命周期和可见性。问题主提到的各种框架,显然可以从上面这些方法论中吸取足够的营养。语法不是问题,语义才是重要的。

猜你喜欢

转载自blog.csdn.net/c710473510/article/details/89021373