言語編 |
typedefは関数型エイリアス(function type alias)とも呼ばれる。typedefは型表現の為の名前を宣言する。Dartでは関数は文字列や数字と同じくオブジェクトである。関数を変数や戻りの型として使うときにはtypedefプレフィックスを使った関数型エイリアスを使用する。関数型エイリアスはある関数の型に名前を付し、フィールドや戻り値の型を宣言できるようにする。typedefはある関数型オブジェクトがある変数に代入されたときにその型情報を保持する。
typedefを使っていない次のコードを検討してみる:
|
SortedCollectionクラスのインスタンス変数であるcompareという関数は、コンストラクタの引数であるint型の関数である。このオブジェクトのcompareはどんな型なのかこのままでは解らない。何故ならcompareに代入した時点で型情報が失われてしまうからである。fの型は(Object, Object) → int (ここで→は戻りの型である)ではあるが、compareの型はFunctionである。明示的な名前を使用し、型情報を維持するようにこのコードを変更すれば、デベロッパとツールの双方がその情報を使える。
|
注意:Dartでは仕様書上は型エイリアスは型式の名前として宣言できるようにするものであるが、現在は型エイリアスは関数のみに制限されている。将来これは変更させる予定になっている。
typedefは単に別名(エイリアス)であるので、任意の関数の型をチェックする手段にもなる。例えば:
|
typedefによる関数型エイリアスの動作を以下のコードで示す:
|
typedefでTempToText(温度を入力して文字列を返す)という名前の関数型は、入力がvar即ちdynamic型で戻り値がStringである関数であると定義している。
void printTemp(var someTemp, TempToText whichMethod)というメソッドは、someTempというvar型の温度入力と、whichMethodというTempToText型の関数を入力としている。そのボディ部はsomeTempを引数にしてwhichMethodを読んだ結果をプリントする。
fromCelSiusとfromFahrenheitの2つのメソッドはTempToText型の関数で各々摂氏入力と華氏入力を受け付け、それを摂氏と華氏の温度で文字列に変換する。
main()メソッドの中ではcelsiusというブール変数で摂氏入力かどうかを指定する。またsomeTempは摂氏または華氏の入力温度をセットする。
次にcelsiusが真かどうかでどのメソッドを使うかを決め、それをwhichMethodという変数にセットする。
Mainメソッドの最後の文であらかじめ定義したprintTemp関数を呼び出している。
このコードでは変数whichMethodアノテーションが2か所使われている。最初はprintTemp関数の引数の中で、もう1か所はmain()関数の中での変数whichMethodの宣言のなかで使われている。この2か所をvarで置き換えてもこのコードは正常に動くが、TempToTextはvarからStringへの変換の関数だということが明確に解るので、ツールにとってもプログラム作成者にとっても好ましい記述といえよう。また関数fromCelsiusとfromFahrenheitの宣言に型アノテーションをしないとツールはその関数はdynamicではなくてStringであるべきだとエラーを表示する:
|
これも型エイリアスがコードの高品質化に寄与する例である。