- PR -

メソッドの戻り値はListかIListか?

1
投稿者投稿内容
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-08-29 11:48
↓のようなメソッドがあったとして、

static IList<Hoge> Get1()
{
List<Hoge> a = new List<Hoge>();
return a;
}

static List<Hoge> Get2()
{
List<Hoge> a = new List<Hoge>();
return a;
}

このメソッドを使う側は以下のようなものが考えられると思いますが

IList<Hoge> a = Get1();
IList<Hoge> b = Get2();

List<Hoge> c = (List<Hoge>) Get1();
List<Hoge> d = Get2();

みなさんは、どのような形態を好んで使用していますか?

どのように書いても動くのですが、一般的にはどのようにするのがベターなのかが
気になり質問してみました。

また、ValueObjectみたいなクラス(プロパティのみ)に、コレクションを持つ
場合の型は、Listにしようか、IListにしようかという悩みもあります。
THREE-ONE
常連さん
会議室デビュー日: 2006/08/17
投稿数: 36
投稿日時: 2006-08-29 13:18
こんにちは

私なら List か ICollection にします。
IList ってそんなに使いますか?
List 以外の IList を実装したクラスを使うことってそんなにありますか?
SortedList なんかも IList の実装ではなく、ICollection から実装してますし。
そもそもジェネリクス使って、要素指定している時点で大抵は限定された使い方だと思いますし。

受け取り側がリストとして使用したいなら List、汎用的にコレクションとして使用したいなら ICollection にします。
ICollection いいですよ、コレクションとしてのほとんどの機能は宣言されてると思います。
それで足りない場合のみ、具象化してやればいいじゃないかみたいな感じです。
がんふぃーるど
ベテラン
会議室デビュー日: 2006/06/05
投稿数: 58
お住まい・勤務地: さいたま
投稿日時: 2006-08-29 13:44
メソッド内でListオブジェクトを生成して、そのまま返却しているので
static List<Hoge> Get2() の方が分かり易くていいと思います。

プライベートなフィールドにListオブジェクトを保持し、インデクサ等
を定義して内容を公開する場合は、IListみたいなインターフェースを返す
メソッドを定義することがありますね。
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-08-29 14:16
すいません。質問の仕方が悪かったです。

THREE-ONEさんのおっしゃるとおり、ケースバイケースで
ICollectionが良いですね。

しかし、聞きたかったことは単純に
戻り値に、ジェネリッククラスか、インタフェースかというだけです。
(あと、ValueObjectにもつときにもどちらか)

ジェネリックにインタフェースを突っ込もうとすると、キャストが必要になるので。
どのような方針にしようかなというところです。

さだかな情報ではないのですが
戻り値に、List(あるいはCollection)を返したときに
Microsoftのコード分析で怒られたような気がします。
そのときはIListにしたら怒られなかったような。
(なぜか今の私の環境で再現できない。。。)
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-08-29 14:16
ListかIListかについては特にこれといった意見は無いんですが、
コード:
List<Hoge> c = (List<Hoge>) Get1();


こういう使い方はありえませんよね。
Get1の返り値はIListの機能を持つオブジェクトだからIList型と定義しているわけですよね。
つまり、IListであればListでなくてもいいわけです。
例えば、後でGet1の内部処理を変えてListでないIListを返すようにした場合にエラーになりませんか?
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-08-29 14:29
>List<Hoge> c = (List<Hoge>) Get1();
たしかに、エラーになるし、やらない方がいいっぽいですね。
ただ、
List<Hoge>で定義してある変数に、Get1()メソッドの戻り値を
セットするには、こーするしかないかなと思い書いてみました。

これだと、受け取り側もインタフェースにならざるを得ない。
そのような理由でインタフェースだらけになるのも何か変な気がする。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-08-29 15:42
引用:

頭脳パンさんの書き込み (2006-08-29 14:29) より:
ただ、
List<Hoge>で定義してある変数に、Get1()メソッドの戻り値を
セットするには、こーするしかないかなと思い書いてみました。



確かにその通りなんですけど、Get1()メソッドの戻り値をList<Hoge>で定義してある変数にセットするということは、Get1()の返り値はList<Hoge>で決まりということですよね。
それならGet1()の返り値をList<Hoge>にするべきだと思います。
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-08-29 16:00
>確かにその通りなんですけど、Get1()メソッドの戻り値をList<Hoge>で定義してある
>変数にセットするということは、Get1()の返り値はList<Hoge>で決まりということですよね。
>それならGet1()の返り値をList<Hoge>にするべきだと思います。
まぎらわしくて申し訳ありません。
今回はこのような処理がたくさんあります。
これから作るところです。(作りかけ)
なので、これからどのようにすることも可能です。
ただ、あとから統一が取れてないとかで大量に修正するのはイヤなので
もし、一般的な解があればな。と思いました。

今のところ、すべて(セットされる側も、戻り値も)
をジェネリッククラスにするか、すべてをインタフェースにすると
すっきりしそうですが...
1

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