DartでListやMapを拡張する

これで詰まっている人を定期的に見かけるので。ここではListを例に説明する。MapやSet、Iterableについても同様の方法で拡張できる。

Listをimplementsする

もっとも単純な方法がこれだろう。Dartでは全てのクラスが暗黙のインターフェイスを持っているので、Listインターフェイスを勝手に実装してしまえばいい。ただしメンバが大量に存在する。相手は死ぬ。

ListBaseをextendsする

dart:collectionライブラリにはListBaseという便利なクラスがある。ListBaseを継承すれば、

  • get length
  • set length
  • []
  • []=

の4つを実装するだけでListの実装が完成する。その他のメンバはこの4つの組み合わせだけで実装できるという寸法だ。

当然、MapBaseSetBaseでは実装すべきメンバが異なるので、公式のドキュメントなり、IDEの出すヒントなりを参考にしよう。

ただし、4つのメンバだけを使って他の全てを実装するので、あまり効率が良くない部分も出てくる。特にaddやaddAllなどは実行効率が悲惨なので、単に可変長Listをラップするだけの目的でListBaseを使用するのはやめた方がいいだろう。そういう利用シーンを想定しているなら、自前でaddやaddAllをオーバーライドするか、collectionパッケージに含まれるDelegatingListを使おう。

ListMixinを使用する

ListBaseにはmixin版も用意されている。ListBaseと特に違いは無い。

 

DartでWeb Componentsことはじめ

Web Componentsとは

Web Componentsというのは、その名の通りHTMLのコード片をコンポーネント化するための規格だ。もともとHTMLはリッチアプリケーションを作るためのプラットフォームではなかったので、複雑な構造を管理する機能に欠けていた。そこで、Googleを中心にHTMLでコンポーネントを扱う技術の標準化が進められることになった。

Web Componentsの構成要素

Web Componentsは以下の4つの仕様から成り立っている。

  • HTML Templates
  • HTML Imports
  • Shadow DOM
  • Custom Elements

それぞれ独立した仕様なので、開発規模などに応じて、必要なものを選択しよう。

対応状況

現状で対応しているのはBlinkエンジン(Chrome, Opera)のみにとどまる。Firefoxも一部機能に対応しているが、フラグをオンにする必要がある。

DartとWeb Components

DartはGoogleが開発しているだけあって、Web Componentsへの対応も十分だ。Dartiumも元はChromiumなので、当然全ての機能に対応している。未対応ブラウザでも動作させたい場合は、Polymer.dartなどのpolyfillを利用しよう。

Read More

Dartで三角関数ルックアップテーブルのパフォーマンスを調べる

一般に、超越関数の計算にはコストがかかる。処理能力が乏しい環境では、ルックアップテーブルを作成するなどして、計算の高速化を図ることがある。特に三角関数は入力値の範囲を限定でき、ルックアップテーブルを容易に実装することができるので、様々な場面で活用されている。Flash時代にお世話になった人も多いのではないだろうか。

さて、そんな泥臭い最適化法は現代でも通用するのだろうか。超越関数の相対的な計算負担の高さは変わらないが、プロセッサや仮想マシンは年々高性能・高機能化している。全く効果が無いとまでは言わないが、かつてほどの効果は得られないのではないだろうか。可読性を確保するための処理のオーバーヘッドがかさんで無意味になってしまうことも考えられる。

少し気になったので、Dartおよびdart2jsで変換されたJavaScriptで計測してみた。

Read More