いっせいの!!細かなつぶやき

細かなことをぽつぽつと呟いてます

雑感

フレームワークとしてはコンダクター(conductor)が主役だなw
コンダクターのAPIの出来が成否を分ける気がする。
成否の基準は、自分のやる気が持つかどうか、だけだけどw


とりあえず考えるべきなのは、

  1. レセプター(receptor)が叩くAPI
  2. パフォーマー(performer)がイベントリスナーを登録するAPI
  3. アクター(actor)とやり取りするAPI
  4. 同一ドメインの他のがらくた(CRAP)と通信するAPI

くらいだな。


APIを考えるのと同時に通信方法も考えないと。
ハッキリ言って、通信コストがめっちゃ高いシステムになる。メッセージ駆動でデザインしてるんだから当然と言えば当然なんだけども。
単純にイベントリスナー等を使ってコールバック関数を呼べば済むものから、受け渡すデータをディープコピーしてスレッドはおろかwプロセス間のメッセージで渡すしか無いものまであると思う。
いずれにせよ、ユーザーがその辺を意識しないで済むように、ラップして統一した使い方が出来るようにしないとね。


ザクッとでも案が出来たら、泥臭〜くTypeScriptあたりでモックアップを試作してみて、色々試してみよ〜っとw

がらくたCRAPのイメージ

ユニットの概要

役割 スレッド 機能
receptor メイン UIによるイベントを受け付けてconductorに渡す
performer メイン conductorからの指示によりDOMを操作する
conductor WORK 各ユニットから通知を受け取り、調整して、必要な通知を飛ばす
actor(s) WORK 処理の本体。基本的に一つから数個で構成。conductorからの指示により処理を行う。actor間の通信もconductorを経由する

スレッド間の関係

メインスレッド
   +receptor
   +performer
   +conductor
          +actor 1
          +actor 2
                 :
          +actor n

ユニット間の関係

   receptor → conductor → performer
                  ⇅
               actor(s)


とりま、こんなところかな。

がらくたモデル (もしくは鯉)

DOMを扱う以上、パフォーマーがメインスレッドになるしか選択肢が無い。
画面入力を受け付けられるのもメインスレッドだけ。


となると、コンダクターはイベント全般を適切に管理するイベントマネージャーに徹するべきかもしれない。
画面入力受け付けは、別途「(R)レセプション」と言う役割を作って分離するか。


パフォーマーとレセプションはメインスレッドで動かす。
モデル名は「CRAP(ガラクタ)」に変更だな*1www

*1:「CARP(鯉)」でも良いんだけどね。私は生まれたときから広島カープのファンだしww

CAPモデルとworkerの仕様の齟齬w

ブラウザ上でCAPモデルを使うとするじゃん?
シングルタスクで動かすわけないから、workerを使ってマルチスレッド化するじゃん?
CAPモデルでは

  • (C)コンダクター ⇆ (A)アクター
  • (C)コンダクター ⇆ (P)パフォーマー

の通信を行うんだから、コンダクターが親になってアクターとパフォーマーを(workerとして)生成するのが自然じゃん?
コンダクターが配下のスレッド( = worker)を全て把握するんだから。


なのに、ブラウザエンジンの仕様見てると、マスタースレッドしかDOMを扱えないとなってる orz
webassembly が動くメジャーなブラウザ全てでww


必然的に(直接表示を行う)パフォーマーがマスタースレッドとなる。
パフォーマーがコンダクターを別スレッドで起動して、コンダクターがその他のアクターを起動する形になりそう。
つまり、「パフォーマー ⇆ コンダクター」の通信と、「コンダクター ⇆ アクター」の通信は、別物になるってことだ。


さらに言えば、メインスレッドでしかUI/UX系のイベントが受け取れないんだから、パフォーマーが入力受け付け機能を持つしか無いじゃん?


……ツラたん。

CAPモデル

私が思うに、まずは分業体制の観点から、入力、内部状態遷移、出力は、完全に分離されなければならない。
また非同期処理について人間が(なるべく)意識せずに済むようにしなければならない。


分業体制を考えるにあたり、

(C)コンダクター
入力機能。(コントロール等による)イベントの制御を行う。DOMやバックエンドのウェブサーバーとの通信等で発生するイベントを制御する。非同期処理の競合を調整したりするのも役目になると思う。調整されたイベントを後述のアクターに通知する。
(A)アクター
状態遷移の具体的な処理を行う。「状態(オブジェクト )」じゃなくて「状態遷移(処理)」。通知されたイベントと自分の状態(これはオブジェクト、てかプロパティか?)に基づく処理を行う。一般的なプログラムのイメージ。必要に応じて連動する別物ユニットに処理を依頼することになるが、これはコンダクターを介して行う。
(P)パフォーマー
出力機能。ビューの生成や表示を行う。HTML+CSSのイメージ。フレームワーク的には、アクターからの(コンダクター経由での)要請により、DOMツリーの生成、変更、削除を行う。ScssなりCSSを動的に制御できるのならそれも行う(要調査)


ってあたりをたたき台にして考えてみようと思う。
MVC」じゃ無くて「CAP」ね。

ノット MVC

何度も同じ話するけど、私は、MVC(モデル・ビュー・コントロール)って考え方はしない。


MVCモデルを否定してるわけじゃないよ。
コンピュータの黎明期から、てかその数学的モデルであるチューリング・マシーンにしてからが、「入力 → 内部状態遷移 → 出力」という「フレームワーク」に従ってるし、そのおかげで成功を収めて来た。
MVCも、C=入力、M=内部状態(遷移)、V=出力であって、コンソールアプリのそれをGUI用にリ・モデリングしたところに手柄がある。


とはいえ、時代の要請もあって、その概念はオブジェクト思考に縛られている。
人間の頭はオブジェクト思考に適してないのでw 結局はソフト開発が大規模化したり複雑化したりするにつれ、難しくなってきた。
時を同じくして発展してきた非同期処理(CPUのマルチコア化とか、linuxとかだと軽量なスレッドの発展とか)が、また人の思考の限界を超えててw 物事を難しくしてる。


ツール(道具)の進化に使う側が付いていけてない。
だからこそ、それをサポートするフレームワークが必要になる。