5/15/2012

良いソースとは?-Javaの参照型変数と引数- 私の結論

先日5月7日に記事を一つ書かせていただいた。
良いソースとは?-Javaの参照型変数と引数

簡単におさらいを。


最近の悩み。「良い設計・ソースとは」
【要件】
あるクラスの中で、0から9までの整数を格納しているリストが必要である。
今回はこのリスト取得のために、1つメソッドを作成したい。
メソッドは以下の要件を満たすこと。
  • アクセス修飾子:private
  • メソッド名:createList
と、上記のように2人のコーダーに伝えたとする。 すると、下記のようなメソッドが納品された。

【納品物1】
private void createList(List <Integer> list) {
    for(int i = 0; i < 10; i++) {
        list.add(new Integer(i));
    }
}

【納品物2】
private List<Integer> createList() {
    List<Integer> result = new ArrayList<Integer>();
    for(int i = 0; i < 10; i++) {
        result.add(new Integer(i));
    }
    return result;
}


「1と2でどちらが良いか」についてコメントをいただいた。
コメントを頂戴いただいた方々、この場を持って御礼申し上げます。
ありがとうございました。

頂いたコメントをまとめるとこんな感じ。
  • 2が良い。
  • 1はNullチェックや引数のリストに対して追加をする場合には良い。(条件付)

私も2が良いと考える。その理由は以下の通り。
  • 要件から「作成したメソッドを呼び出すことで、必要なリストが作成される」と読み取れ、満足するのは2である。
  • 1を使用する場合、呼び出し元で予期せぬデータ操作が行われてしまう可能性がある。
  • 1を使用する場合、予期しない例外が発生する可能性がある。
つまり、コメント頂いた方々と同じ理由だ。

もし、1のように実装する場合は、呼び出し側で明示的に入れ替える処理を記載するようにListをreturnするのが良いと思う。
そうすれば、呼び出し元で予期しないデータ操作を幾らか回避することができると考える。

コメントでも頂いたのだが、
結局はそのメソッドの責務を明確にすることが重要で、その責務に見合った引数と戻り値を設定することが大切ではないか
ということだと思う。
後輩に説明する際には、コメント頂いた内容を参考にさせていただきます。

0 件のコメント:

コメントを投稿