ナチュラルなコードとは?
題名は、音楽の話に聞こえるかもしれませんが、ソフトウェア開発の話です。
以前、咳さんが体験談として
>「お前のコードはナチュラルでエレガントだ」
>と言われた時は うれしかったなあ
と語ってくださったことから、ちょっと思い起こしてみました。「ナチュラルなコード」とはなんだろうか、ということを考えてみたい。ぼくは、何かの本かインタビューで読んだ、Ward Cunningham の言葉がとても強く印象に残っています。
...(要約するとこんな感じ)...
そのコードは、すばらしいコードだった。ソースリストをプリンタに出力すると、
それは、「どこからでも読み始めることができ、意図が明確だった」
............................
「どこからでも読み始めることができる」(!)というのは、オブジェクト指向のよいコードの特徴じゃないだろうか。
(以前、oosquare-ml だったか、「オブジェクト指向的に書かれたコードは処理があっちこっちに飛んで分かりにくい」という発言があった。処理の流れがずらずらと書かれたコードが読みやすい、という趣旨だ。オブジェクト指向的に書かれたコードはこうはならない。まったく逆だ。)
識別子(クラス名)の意味の周りに当然あるべき識別子(属性や処理)自然に集まっている感覚だ。名前の自然な関係構築。問題領域のオントロジから、素直に類推が効く名前付け。実行時にどう処理が流れるか、ということではなく、世の中はこう組み立てられている、という感覚。これが「ナチュラル」ということではないだろうか。
どこからでも読める、というのは「宣言的」とも言える。コンテキストや順序性をできるだけ廃した形。逆に処理の流れ、というのは「手続的」だ。オブジェクト指向のコードは、処理から構造(メタ)データへと多くの部分が落とし込まれている。意図をなるべく構造へと落としていく。意図を表現するメディアとして、プログラマは幾つかを選択できる。ぼくは、次の順序でこの意図を表現したい。
名前>構造>処理>コメント
ところで、Wardのコードを読んだことがありますか?ぼくは、c2.com で動いている wiki をダウンロードしたことがあります。ダウンロードすると、なんとそれは 400 行の perl スクリプトでした。最初、400行しかなくて、「あれ、ダウンロードに失敗した」と思った覚えがあります。このシステム(wiki)が400行で書かれていることに大きなショックを受けました(実際は、HyperPerlから自動生成されたPerlスクリプト)。Ward自身は、wikiを「実験」と言っています。このコードがその後いろんな形で亜流を生んだのは、このコンパクトさとコードの読みやすさが大きな理由なんじゃないか、と思います。
※写真は、オリジナルWiki のPerlコードの最初の部分。