++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

読み取り専用

with 2 comments

OOP言語でクラスを作る際に重要な点:

  • ユーザーには必要最小限の権限しか与えない
  • 書き換えが不要なら、読み取り専用に作る

自分で書くか、少なくとも設計段階から関わってる分には別に何も困ることなくやれるんでいいんですが、最近、途中入りのプロジェクトで多少苦労していたり。

例えば、「読み取り専用に作れ」って言われたとき、以下のような書き方が考えられます。

(説明に不要な部分は省略)

using System.Collections.Generic;
 

class ReadOnlyClass

{
   
// (クラス外部から)読み取り専用プロパティ
   
public int X { get; private set; }
 
   
//
(クラス内部からも)読み取り専用プロパティ
   
public int Y { get { return _y; } }
   
private readonly int
_y;
 
   
//
これで読み取り専用のつもりになることが
   
public int[] ListX { get; private set; }
 
   
//
本当は、こう書かないと配列の中身を書き換えられる
   
public IEnumerable<int> ListY { get { return _listY; } }
   
private int
[] _listY;
}

 

まあ、何に悩むかというと、3つ目、ListX のところ。本当は ListY の方みたいに、IEnumerable で返さないといけないわけですが。途中入りだと、往々にして ListX みたいな状態になっているわけで。int[] 以外にも、List<int> なことなども。

全部 IEnumerable に書き直したいものの、利用側が foreach (var x in ListX) { } ではなくて、for (int i = 0; i < ListX.Length; ++i) { int x = ListX[i]; } なんですよねぇ、見事に…

ReadOnlyCollection でラップして返すのが楽ではあるものの。1つたりとも、for が必要な箇所がなく(foreach で書ける)。

広告

Written by ufcpp

2011年8月8日 @ 16:34

カテゴリー: C#

コメント / トラックバック2件

Subscribe to comments with RSS.

  1. ・読み取り専用にしたいって意図が伝わるのが1番。
    ・その次にListYのように正しい手段で公開する。

    リフレクションで_listYにアクセスできちゃうので、ListYを実装しても意図を無視されたら意味なっしんぐ。
    と思ったけど、不慮の事故で書き換えられてしまうってことを考えると、ListYまでがマストですねぇ。
    でもそこまで気の付く人って少ない。

    noname

    2011年8月9日 at 03:40

  2. はじめまして、ListX のところなるほどとこうすればいいんですね。
    Getメソッドにして、配列作り直して渡していました。これなら、らくちんですね。

    いわもと

    2011年9月15日 at 23:51


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。