타이머는 어떤 멋있는 곳이 있습니까?제3부분-다기능원자

우리는 계속해서 이 일련의 문장을 ChronoGraph의 특징을 묘사하여 다른 반응 시스템에서 돋보이게 한다.이전 게시물은 에 관한 것입니다.
이 글에서 우리는 타이머 원자(타이머 1에서 표지부라고 부른다)의 특성을 연구할 것이다.
우리가 시작하기 전에 언급해야 할 것은 다른 반응성 시스템에 비해 타이머는 서로 다른 각도에서 반응성을 처리한다는 것이다.대부분의 다른 라이브러리의 구축은 UI 생성 용례를 고려했다.타이머의 주요 용도는 Gantt project plan의 데이터 집합을 계산하는 것이다.이것이 바로 크론오그래프가 다른 반응식 라이브러리와 다른 기능 집합을 제공한 이유다.

아토믹스


원자는 모든 반응 시스템의 주요 구성 부분이다.일반적으로 원자는 하나의 상태와 그 상태를 계산하는 함수를 봉인한다.상태를 계산할 때 원자는 다른 원자의 상태를 읽을 수 있고 상태가 바뀔 때 자동으로 다시 계산할 수 있다.상태는 사용자가 직접 제공할 수도 있다.

동기식/비동기식


대부분의 무효 시스템은 동기화 계산 기능만 지원한다.타이머는 동기화 및 비동기화 계산을 지원합니다.
비동기 계산은 생성기 기반의 함수 형식으로 지원된다.만약 이러한 계산 결과가 Promise이라면 계산을 계속하기 전에 이 약속은'기다림'이다.
현재 프로미스 솔루션을 기다리는 것은 막혔지만, 이것이 바로 우리의 용례에 필요한 것이다. (이것은 Gantt project계획의 시간표를 계산하고 있다.)
이 특성의 용례는, 때때로, 계산 과정에서, 우리는 그것을 멈추고, 사용자에게 모드 대화상자를 보여주고, 데이터를 변경하는 방법을 물어보는 것이다.어떤 업무 논리 규칙을 위반할 때, 우리는 복구를 해야 하고, 여러 가지 방식으로 복구를 할 수 있다.이런 상황에서 우리는 계속 계산하기를 원하지 않고, 행동을 막아야 한다.
코드의 경우 다음과 같습니다.
const identifier6 = Identifier.new({
    *calculation  () : ChronoIterator<number> {
        // blocking asynchronous point
        yield new Promise(resolve => setTimeout(resolve, 100))

        const value1 : number = yield identifier1

        return value1 + 5
    },
})

게으르다/엄격하다


시계는 게으른 계산도 지원하고 엄격한 계산도 지원한다.
어떤 이유로 다른 라이브러리들은 계산의 타성에 대해 그리 많이 이야기하지 않았다.예를 들어 만약 내가 옳다면 S.js은 엄격한 계산만 있을 뿐이다.Mobx는 게으른 파생치와 엄격하고 효과적인'반응'이 있지만 엄격한 파생은 없다.
지연 계산은 일반적으로 사용자가 원하는 것으로, 최상의 성능을 제공하여 불필요한 재계산을 피하지만, 일부 용례에서는 아직 부족하다.
예를 들어, 너는 거대한 원자도를 가지고 있는데, 너는 그 중 하나를 바꾸었다.이 변경 사항은 전체 그림에 전파되고 그림의 어느 깊은 곳에서 업무 규칙을 위반하는 행위를 촉발할 수 있습니다.이 경우 위반으로 인한 변경 사항을 거부합니다.
분명히 이런 상황에서 지연 계산은 적합하지 않다. 왜냐하면 도형 깊은 곳의 수요 충돌을 놓치기 때문이다.요구 사항을 위반할 수 있는 모든 경로에 있는 계산은 엄격하게 실행되어야 한다.
원자의 타성은 lazy 설정에 의해 제어된다.
const identifier6 = Identifier.new({
    lazy : false
})

읽기/쓰기 조합 가능


일반적으로 반응 계약 설명 원자가 '읽기' 작업으로 구성되는 것은 UI 창설 용례에 충분합니다.
그러나 우리의 프로젝트 기획 시스템을 구축할 때 우리는 효과적인 사례를 발견했다. 만약에 Tom도'쓰기'에 글을 쓰면 이 문제는 쉽게 해결된다.'쓰시오 쓰시오' 에서, 내 말은 원자가 그것들의 값을 계산할 때 다른 원자를 쓸 수 있다는 것이다.
나는 이 특성이 해결되고 있는 구체적인 용례를 상세하게 묘사하지 않을 것이다.계산 값이 유효한 범위 (예: 마이너스 작업 지속 시간) 를 초과할 때, 그것은 매우 유용해지고, 다른 원자를 수정함으로써 이런 상태에서 회복될 수도 있다는 것을 말하고 싶을 뿐이다.
지금 이것은 계산의 순도 요구를 깨뜨린 것 같다.만약 반응성 시스템의 명확한 지원이 없다면, 그것은 정말로 붕괴될 것이다.만약 지원된다면, 'write' 는 특수한 효과가 될 것입니다.
그래서 타이머의 원자는'읽기'와'쓰기'두 방면에서 모두 구성된다.데모 테스트 용례:
    t.it('Base case - gen', async t => {
        const graph : ChronoGraph   = ChronoGraph.new()

        const var0      = graph.variableNamed('var0', 0)
        const var1      = graph.variableNamed('var1', 0)

        const varMax    = graph.variableNamed('varMax', 10)

        const idenSum   = graph.identifierNamed('idenSum', function* () {
            const sum : number  = (yield var0) + (yield var1)

            const max : number  = yield varMax

            if (sum > max) {
                yield Write(var0, (yield var0) - (sum - max))
            }

            return sum
        })

        const spy1      = t.spyOn(idenSum, 'calculation')

        //-------------------
        graph.commit()

        t.expect(spy1).toHaveBeenCalled(1)

        t.is(graph.read(idenSum), 0, 'Correct value')


        //-------------------
        spy1.reset()

        graph.write(var0, 5)
        graph.write(var1, 7)

        graph.commit()

        t.expect(spy1).toHaveBeenCalled(2)

        t.is(graph.read(idenSum), 10, 'Correct value')
        t.is(graph.read(var0), 3, 'Correct value')
    })

사용자 입력/파생 값


고전적인 무효 시스템은 일반적으로 두 가지 주요 원어인 사용자가 제공한 값(데이터, 네모난 상자)과 계산 값(내보내기 값, 계산)을 포함한다.그러나 UI 창설 용례에 있어서는 이 정도면 충분하다. 일부 시스템의 데이터 층을 모델링하는 용례에 있어서는 엄청난 비용을 초래할 수 있다.
매우 간소화된 프로젝트 계획을 고려해 보자. 그것은 하나의 임무로 구성된다.이 작업은 시작 날짜, 종료 날짜, 지속 시간 세 개의 원자와 변하지 않는 값 end = start + duration이 있습니다.
물론, 우리는 모든 세 개의 원자가 쓸 수 있기를 바란다. 우리는 사용자가 모든 작업 필드를 변경할 수 있기를 바란다. 다른 필드도 적응해야 한다.이 요구에 따라, 우리는 이 시스템에서 최소한 6개의 원자, 3개의 데이터 원자는 사용자가 입력하는 데 사용되고, 3개의 계산 원자는 '조정값'에 사용되어야 한다.이것은 원자수의 두 배다.
우리의 예에서 10k개의 임무가 있는 칸트도 프로젝트 계획에는 500k개의 원자가 있을 수 있다.별도의 데이터 원자를 사용하여 모든 데이터를 쓸 수 있게 하면 이 숫자는 배로 늘어나 100만 위안이 될 것이다.v8이 아주 잘 되어도 브라우저에서 수백만 개의 원자를 처리하는 것은 엄청난 작업량이라고 상상할 수 있다.
반대로 우리는'프로포즈드 OrPrevious'라는'환영'원자를 도입했다.이 원자에서 읽으면 사용자가 제공한 값이나 현재 원자의 이전 값을 되돌려줍니다.환상 원자는'주'원자 위의 소수의 속성으로 구성되어 너무 많은 자원을 소모하지 않는다.
계산 기능은 데이터를 읽지 않도록 선택할 수 있습니다
'환상'원자 - 이런 상황에서 원자는 고전적이고 순수한'파생'값이 된다.이것도phantom에서 데이터를 읽고 변하지 않는 값을 되돌릴 수 있다. 이런 상황에서 이것은 고전적인 순수한 '데이터' 원자가 된다.마지막으로 환상에서 데이터를 읽고 입력을 어떤 방식으로 처리하고 처리된 값을 되돌려줍니다. 이것은 '검증된' 사용자의 입력처럼 보일 수도 있습니다.
한 마디로 하면 타이머 원자는 다른 원자의 값에 따라 그들의 유형을 동태적으로 바꿀 수 있다. 사용자가 입력한 순수 파생값으로, 중간은 검증값이다.
설명 코드:
        const graph : ChronoGraph   = ChronoGraph.new()

        const max       = graph.variableNamed('variable', 100)

        const var1      = graph.identifier(function * () : CalculationIterator<number> {
            const proposedValue : number    = yield ProposedOrPrevious

            const maxValue : number         = yield max

            return proposedValue <= maxValue ? proposedValue : maxValue
        })

        graph.write(var1, 18)

        t.is(graph.read(var1), 18, 'Correct value #1')

        //------------------
        graph.write(var1, 180)

        t.is(graph.read(var1), 100, 'Correct value #2')

결론


그림에서 보듯이 ChronoGraph원자는 용도가 광범위하여 복잡한 업무 논리를 가진 데이터 영역을 모델링하는 데 사용할 수 있다.
사용자가 제공한 값과 파생 값에 대해 혼합 유형을 사용하면 원자 수가 배로 늘어나는 것을 피할 수 있다.쓸 때 원자를 조합하여 우아하게 가장자리 상황을 해결했다.마지막으로, 어떤 업무 규칙을 위반하면 시스템이 스스로 회복할 수 없으며, 계산을 멈추고, 비동기 계산을 사용하여 사용자에게 어떻게 계속하는지 물어볼 수 있다.
Dell의 시스템은 UI 생성 뿐만 아니라 data layer에서도 반응성을 입증했습니다.
한편 이번 주 시계는 1789년에 출시된 심플한 100% 그린파워 시계다.debs-eye촬영

좋은 웹페이지 즐겨찾기