なぜ、彼はこのメソッドを定義したのでしょうか。書いた人の気持ちになろとう努力しましたが、未だにわかりません。どうやら、私の精進が足りないようです。
public class MyUtil { public static boolean isValid(MyData data) { return data.isValid(); } }
使い方ヒント: 「これは臭う」という行を見付けたら、各行のをクリックしてマーキングしておきましょう(要Twitter OAuth認証)
オブジェクトの振る舞いとするか、委譲させるかで迷った挙句両方やってしまった的な?
MyUtil内に他の評価用メソッドが複数並んでいるなら、「呼び出し側コード記述を揃える」意図でこういう冗長化をすることあるなぁ。 あれ、日本語になってないかも。
これは、時々やる^^; 元々dataのValidがMyUtilでしか必要無かったのに、機能追加とかで他のクラスでも必要になってisValid()がMyUtilからMyDataに引っ越して跡地を他のクラスの方が片付いたら消そうと思ってそのまま。
これが、ウンコードかどうかは、isValidの抽象度次第だと思います。つまり、staticな方のisValid()と、MyData#isValid()が、同じ抽象度であるならウンコードだし、そうではなくstaticな方のisValidが、より高レベルの抽象度をもっているなら、充分にあり得るコードだと思います。つまり、将来、dataオブジェクトのnullチェックを加えたり、dataの様々な属性からValidかどうかを判断することになる可能性があったりする場合は、MyDataクラスが提供するisValid()よりも高レベルな抽象度を持つものが欲しくなるはずです。isValidのクライアントコード(呼出し側)に、いちいちそんな処理を追加したくないでしょうから、その役をstaticな方のisValidに持たせておけば、MyData#isValidの仕様はそのままで、且つValidメソッドを呼び出すクライアントコードにも手を加えずに、変更箇所を一か所に留めておくことができます。つまり、関心事の分離ですね。ライブラリ(この例ではMyDataクラス)に手を加えられないような場合や、元のライブラリを拡張したいような場合なら、充分ありのコードだと思います。他にも、Wrapperクラスを作るとか、手段はありますが、このコードでもいいのではないでしょうか? 詳細設計まで作成してあるのなら、それを読めばハッキリすると思いますが、このコードだけからは、ウンコードとは判断できないと思います。
コメント投稿には、twitter認証が必要です。
Twitter認証
眠いと時々やってる気がする…