牛尾 剛(うしお つよし)
 大手SIベンダにてSEやPMやアーキテクトとして勤務したのち,現在は株式会社豆蔵のチーフコンサルタント。主に超上流のプロセスである要求開発やオブジェクト指向,アジャイル開発のコンサルタントとして活躍中。開発の現場にこだわり,開発の現場を少しでもよくしたいと日夜奮闘している。要求開発アライアンス 執行委員。著書に『オブジェクト脳のつくり方』や『eXtreme Programming実践レポート』(ともに翔泳社発行。後者は共著)などがある。

 この連載も「刺激的」な内容が続いたと思いますので,今回は関数型のコーディングに普段なれていない皆さん向けの内容をお届けします。

 そんなことを書くと,まるで私も関数型バリバリ…みたいですが,全くそんなことはありません。今までは仕事はJavaばかりで,昨年羽生田さんがやっているScalaに興味を持って取り組んで以来,ずっと「関数型」の考え方がよくわからなくて,七転八倒しました。いろんな記事を読んだり,コードを書いたりして,やっとこさ関数型のイメージがつかめてきた気がしました。

 しかし,振り返ってみると,内容が難しいのではなくて,そういう「こつ」みたいなものは,前提になっていて,あまり説明されていないだけだとも思いました。誰か説明してくれたら,もっと早くわかったのに!! 今回の記事ではそのフィードバックとして,皆さんに「関数型」のプログラミングのポイントを説明してみたいと思います。

グローバル変数問題に対するオブジェクト指向と関数型

 関数型言語が必要とされる動機について,「グローバル変数問題」の側面から考えてみたいと思います。

 「グローバル変数問題」はプログラムの保守性に関する問題です(図1)。いろいろなアプリケーションで共有されるグローバル変数を使ったプログラムを作ると,どのプログラムで,いつグローバル変数が変更されるかわからないので,いつプログラムが誤動作してもおかしくありません。しかもすでに定義されたグローバル変数を削除したくても,いるかいらないかはすべてのプログラムを調査しないとわかりません。そのため,いつまでたっても何に使われているかわからないグローバル変数は放置されてしまうことになってしまいます。このあたりは皆さんもご経験があるのではないでしょうか?

図1●グローバル変数問題
図1●グローバル変数問題

 グローバル変数問題を解決するためには,二つの方法が考えられます。ひとつはグローバル変数が有効な範囲を狭くすることです。もうひとつが,変数に一度値を代入したら,その値を以後変更できなくするようなアプローチです。

 オブジェクト指向はグローバル変数に対するひとつめのアプローチをとっています。アプリケーションで共有されるデータは「オブジェクト」の内部にカプセル化されて,その「オブジェクト」の中だけで使われるようにします(図2)。

図2●グローバル変数問題対策としてのオブジェクト指向
図2●グローバル変数問題対策としてのオブジェクト指向