諸君、私は静的型付け言語が好きだ

なんか面白いエントリがあったので。

どのような型の値でも代入できる

 まず基本的なこととして変数に型がなければどのような型の値でも代入できるということです。つまり、受け取るときに、どのような型の値を受け取るのかを意識する必要がありません。

受ける値が何かを考えないでコーディングとか無理だろ。

記述量がとても短くなる
また型推論ソースコードコンパイルの時間を遅くしてしまいます。ソースコードが大きくなってきた場合に、すばやく書いて、すばやく実行結果をもらうことができなくなります。また統合開発環境での、メソッドの自動補完の機能の実装が少し難しくなります。

型推論は人間にとって十分リアルタイムと言える時間で行われる。型推論で待たされたという経験はない。むしろ静的型付けならインテリセンスが使える分だけコーディングは早い。

変数に型がないと変更に強い
 変数に型がないとソースコードの変更に強くなります。たとえば右辺の返す型に変更があったとしても、受け取る側のソースコードを変更する必要はありません。

# clinetはClientA型でもClientB型でもよい
my $ua = $c->client;

まともに継承関係作ってれば、問題にならない。

関数のオーバーロードが不要になる

 変数の型を持つ言語は、型が異なるのだが、処理としては同一の処理を行いたい場合には、オーバーロードという機能を使う必要があります。変数の型がなければ、オーバーロードの機能は必要ではなく、ただ単にif文で分岐すればよいだけなのでとても楽です。

sub sum {
my $value = shift;

if ($valueがA型なら) {

}
elsif ($valueがB型なら) {

}
}
 変数に型がないことによって、関数の重複を減らすことができるという大きなメリットがあります。

同じ物ならスーパークラスに置いとけばいいし、違う処理が必要な場合しかオーバーロードは使いません。つーかこのスイッチ文は型によってやる内容が変わってその内容が型の外に出てるけど、変更に強いかこれ。

複数の型を受け取りたいときに、インターフェースを実装する必要がない

 Javaで大きなの労力といえば、インターフェースの仕組みを覚えて、実装することでしょう。複数の型を受け取りたい変数を作成したい場合は、まずインターフェースを実装することになります。

ジェネリクスつかえばいいね。

C++のテンプレートのような機能も必要がない
 関数の引数が配列を受け取る場合を考えてみてください。そして、配列に含まれている変数の型が、定まっていない場合を考えます。また配列自体が、普通の配列なのか、動的配列なのか、特殊なリストなのかということがわからない場合についても考えてみてください。変数に型があると、このようなたくさんのことを個別に考えて、うまくインターフェースを実装したり、C++のテンプレートのような複雑でデバッグしにくい機能を使ったりしなければなりません。

入力が決まってないのにコーディング始めちゃ駄目でしょ。

変数に型がないとどのような型の値が代入されているかわからないという批判に答える
 変数に型がないとどのような型の値が代入されているかわからないという批判があるかと思います。可読性の問題です。でも、僕は型のない言語の可読性が低いと感じたことはないです。それは、そもそも静的言語を読むときとは、違う読み方をしているからだと思います。
$uaってなんだろう? Clientクラスのuaメソッドが何を返しているかを調べればわかるな。<<
それ別に静的型付け言語でもかわらん。

変数に型がないことのメリットは重複を少なくソースコードがかけること

ジェネリクスつかえばいいんじゃね。

変数に型がないことのデメリットはないのか
 でもパフォーマンスが問題にならない局面では、スクリプト言語を利用するのがよいと思います。
 もうひとつは、メソッドや関数名の補完の実装がうまくできないので、統合開発環境には頼れないということですね。スクリプト言語を書く場合は、まるっとたくさん暗記して、統合開発環境に頼らないのが、開発効率がよいと思います。

丸暗記で全部手で書くよりIDEに手助けしてもらった方が開発効率よくないか。


ヒャッハー
そういや昔eXtreme Programmingとか言ってたねとかトオイメをする今日この頃。