2015-12-31 3 views
2

У меня есть (довольно философский) вопрос, который относится к компонентам 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 
    }; 
    }; 
} 

ответ

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) нет.

+0

ОК, я понимаю. Спасибо за разъяснения. Я пришел к выводу, что, вероятно, из-за того, что функция компонента не была чистой (в примере, который вы указываете на странице, компонент запрашивает класс DOM. В какой-то момент возвращает один элемент, когда вы добавляете второй слайдер, который возвращает два = такой же вход (класс), разные выходы). Но тогда, если я сейчас понимаю, вы решили «очистить» функцию компонента, добавив случайную область и за счет нечистой функции «изолировать». – user3743222