2013年03月03日

動的型付き言語の利点みたいな話

かなり昔から議論され続けてきた話がまた再燃している模様。むやみなPerlいじめのような話にならなければいいんだけど

http://d.hatena.ne.jp/perlcodesample/20130227/1361928810
 
↑の記事を発端として、色々意見が出てきた。
 
 
で、俺の考え。

全般的な考え方としては、変数に型はあったほうがいいんじゃないの?とは思う。
Javascript大好きな俺が言うのも変な話だけど。

なんといっても、変数に型があるということは、テストの記述量を減らせるということで、
メソッドなり関数なりを呼び出すときにあれ?この変数はこのメソッドを確実に呼び出せるんだっけ
と心配になる可能性が少ない。たとえばRPGで次のマスに移動する処理を書くとして

function goArea(field){
  if(!field.canEnter){
    return false;
  }
  if(field.damage > 0){
    damage(field.damage);
  }
}

↑の侵入可能か、(field.canEnter)やダメージ床かどうか(field.damage)みたいなプロパティを呼び出して大丈夫かっていう保証は、やっぱり変数に型が付いている方が楽。そうでないと、ユニットテストみたいなものでfield変数に対するテストをゴリゴリ書かないといけない。

ただし、C++やらJavaの型は構造体やらユーザー定義型から派生したタイプなので非常に使い勝手が悪い。

たとえばコレクションクラスに総称型が必要とか、ダックタイピングが困難になるとか。

総称型については、セーブファイルにゲームのキャラの値を保存する場合とか考えてみる。キャラの値はこんなかんじだ

名前 : ランディ
力 : 12
素早さ : 10
体力 : 11
知力 : 6
文字列型の「名前」と、数値の「力」「素早さ」「体力」「知力」が混在している
これを設定ファイルとして取り扱うときは、Mapクラスのインスタンスを使うと思うんだけど

Map<String, String> strStatus (名前用)
Map<String, Integer> intStatus(力とか素早さ用)

こんなかんじで2つに分けなきゃいけない。業務アプリとかだと他に日付・時刻とかがよく加わるんだけど仕事の話とか面白くもないのでそこは割愛

理想としては、ここに文字列も数値も入る型がほしい

Map<String, (String|int|null)>

これがなくて、Map<String, Object> しか残りの手段がないので、折角静的型付け言語なのに色んな所で例外処理だのキャストだのを入れなきゃいけなくなるんですよ。最近はやりの関数型言語だとなんとかなってるの?

要するに、関数を呼び出す時点である程度制約がついてほしいというのが俺の理想です。でもって、制約はダックタイピング的な何かであれば良いです。データの内部構造に依存した型付けではなくて、インターフェースが統一されていればいいというか。

ちなみに引用元に記事の人は、オーバーロードが嫌いで関数内でif文を切るのが好きみたいなんだけど、これは人それぞれな気が。
オーバーロードが許されると、将来扱う型が増えた時に既存に影響を与えずに処理を追加できるから便利ッチャー便利なんだけど、
引数の値が増えるとか型が変わるとか程度で関数処理まるごと変わることは少ないよね?大抵、引数が少ない側がデフォルト値を設定して多い側を呼び出すだけっていうオチが多いように思う。
そのためだけにどこを呼び出されるのかわからん関数の海を泳ぐのが大変困難ですので、できればデフォルト引数とかで対処していただきたい所。

if文を減らしたいっていう動機は非常にわかるんだけどね。
条件分岐はなるべく関数のインターフェース部分で行いたい。
posted by LoyalTouch at 08:27| Comment(0) | TrackBack(0) | プログラム全般 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/341603810

この記事へのトラックバック