Trema で使われる Ruby はうまく使うととても簡潔に OpenFlow コントローラを実装できますが、そのお手軽さゆえに何も考えずに書くと途端にひどいコードができあがる言語でもあります。どんなプログラミング言語でもそうですが、きれいなコードを書くには専門的な学習が必要です。そこで今回から数回に分け、 Ruby のプログラミングに役立つ本を何冊か紹介します。今日紹介する本は、「ケント・ベックの Smalltalk ベストプラクティス・パターン」です。
なぜ Smalltalk か
これは Ruby の本ではなく Smalltalk という言語のベストプラクティスを集めた名著です。Smalltalk は正直マイナーな言語ですがその歴史は古く、今も活躍する著名なハッカーがたくさん居ます (Smalltalk を間違えて SmallTalk とか Small Talk とか書くとそういうハッカーにボコボコにされるので注意)。ここ 10 年ほど脚光を集めているソフトウェアテストという考え方も、もともとは Smalltalk コミュニティの人達が 30 年以上前に言い出したことと言われています。そして、この本の著者であるケント・ベックは近年ソフトウェアテストが注目される原因となった XP (eXtreme Programming) の中心的人物です。
そして重要なことは Ruby は Smalltalk とよく似ているということです。Ruby は Smalltalk や Lisp を参考に設計されており、言わば「Smalltalk は Ruby の先祖」なのでこれはあたりまえなのですが、こういう理由から古来 Smalltalk で培われてきたノウハウは現代の Ruby でも有効です。そしてこの「Smalltalk ベストプラクティス・パターン」はそんなノウハウの中でも使用頻度の高いベストプラクティスばかりを集めた名著です。
いいパターン
この本には大小の「いいパターン」が載っていて、意識して真似することによりきれいで読みやすく保守しやすいプロ品質のコードが書けるようになります。いろいろパターンがありますが、私がこの中でも特に役立った思い入れの深いパターンが Simple Enumeration Parameter です。
イテレータに渡すブロックの引数には、each を使おう。
Ruby の :each メソッドにはブロックを渡しますが、ブロックの引数の名前を何にするかよく悩みがちです。
# ブロックの引数は daemon にしようか? それとも? Daemons.each do | daemon | daemon.restart! end
とくに英語があまり上手ではない我々日本人にとって、こういうちょっとしか使わない変数にいちいち気の利いた名前をつけるのはいつもストレスになります。そして、意外なことに英語圏の人も同様に悩むらしいのです。
そこでケント・ベックは、イテレータに渡すブロックの引数の名前は次のようにすべて each にせよ、と言っています (本に載っているコードはもちろん Smalltalk ですが、ここでは Ruby に翻訳しました)。
# いつも each という名前にしよう Daemons.each do | each | each.restart! end
こうするだけでたとえば次のようなご利益があります。
- 変数名を考えなくて良いので前述のストレスが減ります
- コーディング標準でこのように定めておけば、チームに英語の不得意な人が居ても変な変数名を付けられてしまうことを防げます
- 複雑なコードとして敬遠される二重イテレータも防げます (二重にすると each1, each2 みたいになっちゃうので)
このパターンはすごく些細な事ですが、私がこのパターンを初めて知ったときあまりの嬉しさにニヤニヤが止まりませんでした。「もうイテレータブロックの変数名を考えなくていい!」このパターンのお陰で人生の悩み事の 1 % は確実に消えて無くなったと思います。
まとめ
Ruby のプログラミング力向上には Smalltalk や Lisp など他の言語の知識が役立ちます。このブログでは、今回紹介したようなあまり知られていない本を独断と偏見でこれからも紹介して行こうと思います。