0.12をリリースしました。almin/alminStoreとStoreGroupが書き直されたので色々変わっていますが、マイグレーションツールでアップデートできます。store}という組み合わせで定義を渡すようになりました。代わりにStore#getStateでステート名を返さなくても良くなっています。}古いStoreGroupの実装を使いたい場合はlegacy-store-groupにあるのでモジュールとして利用できます。この変更の主な目的は次の2つです。Store#getStateを単純にStateを返すように型の整合がとれたStoreGroup次のようにcontext.getState()した結果が、最初にコンストラクタで渡したStoreとStateの関係でマッピングされて自動的に型付けされたstateのオブジェクトを返すようになっています。知らないstateを参照してるちゃんとTypeScriptでコンパイルエラーになる。Payload)というメソッドを実装するとAlminのライフサイクルにおいて、それが呼びされるようになりました。ReactのcomponentWillReceiveProps(nextProps)と役割が似ています。これを導入した経緯は以下のIssueにも書いているのですが、クライアントサイドでCQRSをちゃんとやろうとしたのがAlminの開発目的の一つなので、その目的を再確認した結果として生まれました。almin/alminAlminの最初の目的として、writeとreadの掛け算の複雑さを一つのモデルに持たせるのはやめようというところから始まっています。1つのモデルですべてをやるのではなく、writeとreadの2つのモデルに分けることでこの複雑さの掛け算をなくす目的です。Model)の2種類にわけることで、ビジネスロジックはDomainに集中することができました。ViewはどのようなUIを目指すかによって、色々な細かいStateがでてきます。modelが変にUIを意識して書くケースをかなり減らせていたと思います。先ほどのスライドでいうと、DomainはWrite層で、StoreはRead層という分離ができていました。書いていくとStore側はRead層であるにもかかわらず、次のような書き込む処理が出てきています。}}このRead層にも書き込み処理があるのが気持ち悪いなーと思いました。Write層で作ったものをRead層に渡す方法(タイミング)がないとViewに反映されないので、Read層のどこかでStateを更新する必要があるのは明白です。JourneyというCQRSについて書かれた文書中に次のような図がでてきます。この図ではOrderViewModelGeneratorというRead層にあるものが、Read層のRepositoryにデータを書き込んでいる様子が見えます。0.11まではこのOrderViewModelGeneratorにあたるような、Read層のデータを更新する要素が明示的には存在していませんでした。そのため、次のようにRead層でWrite層からくるイベントを受け取って更新するという処理を各Storeに書いたりしていました。Payload)です。Payload)はWrite層からイベント発火やAlminのライフサイクルで呼び出されるため、先ほどのコードは次のように書くことができます。}単純に言えば、Storeのstateを更新する処理はreceivePayloadに書けばいいという形です。0.12でも今までのように自分でイベントを監視して更新する方法も動きます。Payload)を使ったほうが将来的な最適化の余地が生まれるのでこちらを推奨しています。Payload)はAlminのライフサイクル管理下にあるので、うまいこと処理をできる可能性があるということ)次のTodoMVCのサンプルでもその説明をしています。Almin.jsRead側のState更新アプローチ(次の前提の)Read側のState更新処理のアプローチ多く分けて2つあると思います。propertyのような形になってます。Managementというスライドは、その2つの方法についてわかりやすく書かれています。needede簡単に言えばgetterです。そのプロパティの値を取得するときに、計算して返すという形です。changesもう一つは、ソースとなる値が変化した時に事前に計算結果を作って置くという方法です。簡単に言えばキャッシュを事前に作っておくイメージです。この場合はlastNameかfirstNameの値が変化した時にfullNameというプロパティを計算して更新するということです。person.fullNameへアクセスした時はその結果を返すだけです。changesの方がコストが低くなるかもしれません。neededeで実際に読むこむときに遅延評価的に結果を作って返したほうがコストが低いです。Basedなやり方と言えます。Basedで更新する処理があるかが外から(この場合はStoreGroupから)はわかりません。