Pinto公開に向けて #15 ― String等をラップした
あらすじ
Pintoというソーシャルブックマークサービスを、Rubyで開発中です(GitHubリポジトリ)。開発中に気づいたことや工夫した点などを、備忘録も兼ねて書いています。その15回目です。
本題
id:akktさんによる「OOコード養成ギブス」という記事が、はてなブックマーク数が450を超えるほど、話題になっています。Andrew Binstock氏の記事「Perfecting OO's Small Classes and Short Methods」を翻訳されたものです。
私も「オブジェクト指向なルーチンを書く能力を向上させたい開発者」の端くれなので、興味深く読みました。特に「ギプス」の3番目は、以前から似たようなことを考えていたため、すぐに真似したくなりました。
全部のプリミティブとstringをラップせよ。"primitive obsession."だ。整数型が使いたかったら、はじめにクラス(インナークラスでもいい)を作ってそれの本当の役割をはっきりさせる。たとえば郵便番号はオブジェクトで整数じゃないという具合に。これですっきりしてて、なおかつテストしやすいコードになる。
「"primitive obsession."だ」の部分は、元記事では「This directly addresses “primitive obsession.”」となっています。「primitive obsessionの問題点を直接的に処置するものだ」ということです。
この「primitive obsession」は、私の持っている『リファクタリング―プログラムの体質改善テクニック (Object Technology Series)』(ピアソン・エデュケーション刊)では「基本データ型への執着」と訳されています。「コードの不吉な匂い」のひとつに挙げられているものです。その項を少し引用します。
オブジェクト指向を始めたばかりの人は、小さなオブジェクトを使ってちょっとしたことをさせるのを嫌がる傾向があります。金額と通貨単位を組み合せたMoney(貨幣)クラス、上限と下限を持つRange(範囲)クラス、電話番号や郵便番号を表すための特殊な文字列クラスなどがこの例に該当します。
たとえば、電話番号ならば、Stringクラスを生のまま使うのではなく、電話番号クラスを使えば「すっきりしてて、なおかつテストしやすいコード」になるというわけです。
Rubyの場合、プリミティブなデータ型こそありませんが、IntegerクラスやStringクラスなどを「小さなオブジェクト」に置き換えることで、上記のメリットが得られるのではないかと思われます。
そこで、さっそくPintoにも取り入れてみました。GetTextのメッセージIDなど一部を除き、生のString、Hash、Array、Integerを「小さなオブジェクト」で置き換えています。コードが汚くなってしまいましたが、これから整理する予定です。
今後、本当にメリットがあるのか、デメリットはないのか、といった現実が見えてくると思いますので、その際はまた日記に書きます。