こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#でレート別に管理するクラスを作りたい

本の管理をするアプリを作っている時にまた疑問が出てきました。

public class Book
{
public string Title { get; set; }
public string ISBN { get; set; }
public Money Money { get; set; }
public int Rate { get; set; }
public DateTime BuyDate { get; set; }
}

本の管理にレートをつけられるようにしようと思っています。
iTunesの★マークのようなものにしたいので1~5の固定です。
つけていないものもあるので0も存在します。

ここでレートを付けている本を、それぞれのレート別にグループに分けたいと思いました。
そこでレート1~レート5までのグループをどのように管理するのがベストというか、どのように考えればいいのでしょうか。

私が考えたのは、グループ別に処理が分かれるのでクラスを作った方がいいと考えたのです。
とりあえず同じ処理もいくつか発生するので

public abstract class AbstractRate
{
public int Value { get; set; }
private static BookCollection _bookCollection; //全ての本が入る
public BookCollection BookCollection { get { return _bookCollection; } }
}

みたいな基底クラスを作り

public class Star1 :AbstractRate
{
private BookCollection _books;
}

から Star5までの似たようなクラスを作り、それぞれのレートのBookコレクションを持たせる形です。
ただこれだと同じようなクラスが増えるだけでものすごく冗長だと思うのです

そこでもう一つ思ったのは

public class GroupClass
{
public string GroupName { get; set; }
public BookCollection BookCollection { get; set; }
}

という形でグループ名と本のリストを入れておく形です。
これだとクラスは分かりやすくていいのですが、毎回処理をさせる際にこの名前のグループならこれみたいな処理が必要になる気がして悩んでいます。


実際どのように考えるのがいいのでしょうか?
直接的な回答でなくてもいいのですが、考える材料が欲しいです。
よろしくお願いします。

投稿日時 - 2014-11-07 19:09:48

QNo.8817096

困ってます

質問者が選んだベストアンサー

AllBooks=全ての本の情報
みたいにして、
http://dobon.net/vb/dotnet/programing/arrayfilter.html
にあるような方法で、必要に応じて
Star5 = Allbooks.フィルタ(Rate-5を検索)
のように抽出して
foreach(book in Star5 ){
星5の処理;
}
と該当したものだけ処理をする。

というのが素直でいいと思います。


別解。
データはデータベースに保存する。
必要なときに、必要なものだけを抽出したり更新したりする。

投稿日時 - 2014-11-07 20:28:24

お礼

お礼が遅くなって申し訳ないです。
ifで回さなくても個別に抽出して回せば確かに自然ですね!
データベースはまだこれからなので、とりあえず前者の方法でやってみて、のちにデータベースでも試してみたいと思います。
ありがとうございました!

投稿日時 - 2014-11-14 16:04:08

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)