- PR -

配列 vs コレクション(戻り値)

投票結果総投票数:49
配列に変換して返す 11 22.45%
Listのまま返す 34 69.39%
常に戻り値には配列を使う 2 4.08%
常に戻り値にはコレクションを使う 2 4.08%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-11-14 05:36
例えば本を表現する、Book というクラスがあり、メソッドとして章 (Chapter) に分割する SplitIntoChapters() というメソッドを作るとします。

最初に浮かんだシグニチャは、

public Chapter[] SplitIntoChapters()

だったのですが、その実装を書いていて疑問に思いました。

実装部分は Chapter がいくつあるか最後までわからない都合上、動的に要素を追加できる List<Chapter> を使うことを考えます。そして最終的に Chapter の配列を返すために List の ToArray() を呼び出して返します。

疑問は、わざわざ ToArray() しないで List のまま返せばいいのでは?ということです。

つまり、シグニチャを前述のものではなく、

public List<Chapter> SplitIntoChapters()

にしたらいいのではということです。

今までは呼び出す側が楽なように(System.Generic.Collections を宣言しなくていいように)配列をいつも使うようにしていましたが、使う側としては動的に追加などができる List のままのほうが使いやすいケースもあると思います。Read-Only で使うなら配列でもコレクションでも foreach で同じ使い方ができるわけですし。

そこで、皆さんのご意見をお聞きしたいです。このようなケースの場合、配列に変換して返しますか?List のまま返しますか?その理由も教えてください。

−−−−−補足−−−−−

・配列に変換して返す
・Listのまま返す

この2つは、このケースの場合(メソッド内でList作ってるケース)に配列orコレクションを返す

・常に戻り値には配列を使う
・常に戻り値にはコレクションを使う

この2つはどのようなケースでもメソッドの戻り値としては配列orコレクションを常に使う

という意味で書きましたが・・・、

・配列に変換して返す
・常に戻り値には配列を使う

元の私の意図を考えるとこの2つの選択肢はほぼ同じと考えていいかもしれません。「常に戻り値に配列を使う人=このケースでは配列に変換して返す」と思うからです。

残念ながら途中から項目の変更はできないのでこのまま続けさせていただきますが、「配列に変換して返す≒常に戻り値には配列を使う」ということで読んでいただければと思います。

[ メッセージ編集済み 編集者: Shane 編集日時 2008-11-14 10:10 ]
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-11-14 08:58
私はメソッド内で生成したコレクションを
ただ渡すだけなら IList<T> をよく使います。
LINQ のように列挙目的だけなら IEnumeratable<T> もときどき。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-11-14 09:10
引用:

Shaneさんの書き込み (2008-11-14 05:36) より:
そこで、皆さんのご意見をお聞きしたいです。このようなケースの場合、配列に変換して返しますか?List のまま返しますか?その理由も教えてください。


私は「List のまま返します」。
理由は、アプリケーションの中では、可変長のものとして扱っているからです。可変長なのは、アプリケーションを書く人間の都合で、それが使いやすいからです。コンピューターとしては固定長の配列が基本ですが、これは配列という基本的な道具を提供してくれているだけであり、これを使って可変長のコレクションを作り(といってもすでに標準ライブラリーにあるのでそれを使うだけ)、そのコレクションをアプリケーションが使うという階層構造になっていると考えます。アプリケーションという高い階層のコードを書いているのに、わざわざ低い階層の配列まで戻る必要性はないと思います。

なお、投票の選択肢で、「Listのまま返す」と「常に戻り値にはコレクションを使う」の違いが良く分かりませんでした。私の場合は、どっちに投票すれば良いのでしょうか?
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-11-14 09:20
引用:

unibonさんの書き込み (2008-11-14 09:10) より:

なお、投票の選択肢で、「Listのまま返す」と「常に戻り値にはコレクションを使う」の違いが良く分かりませんでした。私の場合は、どっちに投票すれば良いのでしょうか?



失礼しました。項目のところに文字制限があったので文字を削ったらわかりにくくなってしまっていました。


・配列に変換して返す
・Listのまま返す

この2つは、このケースの場合(メソッド内でList作ってるケース)に配列orコレクションを返す

・常に戻り値には配列を使う
・常に戻り値にはコレクションを使う

この2つはどのようなケースでもメソッドの戻り値としては配列orコレクションを常に使う

という意味で書きました。例えば私の場合、今までメソッドの戻り値には常に配列を使ってきたので「常に戻り値には配列を使う」に一票入れました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-11-14 09:38
場合によりけりです。

マイブームは

引用:

LINQ のように列挙目的だけなら IEnumeratable<T> もときどき。



だけど、単純に byte[] 返したい時とかもあるし。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-11-14 09:48
「常に戻り値には配列を使う」に投票しました。

引用:

Shaneさんの書き込み (2008-11-14 09:20) より:
・配列に変換して返す
・Listのまま返す

この2つは、このケースの場合(メソッド内でList作ってるケース)に配列orコレクションを返す

・常に戻り値には配列を使う
・常に戻り値にはコレクションを使う

この2つはどのようなケースでもメソッドの戻り値としては配列orコレクションを常に使う



選択肢が変だと思います。
この説明を読んでなお「配列に変換して返す」の選択肢の存在意義がわかりません。
"常に戻り値を配列で返す"ためには、内部でListを使っていても最後に配列に変換しますよね。

この「配列に変換して返す」の選択肢が「常に戻り値を配列で返す」
と異なる意味の選択肢であるとするならば、その意味は、

○選択肢で明示されている意味
→内部でListを使っている場合は配列に変換する
○他の選択肢との兼ね合いで導出される裏の意味
→内部で配列を使っている場合はListに変換する?

と解釈しないといけなくなっちゃいます。

Shaneさんの意図から選択肢を作るなら、
・常に配列で返す
・常にList(コレクション)で返す
・常に内部の形式で返す
(・ケースバイケース)
となるべきだったのでは?
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-11-14 10:08
引用:

よねKENさんの書き込み (2008-11-14 09:48) より:

選択肢が変だと思います。
この説明を読んでなお「配列に変換して返す」の選択肢の存在意義がわかりません。
"常に戻り値を配列で返す"ためには、内部でListを使っていても最後に配列に変換しますよね。



そのとおりだと思います。大変失礼しました。

・配列に変換して返す
・常に戻り値には配列を使う

元の私の意図を考えるとこの2つの選択肢はほぼ同じと考えていいかもしれません。「常に戻り値に配列を使う人=このケースでは配列に変換して返す」と思うからです。

残念ながら途中から項目の変更はできないのでこのまま続けさせていただきますが、「配列に変換して返す≒常に戻り値には配列を使う」ということで読んでいただければと思います。

[ メッセージ編集済み 編集者: Shane 編集日時 2008-11-14 10:12 ]
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2008-11-14 10:12
私はIListを使うことが多いですが、結局は場合によりけりですね。

配列にしてしまえば使い方が限定されるので、使い方を限定させるなら配列は便利ですが、コレクションなら新たな要素の追加や要素の削除も容易にできるし、引数としてIListをそのまま渡せる便利なクラスも結構ありますよね。

型の宣言が面倒とのご意見があるようですが、VisualStudioを使う限り入力の面倒くささはさほど問題にはならないと思っています。テキストエディタで書くとなると話は別ですが^^;

後は、気のせいかもしれませんが、.NETの標準クラスでも、コレクション型で返すメソッドが多いような気がする(よく使うメソッドがコレクションを返すっていうだけかな?w)ってのもありますが・・・。あ・・・Byte配列返すクラスも結構使うか・・・。

今回のケースで言えば、中でList作っているならそのまま渡せばいいのでは?
っということで、「Listのまま返す」を選択しました。

スキルアップ/キャリアアップ(JOB@IT)