「Ruby は型宣言がないけど、ちゃんとしたシステムに使えるのか」という質問にどう答えるか

2008/11/23

Ruby というプログラミング言語には、変数やメソッドの型(type)を宣言しなくてもいい、という特徴があります。
いろんなところで Ruby on Rails について話をすると、しばしばこの点について質問を受けます。
Ruby は型宣言がないけど、ちゃんとしたシステムにも使えるのか、という質問です。
要するに、Ruby で作ったシステムは信頼性が低いんじゃないのか、と。

この質問にどう答えたらいいでしょうか。

型宣言はシステムの信頼性をたいして向上させない、というのが答えです。

型宣言のおかげで発見されるバグ(不具合)が存在するのは事実です。
例えば、a という変数が文字列型を持つと宣言されているのに、そこに整数型の値を格納する処理があれば、それは間違いです。

しかし、現代のプログラミングにおいては、この種類のバグはあまり生じないのです。

最大の要因は、オブジェクト指向プログラミング単体テストの考え方が普及したことです。

オブジェクト指向プログラミングでは、アプリケーションの構成要素を「オブジェクト(物)」と捉えます。
メッセージをオブジェクト同士が送り合うことで、アプリケーションが機能します。
オブジェクトが正しく機能しているかどうかは、「単体テスト」と呼ばれる別のプログラムによって確認します。
単体テストは、オブジェクトが保持する変数やメソッドが受け取ったり、返したりするオブジェクトについて様々な側面からチェックします。
変数やメソッドの型だけではありません。値の範囲や要素の個数などもチェックします。
単体テストによって、コンパイラによる型チェックよりも深い検証が行われるのです。

また、近年広まったプログラミング作法によっても型宣言の役割は小さくなりました。
メソッドは短くすべきであるとされ、長すぎるメソッドは分割するように教えられています。
また、変数やメソッドに分かりやすい名前を与えることが強く推奨されています。
このような作法でプログラミングをしていれば、型を取り違えるというミスは滅多に起きません。

型宣言は、コンパイラによる最適化を助けるので、システムの性能向上には役に立ちます。
しかし、システムの信頼性とはあまり関係ありません。

--
黒田努