トップ > コンピュータ > プログラム > C#プログラミングレッスン

C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしましょう。 

RSS

メルマガの登録・解除

登録した方には、メルマ!からオフィシャルメルマガ(無料)をお届けします。

【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/

 

最新の記事

ブックマークに登録する

TwitterでつぶやくLismeトピックスに追加するはてなブックマークに追加del.icio.usに追加Buzzurlにブックマークニフティクリップに追加ライブドアクリップに追加Yahoo!ブックマークに登録記事をEvernoteへクリップ
My Yahoo!に追加Add to Google

規約に同意してこのメルマガに登録/解除する

登録した方には、メルマ!からオフィシャルメルマガ(無料)をお届けします。

この記事へのコメント

コメントを書く


上の画像で表示されている文字を半角英数で入力してください。

コメントの投稿時は投稿者規約への同意が必要です。

  1. コメントはありません。

このメルマガもおすすめ

  1. Office & VBA パーフェクトマスター

    最終発行日:
    2012/02/08
    読者数:
    5878人

    Excel・Access・Word等の今さら聞けない「疑問」、今すぐ知りたい「困った」、たちまち解決!のmoug(モーグ)がお送りする、関数初心者からVBA手練の方への+1テクニックメールマガジン!読めば納得の情報マガジンです。

  2. ネットワークエンジニア

    最終発行日:
    2011/11/21
    読者数:
    350人

    ネットワークエンジニアはコンピュータでソフトウェアを開発する時、参考にできるC・VC言語の情報マガジンす。

  3. 知って得する!パソコン知識

    最終発行日:
    2012/02/06
    読者数:
    7931人

    パソコンに関する操作、裏技、知識を一日一配信一解説します。毎日購読すればあなたもパソ通です。

  4. 全部フリーソフト!!

    最終発行日:
    2012/02/09
    読者数:
    5234人

    ネット上にはこんなに便利なソフトがいっぱい。仕事にも、遊びにも、あると絶対にお得で楽しいソフトを1つずつご紹介します。

  5. VisualBasic エンジニア

    最終発行日:
    2011/11/22
    読者数:
    339人

    VisualBasic エンジニアはコンピュータでソフトウェア開発をするためにVisualBasic 言語・Basic 言語・スクリプトなど、様々な言語を題材に多くの使用方法・プログラミングテクニックをお送りするマガジンです。