プログラミングの魔導書 Vol.1 発売前レビュー

人生初献本・・・と書くとこっちが送ったみたいですね。そうではなく、もらったほうです。ありがとうございます。

http://longgate.co.jp/products.html

と、いうことで、プログラミングの魔導書 〜Programmers' Grimoire〜ですが、Vol.1 は C++ オンリーの構成です。なんとすっぽすっぽ先生のインタビューも載っています。
なので、当然メインの対象読者は C++er になるわけですけど・・・これは面白い!
C++ がよほど嫌いじゃない限り、これはほかの言語のユーザにも是非読んでほしい本です。
この本には、C++ 使いが何を考え、どういう思考 (試行) を経て問題を解決するのか、といったことが詰まっています。
これは、ほかの言語を使っている人にとってもとても参考になるはずです。複数の言語が使えるような人は、是非読んでほしいですね。
まぁ、「なんで俺の使ってる言語にはこういう機能がないんだ!」などと思ってしまうかもしれませんが・・・


で、ですね。id:melpon (melpon さん) による、Chronoライブラリで考える型システムです。
これ、素晴らしい記事なんですけど、細かいところに突っ込みを入れたいというか・・・いや、多分この話題は人によっていろいろ意見が出てくると思うので、ひとつの意見ということでよろしくお願いします。

ハンガリアン記法について

この記事では、「システムハンガリアンもアプリケーションハンガリアンも使う場所なんてないよ。かわりに型を使えばいいんだよ」と言っているのですが、個人的にはひとつだけ、ハンガリアン記法が有効な場所があると思っています。
それは、GUI の構成部品で、たとえばひとつの画面に 4 つのテキストエリアと、3 つのボタンがあったとします。
それぞれ、TextArea 型と Button 型だったとしましょう。この計 7 つの部品に、どういった名前を付けるのがいいでしょうか?
もちろん、役割がわからなければ適切な名前なんて付けることはできませんので、もうちょっと詳細を詰めましょう。


このアプリケーションは、入力パスを一つとり、そのパスに存在するテキストファイルを指定したエンコーディングで開き、出力パスを指定して指定したエンコーディングでコピーする、というアプリケーションです。
入力パスと出力パスを指定するテキストエリアが 2 つと、その横にフォルダ選択ダイアログを表示するためのボタンが 2 つ、入力エンコーディングと出力エンコーディングを指定するテキストエリアが 2 つ、そしてコピーを実行するボタンが 1 つです。
これで役割ははっきりしました。では、こういう名前はどうでしょう?

  • copy
  • inputEncoding
  • inputPath
  • inputPathRef
  • outputEncoding
  • outputPath
  • outputPathRef

大体どれが何かはわかりますね。ならこれでいいのでしょうか?
たとえば、ほら、あの、あれ!あのボタン、なんだっけ?run?exec?となった時、これではボタンを探してその定義を調べる必要があります。
面倒ですね。そこでハンガリアン記法です。
こんな名前はどうでしょう?

  • btn_copy
  • txt_inputEncoding
  • txt_inputPath
  • btn_inputPathRef
  • txt_outputEncoding
  • txt_outputPath
  • btn_outputPathRef

これで何が変わったというのでしょうか?
このように部品を表すプレフィックス *1 を付けておけば、IDE による補完で部品を一覧できるのです。
たとえば、あのボタン!というときには、btn_ まで入力して、補完機能を働かせます。
すると、ボタンの一覧が出ますので、その中から選ぶだけです。


え、IDE 使わない・・・?いや、それは、その・・・

単位について

まだ自分の中で答えが出ていない問題で、かつそういう世界から離れちゃったので最近全然考えないんですけど、単位の話です。
確かに、単位を汎用的に扱えるととても嬉しい。嬉しいんですが、ratio だけじゃ解決できない単位が身近にあるんですよね・・・*2
そう、温度です。セ氏に華氏、ケルビン・・・こいつらは、単位の変換に乗算だけでなく、加減算が必要になります。
これだけならまだ対処のしようはあるのですが、更にやっかいなのが、ある単位からある単位に変換するために、標高だとか、密度だとか、温度だとかの情報が必要になる場合です。
ここまでくると、「じゃぁ SI 基本単位全部持つか」みたいな話に・・・うーん、どうするのがいいんでしょうね。


誤解のないように言っておくと、この記事はとてもいい記事です。ただ、自分の興味ともぴったり一致したので、詳しく見てみました。
この記事は C++ プログラマだけじゃなくて、静的型付け言語を扱うプログラマは熟読すべきです。
int とか double とか string とかばっかり使っていて、小さい型を作らないような人に、新しい視点を与えてくれるでしょう。


書籍版は 2010/8/6 (金) までらしいので、興味を持った方は是非!
ちなみに自分は献本分含めずに 2 冊予約しました!
予約ページは 株式会社ロングゲート - 製品案内 です。


# あと Crawling in the Stream、この記事、学生時代にストリームを拡張していろいろやってた時に読みたかったですw

*1:ちなみにこれは型と一対一である必要はありません。たとえば、Java の Swing では一行しか入力できない JTextField と、複数行入力できる JTextArea というように、型が別になっていますが、これはどちらも txt_ プレフィックスでいいでしょう。

*2:あ、記事中に「ratio さえあれば何でもできるぜ!」とか書いてあるわけではないです。ただ、「そう言えば前に単位でいろいろ苦労したなぁ」という懐古をしてるだけです。単位と言っても学生がびくびくするアレじゃないですよ。いや、まぁアレでも苦労しましたががが