ひがやすを技術ブログ

電通国際情報サービスのプログラマ

流暢なインターフェース流れるようなインターフェース

流暢なインターフェースという訳になってみたいなので、今後は、流れるようなインターフェースではなく、流暢なインターフェースという言い方に変えたいと思います。
流れるようなインターフェースにかわったようなので元に戻します。
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?FluentInterface
http://d.hatena.ne.jp/higayasuo/20071018#1192681950
ぶくまのコメントで、


http://www.objectclub.jp/community/codingstandard/ このあたりのJava規約だとチェインさせるような書き方は避けるべき、となっている
とあります(うちの会社のドキュメントじゃん)が、これはいろんな人が思うことだと思うので、私の意見を書いておきます。
まず、可読性が悪くなるという話は、昨日のエントリを参照していただければ、逆に可読性はあがるということが直ぐにわかっていただけると思います。ファウラーたんの文章にもありますが、読みやすさを第一に念頭において設計された「流暢なインターフェース」は可読性は高いのです。
同期化の話をすると、「流暢なインターフェース流れるようなインターフェース」を提供するオブジェクトは、そのコンテキスト(特定の状況)用なので、複数のスレッドで共通に使ったりするものではなく、スレッドセーフにする必要はないということです。
コマンド・問い合わせの分離のように、これまで良いとされていたことでも、より新しい使い方が出てこれば、変わっていく可能性があるということです。
追記:
昨日や今日のぶくまのコメントを見ると塗るぽったと気にわかりづらそうということを書いている方がいますが、そんなことはないですよ。だって戻り値は最後のメソッド以外はthisを返すだけだから。thisを返さない場合でも、「流暢なインターフェース流れるようなインターフェース」では戻り値が帰らないケースは最後の結果以外はないはずです。

クロスコミュニティカンファレンス

日本Javaユーザグループ主催で、クロスコミュニティカンファレンスが11/6に東京国際フォーラムで行われます。
http://www.java-users.jp/contents/events/ccc2007fall/
注目は、「Webアプリケーション開発の今後を占う」のセッション。Rails, Spring, Seasarのそれぞれのチームから20分ずつポジショントークをした後、1時間のパネルディスカッションを行います。担当はこんな感じ。

  • モデレータ
    • ヨシオリ
  • Rails
    • recompile.netの高井さん
  • Spring
    • アークランプのゆーすけさん
  • Seasar
    • わたし

注目は、ヨシオリですよ。
Struts脳の恐怖とRails だったら Java でも良いじゃないか!!など、Java, Railsについて熱い思いを持っている彼が、どうしきるのか。彼の思いを聞いてみましょう。
Railsの悪口書いてない... - 何が何だか わからない・・・ - はてなセリフ
高井さんもこんな感じでぶちかましてくれるでしょう。
暴言をたれながしてみる
是非、お越しください。
Seasarカンファレンスもお申し込みくださーい。

JdbcManagerをどこにおくのか

可読性は高いような気がするけど、テストとかどうなんだろう?
daoはdaoでがっちり定義してたほうがなんか作りやすそうな気がしなくもないんだけど、使ってみたらわかるのかな?
そうしようとするとdaoの中にjdbcManagerがあるコードを書くのか?
daoをインタフェースで定義、ってのが分かりやすくて好きだったんだけど、これだと昔の2wayとかどうなるんだろう?

たぶん、どこからJdbcManagerを呼び出すのかが、疑問に思っているところなのかなと思います。
基本は、ユースケースに対応したサービスクラスからJdbcManagerを直接呼び出します。ポイントは、JdbcManagerを呼び出している部分は、一つのメソッドとして独立させることです。


public class EmployeeService {
public JdbcManager jdbcManager;

public List<Employee> selectAll() {
return jdbcManager.from(Employee.class)
.join("department").getResultList();
}
...
}

サービスクラスのメソッドがDaoのかわりって感じ。テストしたいときは、Daoのかわりのメソッドをオーバーライドして適当な値を返せばOK。
2Wayもありますよ。

public class EmployeeService {
private static final String SELECT_ALL =
"examples.sql.SelectAll";

public JdbcManager jdbcManager;

public List<EmployeeDto> selectAll() {
return jdbcManager.selectBySqlFile(EmployeeDto.class, SELECT_ALL)
.getResultList();
}
...
}

SelectAll.sqlの中身はこれまでのS2Daoと同じです。
S2Daoと同じようなインターフェースを用意することも考えていますが、この辺は最初から用意するのではなく、要望が多ければ対応したいと思っています。