LoginSignup
84
82

More than 5 years have passed since last update.

Ardaの設計指針と設計思想

Last updated at Posted at 2015-02-18

@armorik83 さんの記事を受けて Fluxフレームワーク Arda が気になる10の理由 - Qiita 設計思想とか指針とか残しておきます。

Ardaは実践的なものを目指した

他のフレームワークは思想から入って実装されたものかもしれませんが、ArdaはFluxを意識しつつも実際のアプリで使われている画面遷移の機構を抽象化する点から開発がスタートしています。

またKobitoという比較的寿命が長い(ことを予定している)アプリの基盤にすることで長くメンテされる予定です。なのでKobitoはちゃんと使ってもらえるようなものにしたい、と思って開発しています。(この記事が宣伝兼ねてないとは言いませんが。)

(自分の開発したものにしては)ドキュメントが充実していることについて

  1. 開発者の今回の様子に並ならぬ本気を感じる

これは発表資料でも述べましたが、僕自身が弊社の中でソロ作業気味で属人化しつつあるので、Ardaを界隈の普遍知識というレイヤーまでおし上げることでメンテ可能性をあげたい、そういう意識がありました。社内で意図を伝えるよりググってくださいといえるようになりますからね。(この投稿もそういう意図です)

だいぶ気宇壮大な感じですね。まあそれだけのものを狙っているということです。

Component について

色々褒められて嬉しいのですが、これは単にstarter-projectでは僕が使いたいスタックを選んでいるだけで、すべて交換可能です。Ardaはdispatchというmixinを提供している以外は特別なことはしていません。

Routerについて

今後URL方面の扱いをどうしていくのか方向性がすでに思い浮かんでいるならば早めに聞けたらいいな

不幸なことに、今のフロントエンドにはRouterの実装はデファクトがありません。いろんな実装が出ては消えていきます。(あったら教えて下さい)

今でも用途によってhashchangeを使いたいときはありますし(index.html#foo/barのような)、pushstateを使いたい時もあります。今後はServiceWorkerへの対応も必要になるでしょう。(ServiceWorkerには結構な未来を感じています)

その抽象化をするのはかなり努力が必要です。僕がやるにしても、Ardaとして実装することはなく、別のライブラリの実装となるでしょう。

Ardaの方針は「Routerに使われる側としての振る舞い」を意図しています。

想定しているAPIとしては次のようなものです。

var router = new Arda.Router(Arda.DefaultLayout, document.body)

something_great_router.route('/item/:id', (params) => router.pushContext(ItemContext, {id: params.id}))

Arda.RouterはRouterという名前がよくないという指摘をいくらか受けました。あとでリネームするかもしれません。

Overworld(Ardaのプロトタイプ)においてはArda.RouterはPortalというclass名でしたが、抽象的過ぎてArdaで継承しませんでした。やめました。

Dispatcherが薄いことについて

一番いいたいことについて。

他のフレームワークと比較するとDispatcherが単にEventEmitterであることを押し出したArdaは、FluxにしてはAction/Dispatcherが貧弱に見えるかもしれません。これは十分承知しており、これには理由があります。

まず一点、pubがsubの存在を一切知らないことを意図しています。これにより非常にテストしやすい。テストを書くときは何かをクリックした時に何かがemitされたところまで確認すればいいわけですからね。

他のFluxでよくある定数管理とかは別にEventEmitterとは関係ない機構です。好きにTypeScriptでenumしたりしてください。

そもそもただのEventEmitterなので好きにラップしてくれという気持ちがあります。contextがそもそもEventEmitterインスタンスで, subscribe関数はただのcontext.on(...)のヘルパです。

たとえば、ただのEventEmitterなので、RxJSのEventEmitterのストリーム変換を書いたり出来るわけです。

var updateStream = Rx.Node.fromEvent(context, 'updated');
updateStream.subscribe((...args) => {...})

これに関してはフレームワーク側はEventEmitterの参照管理と破棄等、最小限の機能しか提供するつもりがありませんでした。ミニマリストとしてはpub/subのアプローチはパラダイムがまだ変わっていく可能性があり、ローレベルなemitterだけを提供することにきめました。それでも十分なんですけどね。

Arda便利です

なんかニコニコだったら「熱い自画自賛」みたいなタグ付きそうだけど、まあそれなりのコストと知識を投入しているので使って欲しい、意見がほしいといった感じです。

で、Qiitaに記事書いてくれるとね、他のメンバーとの知識の共有が楽で、僕が楽だなと!現場からは以上です。

Issues · mizchi/arda https://github.com/mizchi/arda/issues

84
82
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
84
82