動的型言語ってインチキだよね

 プログラミング言語はその言語にとって最も自然に見える記述に落ち着いていく。みんながそういう書き方をするので、他人のソースでも読めるということになる。人は合理的な生き物なので経験を積めば正しいやり方に落ち着いていく。その正しいやり方は、言語がうまいこと導いてやれば、大体同じになる。一つのことをするのに一つの正しい方法があり、それ以外の方法がないのがいい言語ということになる。

 俺はハンガリー記法の信奉者なので、変数がNullableであることを示すために頭にnと書く。例外が投げられることを意識しなくてはならないメソッドには頭にExと書く。列挙型にはEと付ける。

 この情報はどこに書くのがいいのだろう。ReadMeクラスのコメントにでも書いておくのがいいのだろうか。これはありとあらゆるところに出てくるから、その都度書くなんてことは絶対にやりたくないし、読むほうも読み飛ばすのが大変だろう。こういった単なる情報は一回聞いて理解すれば二度と聞く必要はない。

 間違ったコードは間違って見えるようにする:

http://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B

 ここにはハンガリー記法の正しい使い方が書いてある。Webアプリでユーザーが書いた文字列を受け取った時にはプレフィックスUSの付いた変数に入れ、それをエンコードした後にSの付いた変数に入れる。こうすることで、SQLインジェクション脆弱性やなんかを防ぐことが出来る。

 これはある種の言語のカスタマイズで、自然な記述から遠ざけるものだ。SとかUSとかの意味するものを知らない人にはコードに何が書いてあるかわからなくなる。しかしReadMeクラスのコメントを読んでくれることを期待してはならないというのはこの記事を書いたJoelがいろんなところで口をすっぱくしていっていることだ。

 USもSも同じstring型だが、USをクエリに混ぜたらほぼ間違いなくSQLインジェクションが起こってしまう。基本的にはこの問題の解決法は、ハンガリー記法でなく、ユーザーから来たstringはUnsafeString型に入れるようにし、クエリにはこの型の文字列を取れないようにするのがよかろうと思う。フォームからのデータ取得のAPIを完全に隠し、UnsafeStringを返すものに一個一個ラップしていく。UnsafeStringはEncode無しでSQLとかHTMLとかに使うことはできなくなる。

 動的型言語ではコンパイルエラーにならないから全く使えないけど。動的型言語は直感的だしすぐ実行できるからコーディングも楽しいかもしれないけど、明らかに完全に必要なものを致命的に損なっている。