TOP > プログラマ2.0日報 > 自分自身を返すメリット

あすなろBlogger

facebookに投稿 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク このエントリーをはてなブックマークに追加 この記事をクリップ! livedoorclip ユーザー数 BuzzurlにブックマークBuzzurlにブックマーク この記事をtweetする

自分自身を返すメリット

2008.11.14

たまに見かけるインターフェイスですが....

public StringBuffer StringBuffer#append( String s );

というのが一番馴染みが深いかな? これが StringBuffer#append()StringBuffer を返す、というのは、要するに

append() したそのオブジェクト自身を返す

という動作です。ですからコードの最後は

return this;

で終わっているわけですね。Meyer 流の厳格に「funcion/procedure」を区別する立場だとイケナイことなのですが、

作用を受けた(副作用によって状態を変えた)自分自身を返すメソッド

なのですよね。でこういうメソッドを、意識的に作ることにどういうメリットがあるかな?というお話です。

StringBuffer#append() が自身を返す理由って、要するにこういう使い方が便利だからです。

StringBuffer sb = sb.append( a).append( "-").append(b).append("=");

勿論そうですよね....これがしたいからこそ、「自身を返すメソッド」であるわけです。同様に O/R マッピングツールの Criteria クラスもよくこういう設計をします。

 List cats = session.createCriteria(Cat.class)
     .createAlias("kittens", "kit")
     .add( Restrictions.like("kit.name", "Iz%") )
     .list();

これもホントは、Criteria が「StringBufferみたいなもの」ですから、org.hibernate.Criteria#add() などが、Criteria 自身を返して、

なんとなく SQL みたいに記述されたプログラム

の見かけを作り出すわけです....

ですから、ちょっとこういう概念はいかが?

自分自身を返すメソッドを作るのは、プログラムの「叙述性」を高めるメリットのためだ!

叙述性」って言い方いいでしょ! プログラムとしては別に特に機能的に変わるわけじゃないです。プログラムを

対象領域の処理について直感的に把握しやすくする目的で

言い換えれば「プログラマのために」こういう書き方を許そうとするのです...

ですから、Composite パターンで、入れ子の構造を作るメソッド add() も、やはり「自身を返すメソッド」であっていいです。なおかつ、

Composite add( Composite... args );

とうまく可変長引数を使ってやれば、こんな「叙述」ができます。

root.add( kodomo1.add( mago1.add( himago1,
                                  himago2 ),
                       mago2.add( himago3 ),
                       mago3 ),
          kodomo2.add( mago4.add( himago4 ),
                       mago5 ) );

どうです?「叙述性」を高めたプログラムとは、実際には「宣言的」でもあるようですよ。デザパタとして捉えて、何かカッコイイ名前をつけてあげたくなりました.....

 

投稿者 : 杉浦 こずえ | 投稿日時 : 2008.11.14 20:14

あすなろBLOGのトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。

トラックバックURL


コメントの送信








カレンダー

<< 2008年11月 >>

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

最新のエントリー

最新のトラックバック

最新のコメント

Tag

バックナンバー