【C#プログラミングレッスン】 No.230-FxCopに学ぶ(12): CA1002
発行日:11/3
■━ [C#プログラミングレッスン] ━━━━━━━━━━━━━ No.230 ━□
「FxCopに学ぶ編」 -- CA1002: Do not expose generic lists (後編)
by Gushwell
□━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━■
■□─────────────────────────────────
■□ CA1002: Do not expose generic lists
前回は、List<T>などのジェネリックリストを公開してはいけない理由を説明
しましたが、まだ、その解決策を示していません。
では、どうすれば良かったのでしょうか。
その解決策のひとつが、List<string>ではなく、継承を前提に設計された
System.Collections.ObjectModel.Collectionジェネリッククラスを公開する
という方法です。
Collectionクラスを使った、Singerクラスは以下のようになります。
using System.Collections.ObjectModel;
public class Singer {
private Collection<string> albums = new Collection<string>();
public Collection<string> Albums {
get { return albums; }
}
}
Collection<T>クラスは、用意されているメソッドの数はList<T>よりは少なめ
ですが、通常の利用においては、十分なメソッドを備えています。
では、上のSingerクラスを、「既存のインターフェースは変えないで、
AlbumAdded イベントを追加してほしい」という要求に答えてみましょう。
コードを示します。
public class Singer {
public event EventHandler AlbumAdded;
private AlbumCollection albums;
public Singer() {
albums = new AlbumCollection(this);
}
public Collection<string> Albums {
get { return albums; }
}
protected virtual void OnAlbumAdded(EventArgs e) {
if (AlbumAdded != null) {
AlbumAdded(this, e);
}
}
private class AlbumCollection : Collection<string> {
Singer owner;
public AlbumCollection(Singer owner) {
this.owner = owner;
}
protected override void InsertItem(int index, string item) {
base.InsertItem(index, item);
owner.OnAlbumAdded(EventArgs.Empty);
}
}
}
Collection<string>を拡張したAlbumCollectionクラスを Singerクラスのイン
ナークラスとして定義しています。ここで、InsertItem メソッドをオーバー
ライドし、追加を捕捉できるようにします。
Singerクラスでは、拡張した AlbumCollectionを保持しましが、Albumsプロパ
ティは、Collection<string>のまま変更しません。こうすることで、
Singer singer = new Singer();
singer.AlbumAdded += new EventHandler(singer_AlbumAdded);
singer.Albums.Add("ABC");
というコードが書けるようになります。
利用者側は、最後の Albums.Addの部分を書き換える必要はありません。
前回と2回に分けて、ジェネリック リストを公開してはいけない理由とその
対応方法を説明してきましたが、実際のアプリケーション開発においては、
それほど厳密にこのルールを守る必要はないと思います。
ただ、多くの開発者が利用するような汎用クラスライブラリを作成する場合に
は、このルールに従っていけば、将来の機能拡張に備えられるようになります。
■ 参照MSDNページ
CA1002: ジェネリック リストを公開しません (しないでください)
http://msdn.microsoft.com/ja-jp/library/ms182142.aspx
───────────────────────────────────
『C#プログラミングレッスン』 (ぼぼ週刊)
───────────────────────────────────
Published by Gushwell.
Copyright (C) 2004-2009 Gushwell All rights reserved.
Microsoft MVP - Visual C#(Apr 2005 - Mar 2010)
<<■ Gushwell's Page ■>>
窓際プログラマ─の独り言 :http://gushwell.ldblog.jp/
窓際プログラマ─の読書三昧:http://gushwell.jugem.jp/
Gushwell's F# Programming Diary : http://techbank.jp/gushwell/
Gushwell's C# Programming Page :http://gushwell.ifdef.jp/
C#デザインパタ─ン : http://gushwell.ifdef.jp/dp/csdpindex.html
☆メールマガジンの感想お待ちしています☆
http://gushwell.ifdef.jp/mail.html
<<■ コミュニティtechbank.jp (http://techbank.jp/Community/) ■>>
Gushwellが参加している技術系コミュニティです。
マイクロソフト系テクノロジー&製品に特化したコミュニティで、Webサイト
では、VB、C#、VC++、SQL Server, BizTalk Server などの技術情報を公開し
ています。皆さんの参加をお待ちしています。
ブロガーさんも募集中です。
───────────────────────────────────
--- PR ---------------------------------------------------------------
闘うプログラマー[新装版] - ビル・ゲイツの野望を担った男達
G・パスカル・ザカリー (著), 山岡 洋一 (翻訳)
http://www.amazon.co.jp/exec/obidos/ASIN/4822247570/csharplesson-22/
最新の記事
このメルマガもおすすめ
-
Office & VBA パーフェクトマスター
- 最終発行日:
- 2012/02/08
- 読者数:
- 5878人
Excel・Access・Word等の今さら聞けない「疑問」、今すぐ知りたい「困った」、たちまち解決!のmoug(モーグ)がお送りする、関数初心者からVBA手練の方への+1テクニックメールマガジン!読めば納得の情報マガジンです。
-
ネットワークエンジニア
- 最終発行日:
- 2011/11/21
- 読者数:
- 350人
ネットワークエンジニアはコンピュータでソフトウェアを開発する時、参考にできるC・VC言語の情報マガジンす。
-
知って得する!パソコン知識
- 最終発行日:
- 2012/02/06
- 読者数:
- 7931人
パソコンに関する操作、裏技、知識を一日一配信一解説します。毎日購読すればあなたもパソ通です。
-
全部フリーソフト!!
- 最終発行日:
- 2012/02/09
- 読者数:
- 5234人
ネット上にはこんなに便利なソフトがいっぱい。仕事にも、遊びにも、あると絶対にお得で楽しいソフトを1つずつご紹介します。
-
VisualBasic エンジニア
- 最終発行日:
- 2011/11/22
- 読者数:
- 339人
VisualBasic エンジニアはコンピュータでソフトウェア開発をするためにVisualBasic 言語・Basic 言語・スクリプトなど、様々な言語を題材に多くの使用方法・プログラミングテクニックをお送りするマガジンです。
発行者プロフィール
- 2009/12/15
- 2009/12/8
- 2009/12/2
- 2009/11/24
- 2009/11/17
- 2009/11/3
- 2009/10/27
- 2009/10/20
- 2009/10/13
- 2009/10/6
- 2009/9/29
- 2009/9/24
- 2009/9/15
- 2009/9/8
- 2009/9/1
- 2009/8/18
- 2009/8/11
- 2009/8/4
- 2009/7/29
- 2009/7/21
- 2009/7/14
- 2009/7/7
- 2009/6/30
- 2009/6/23
- 2009/6/16
- 2009/6/9
- 2009/6/3
- 2009/6/1
- 2009/5/12
- 2009/4/28
- 2009/4/21
- 2009/4/14
- 2009/4/7
- 2009/3/31
- 2009/3/24
- 2009/3/17
- 2009/3/10
- 2009/3/3
- 2009/2/28
- 2009/2/24
- 2009/2/10
- 2009/2/3
- 2009/1/27
- 2009/1/6



