uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

型宣言があるほうが良いのか無いほうが良いのか

こちらこちらを拝見すると、RubyJavaをめぐっての議論がされているようです。論点のひとつとして、「型宣言が有用か・無用か」といった話も出ているようですが、この点に限っては不毛に感じられます。有用なケースもあり、有害なケースもある。あとは状況依存で程度問題でしょう。


たとえば、Rubyユーザーも日々型宣言のある言語を使ってるわけです。Rubyの実装自体はCとかJavaですもんね。Rubyの実行基盤を安定させるのに型が大いに役立ってます。1システム内ですら、用途に応じて型が有用で使いたいときもあるし、使いたくないときもあるにはある。これは自明です。


だから、問題は、

  • 型宣言が不要なときでも例外なく要求されること。
  • 型宣言が必要なときにもつけることができないこと。

です。んで、このような問題に対して、Groovyの「オプショナルタイピング(型を明示したいときにつけてもいいけど省略してもいい)」はスマートな解決になってます。オプショナルタイピングとは例えば

String name

とも書けるし、

def name

とも書けると言うことです。


「型が有用で使いたいとき」「使いたくないとき」のそれぞれを具体的に言うと、まず以下のような用途は型指定の有用度が高いケースです。

  1. APIライブラリ
  2. プラットフォーム・ミドルウェア
  3. 大人数複数拠点長期間で開発する場合

要は、比較的硬くて安定していたり、あるいは多数回使われたり、開発者と利用者の距離が比較的離れていたりするところですね*1。動的型だって実行時には型が定まるんだから、定まってるならコード上に指定するかどうかは手間の問題で、その手間から得られる有用性(x利用者数)による生産性向上が手間分の稼動増を補って余りある場合には迷わず指定すればいい。


逆に、試行錯誤が必要であったり、変更が多い部分(上側・ビジネスロジック側)のコードで型指定をいちいちしていくことは特に少人数短期開発でデメリットが大きくなるので型指定を省略することで開発しやすくなるケースもあるはず。そういうケースを言語として無視してもいいけど、適用可能な領域は狭くなる。有用性が減少する。


Grailsでの型指定(あるいはJavaとの役割分担)の使い分けはまさにこうなってます。


ポイントは、1システム内で、あるいは1プロジェクト内でも(オプショナルタイピングが利用できない言語では相反する)2つの要望があるということです。


格闘技に難しいことは何もない。必要な機会に打ち、必要な機会によけるだけだ。−ジャシュガン− (「銃夢」より)



銃夢(GANNMU) 4 (ヤングジャンプコミックス)

銃夢(GANNMU) 4 (ヤングジャンプコミックス)

*1:これらは、ドキュメントの有用性が高いところとも一致するでしょう。アジャイル開発だってコードを重視しながらも「必要なときには必要な分だけドキュメントを書く」ことを提唱しているはず。型指定についても同じように思うのですが、言語のせいで型指定が書き残せないというならある意味それは「ドキュメントを書きたくても書くことができない」という状況に相当していて、直感的には間違ってます。