【问题标题】:Components, Isolate function, and 'referential transparency'组件、隔离功能和“参考透明度”
【发布时间】:2015-12-31 04:34:19
【问题描述】:

我有一个(相当哲学的)问题,它指的是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
    };
  };
}

【问题讨论】:

    标签: cyclejs


    【解决方案1】:

    我无法区分“杂质”的任何来源。那是因为未简化的代码引入了它,还是因为该函数将返回具有两个不同引用的两个不同对象?

    简化的代码没有引入杂质。杂质来自参数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) 不是。

    【讨论】:

    • 好的,我明白了。感谢您的澄清。我开始认为这可能是因为组件功能不纯(在您在页面中提供的示例中,该组件查询一个 DOM 类。在某一时刻返回一个元素;当您添加第二个滑块时,返回两个= 所以相同的输入(类),不同的输出)。但是,如果我现在明白了,您选择通过添加随机范围来“净化”组件功能,并且以不纯的 isolate 功能为代价。
    猜你喜欢
    • 2011-06-18
    • 2015-05-13
    • 2020-02-13
    • 2013-06-05
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多