« grepのかわりにperlを使おう | メイン | Jenkinsをカジュアルに5分で立てる »

2012年9月 7日

たとえばgetを避ける

プログラムでは複数の意味を持ちうる単語は避けるというのがある。noとかrightとかが良い例だ。個人的に最近はgetも気をつけたほうが良いと思っていて、メソッド名にgetを使いたくなったときは大体間違えている。

Javaなんかのgetter/setter的なやつは、オブジェクト指向以前のパラダイムの名残でしかないと思ってる。手続きの内容をメソッド名にしているという、手続き型のパラダイムを引きずっている感。

例えば、

user.get_money

みたいなコードがあった場合に、ユーザーがお金を獲得するのか、ユーザーの所持金額を取り出したいのかが分からない。オブジェクト指向的には前者が正しいのだけど、歴史的経緯から後者の意味合いで使わえる事が多い。プロパティの値を取り出すことが期待されてしまう。それが気持ち悪いので、getは極力使わないようにしている。

オブジェクト志向では、メソッド名はオブジェクトのやりたいことに即した命名にするべきで、プログラマーのやりたいことに即するわけではない。スピリチュアル的に言うと「オブジェクトの気持ちになる」ことが大事ですね!?

Javaとかだとプロパティとメソッドがはっきり分かれていて、プロパティは名詞、メソッドは動詞、みたいな感覚もあるんだと思う。だからproduct.priceに金額を代入しておくけどそれは直接使わずに、product.getPrice()で税込金額を返すみたいな処理が書かれてしまう。

プロパティをそのまま外部から使うようにしておくと、後で内部処理に変更があった場合に困るからメソッドでラップしておきべきだけど、メソッドは動詞にしておくべきとか、思考停止でgetXXXとかつけてしまうとかそんな理由だと思われる。

その点、Perlだとプロパティもメソッドも全部関数だから、シンプルな分柔軟なのかな、とか思う。

ちなみに、どうしてもgetを使いたくて代替案も思いつかない場合はretrieveを使うようにしている。あとはcurrentとかも便利な単語ですね。

てことで、とにかくgetをプログラム内で使うのは避けましょう。

投稿者 Songmu : 2012年9月 7日 01:20