toString()を誰が持つのか

javaをしてればObject#toString()があるのをご存知だと思います。

今回DDDでモデルの中にtoString()があるのに違和感を感じる件について言ってみたいと思います。

モデル内のEntityやValueObjectにCommons-langとかにあるToStringBuilder#reflectionToString(Object, ToStringStyle)なんかを使ってちゃっちゃと表示するという場合に下みたいなのを書くことになる。

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}

そうすると、AbstractなEntityやValueObjectを作りたくなってくる。だけどDDDではこれはドメインモデルを汚染する行為という話だ。

そうすると各クラスにこれを手書きするのか?そういう疑問も湧いてくる。

これは書かないというのがDDDとしては正しいようだ。

Sysout.out.println( AnyToStringBuilder.reflectionToString(anyObject));

のような感じがDDDを厳密に考えた時には正しいアプローチのようだ。これでEntityやValueObjectが綺麗に保たれるって仕組みだ。