『On Lisp』を読もう

最近『On Lisp』を読み始めた。まだ前の方しか読んでないんだけど、なんというかとても面白い。関数型プログラミングという、普段あまりやらないものに触れる面白さもあるんだけど、むしろ普段親しんでいるものにとても近いというのが面白い。


本文から例を挙げて説明するよ。ちなみに本文はネットで公開されている。書籍版と微妙に内容違うけど。

どう違うかって?テストが素早く済めば,もっと頻繁にテストができる.Lispでは(他のどのプログラミング言語でもそうだが),ソフトウェア開発はコード書きとテストのサイクルから成る.しかしLispではサイクルがとても短い:関数1個毎,いや関数の部分毎でもいい.あらゆる部分について,書くと同時にテストすれば,エラーが起きたときにどこを見ればいいか分かるだろう:最後に書いた部分だ.単純に聞こえるが,この原則はボトムアップ・プログラミングを堅固なものにしている要因の大きな割合を占めている.それは更なる自信をもたらし,Lispプログラマは(少なくともある一時)古い「計画−実装」スタイルのソフトウェア開発からフリーになれるのだ.


『On Lisp』3.4 インタラクティブ・プログラミング

毎日テスト容易性を念頭にプログラム書いてる人なら誰でも納得できるだろう。

プログラミングの入門課程では,最初に「抽象化は二度手間の回避につながる」と教える.その中の初歩の一つに「振る舞いを密接に組み込んではいけない」とある.


『On Lisp』4.1 ユーティリティの誕生

まさに疎結合ですよ。DIコンテナを使ってる人なら、「コード内で実クラスを安易にnewしない」というのを考えてもらえば良い。


Javaのインタフェースを使用した疎結合の場合、インタフェース上の「振る舞い」は最低限組み込まれてしまう。Lispなどはいっそう踏み込んで、どんな関数でも取れてしまえるのが少し違うかもしれない。別の言い方をすると、インタフェースを作って疎結合の仕組みを作ることはできるけど、既存のライブラリなどに含まれるクラスをそれに参加させるのは難しい。柔軟性という意味ではやっぱりちょっと弱い(悪い、とは思わないけど。)


他にも、クロージャを用いた特定関数間での変数の共有と外部からの隠蔽化などは、むしろオブジェクト指向プログラマの方が馴染みが深い考え方なんじゃないかと思う。


単一責務、インタフェースを用いた疎結合、テスト容易性、などを念頭に作られたオブジェクト指向言語のプログラムは、関数型言語で書かれたプログラムととても似通っているかもしれない。そのヒントが、みねこあ氏のところでよく使われる「責務分散協調系」というキーワードじゃないかと思う。「メッセージング」とか「抽象データ型」といった「実体論的段階」での概念に対して、「責務分散協調系」というのは「本質論的段階」における記述ではないだろうか。そして「責務分散協調系」を実現する為の土台はOOPでなくても良くて、むしろ関数型言語であってもいいのかもしれない。