组件,隔离功能和'参考透明度'

时间:2015-12-31 04:34:20

标签: cyclejs

我有一个(相当哲学的)问题,提到cyclejs组件:Is isolate() referentially transparent?

查看之后复制的简化代码,我无法区分任何“杂质”来源。这是因为非简化代码引入它,还是因为函数会返回两个不同的对象和两个不同的引用?

在这种情况下,这两个对象不会具有相同的行为(即,监听和响应同一目标上的相同事件,并生成不同的vTree $,但它们封装完全相同的序列?)。如果是这样,那两个对象基本上是不一样的,即在程序中的任何地方替换一个不应该改变任何东西吗?这意味着isolate是否具有参考透明度?我哪里出错了?

实际上,如果两个调用都返回了不能替换的不同对象,那么这些对象有何不同?

function isolate(Component, scope) {
  return function IsolatedComponent(sources) {
    const {isolateSource, isolateSink} = sources.DOM;
    const isolatedDOMSource = isolateSource(sources.DOM, scope);
    const sinks = Component({DOM: isolatedDOMSource});
    const isolatedDOMSink = isolateSink(sinks.DOM, scope);
    return {
      DOM: isolatedDOMSink
    };
  };
}

1 个答案:

答案 0 :(得分:2)

  

我无法区分任何“杂质”来源。这是因为非简化代码引入它,还是因为函数会返回两个不同的对象和两个不同的引用?

简化代码不会引入杂质。如果未指定参数scope默认为newScope(),则该杂质来自这一事实。 The actual implementation of isolate()有:

function isolate(dataflowComponent, scope = newScope()) {
  // ...
}

newScope()的位置:

let counter = 0

function newScope() {
  return `cycle${++counter}`
}

意思是,如果scope未作为参数给出,则默认为隐藏全局counter的下一个值,每次调用isolate()时都会递增。

总之,isolate(component, scope)是引用透明的,因为我们提供scope,但isolate(component)不是。