本書は、まつもとゆきひろさんによる、プログラミングのいろいろな技術の考え方や考え方が生まれた経緯、目的などが解説されているプログラマ向けの本です。この本のすばらしいところは、Rubyの開発者であるまつもとゆきひろさんの言葉で各種技術が説明されているところです。
コーディングのあり方や、こういう考えを持って取り組むとよりよりコードが書けるようになる、こういうことを意識するとよいプログラマになれるという秘伝の極意が満載です。特に、Rubyの開発者という立場から話されている『第3章 ブロックについて』や『第14章 関数型プログラミングについて など』はタイトルだけ見てもヨダレが出そうになるくらいです。
本書のターゲットはよりよりプログラムを書きたいと思っている開発者、技術者の方々です。技術のうんちくや裏話、トリビアなどが好きな人におすすめの一冊です。
目次
- 第1章 私はなぜRubyを開発したのか
- 第2章 オブジェクトについて
- 第3章 ブロックについて
- 第4章 デザイン・パターンについて
- 第5章 Ajaxについて
- 第6章 Ruby on Railsについて
- 第7章 文字コードについて
- 第8章 正規表現について
- 第9章 整数と浮動小数について
- 第10章 プログラムの高速化と並列化について
- 第11章 プログラムのセキュリティについて
- 第12章 時間を扱うプログラムについて
- 第13章 データの永続性について
- 第14章 関数型プログラミングについて など
おぼえがき
関数を引数に取る高階関数
高階関数とは、関数を引数にとる関数のことで関数型言語などで使用されます。高階関数をつかうメリットは、小さな関数の組み合わせによって多種多様な処理に対応できることです。テキスト処理でつかうパーサなどの変換処理で使用されたりします。
Rubyという言語ではブロックという機能を使って高階関数と同等のことを実現しています。
高階関数を実現するためには、関数あるいは手続きをデータとして取り扱えるようなプログラミング言語が必要です。
高階関数をつかう際には、関数が呼び出されたときの実行時の環境(コンテキスト)を保持しておくことができるかというポイントがあります。この実行時の環境を保持しておく機能をクロージャと呼びますが、Rubyではこれをブロックをつかって実現しています。
C言語のような言語自体が高階関数をサポートしていない言語では、実行時の環境を保持しておくのに引数でわたすかグローバル変数をつかうかの2つしか手段がありません。これではカプセル化が崩れてしまい保守性が悪いコードになってしまいます。
ブロックのパワー
Rubyはこの実行時の環境を保持する手段としてブロックをつかいますが、コードの塊をメソッドの引数にわたすことが出来る点やメソッドの呼び出しの制御がブロックに引き渡される点が優秀な点として上げられます。これによって、繰り返し処理などの実行時環境をブロックに閉じ込め保守性の高いコードが書けるようになります。
また、コールバックや決まりきった処理をブロックとして変数に保持して持ち回ることが出来たりと、ブロックをつかった時の利点ははかりしれません。Javaを経験してRubyを経験すると、このブロックのパワーに最初に驚かされると思います。そしてなぜJavaにブロックがないのかむずがゆくなってきます(Java7で正式にクロージャがサポートされるのでJavaでもRubyのブロックのような使い方ができる日がくるのも近いかもしれません)
プログラムでの文字コードの扱い
コンピュータは「文字」そのものを扱うことができません。このため、各文字に番号を対応させて処理します。文字に対応した番号を「文字コード」と呼びます。
コンピュータは、先に述べたように、各文字に番号を対応させて処理します。逆に言うと番号が割り当てられた文字だけを扱います。この、番号が割り当てられた文字の集まりを「文字集合(Character Set)」と呼びます。
文字集合が決まれば、各文字に対応する番号を順番に並べることで、文字の並びであるテキストを表現できます。文字集合で用いる文字コード番号の最大値が255以下であれば(たとえばASCII)、各番号をバイト列として表現すればよいので話はこれでおしまいです。しかし、もっと大きな文字集合ではメモリー効率や処理効率なども考慮して、どのようにコンピュータ上で取り扱うかを決めなければなりません。取り扱い方法、言い換えれば文字コード列の表現方法を「文字符号化方式(Character Encoding Scheme)」と呼びます。
関数型プログラミングとオブジェクト指向プログラミング
関数型プログラミングの利点は、「副作用のない」関数というものの組み合わせでコーディングができるところです。これによって安全にコーディング出来るようになります。
一方のオブジェクト指向プログラミングの利点は、概念をオブジェクトとして捉え、カプセル化、継承、ポリモーフィズム、メッセージパッシングによる構造化プログラミングが行えるところです。
大規模な業務向けのシステムのように、特定のデータをデータベースで管理するためのシステムを作り場合には、関数型プログラミングよりもオブジェクト指向プログラミングのほうが便利です。逆に、関数型プログラミングは状態を持たない文字列処理やパーサなどの変換処理、解析アプリケーションなどが向いています。
Rubyが人気なのは、日本人が開発した言語というだけではなく、この関数型プログラミングとオブジェクト指向プログラミングの良いとこ取りをしたというところが大きいと思います。
業務システムには相性の悪い関数型プログラミングでも、ブロックやクロージャなどの考えはコーディングにおいては便利です。プログラミング言語の進化に伴って気持ちいいコーディングが出来るようになってきたなぁとしみじみ思う今日この頃です(日記みたい。。。)