2011-10-24 3 views
1

私はGraphというオブジェクトを持っています。プロパティのプロパティに機能を追加します。

私はGraphクラスのVerticesのリストを持っています。だからクラスはこのように見えるでしょう。その.Net 2.0コード。

public class Graph 
{ 
    public List<Vertex> Vertices 
    { 
     get{ return _vertices} 
    } 
} private List<Vertex> _vertices; 

ここは私の質問です。グラフオブジェクトに追加する前に、Vertexオブジェクトを(Vertex.IsValid()メソッドを呼び出して)検証したいと思います。

どうすればいいですか?私は、プロパティのゲッターブロック内にコードを追加する方法が好きです。それと似たような方法はありますか?

私は回避策がありますが、可能な限り最良の方法で対応したいと考えています。

+0

「回避策」とは何ですか?少なくとも1つの例。 .Net 2.0には拡張メソッドはありません...あなたが何をしようとしているのかを完全に把握するのに役立つと思うものを見てください。 – IAbstract

答えて

2

最善の解決策は、変更可能なリストとして頂点のリストを公開しないことです。代わりに、Verticesプロパティが必要な場合は、読み取り専用のデータ構造体を返します。すると、ちょうどAdd()法、そしてあなたが望むすべてを検証:

public ReadOnlyCollection<Vertex> Vertices 
{ 
    get { return _vertices.AsReadOnly(); } 
} 

public void Add(Vertex vertex) 
{ 
    if (vertex.IsValid()) 
     _vertices.Add(vertex); 
} 
+1

setterからの保護をしたいのですが、setterが必要なときにハードコーディングを行うことがあります。 –

+0

@Saeed私たちが与えた唯一の制約は、「追加された頂点を確実に有効にする」ことでした。これを行う典型的な方法は、追加が包含クラスによって確実に行われるようにすることです。完全に変更可能なリストを公開することは、制限が無意味であることを意味します。グラフの場合、とにかく頂点を「設定」する理由はほとんどありません。あなたはそれらを追加します(そしておそらくそれらを削除します)。それほど難しいことではありません。 – dlev

1

はこのような何かを試すことができ、擬似コード

EDIT

拡張メソッド

public static class MyCoolVertex 
    { 
     public static void AddVertexAndValidate(this List<int> list, Vertex value) 
     { 
      if(value.IsValid()) 
       list.Add(value); 
     } 
    } 

そして、この使用AddVertexAndValidate方法後

良い:基本的には

悪いを行わ:あなただけAddリスト上を呼び出し、この方法であなたのワークフローに違反するために誰かを停止することはできません。このことができます

・ホープ..

+1

これは実際には役に立ちません。 'Vertices'はコンパイル時の型' List 'です。つまり、クラスの隠蔽' Add() 'メソッドは呼び出されません。 – dlev

+0

こんにちは@Tigran、答えてくれてありがとう。しかし、派生クラスを持っていることは、私がその質問で言及した回避策でした。そうでなければそれを行う方法があるのか​​どうか疑問に思っていただけです。 – SaravananArumugam

+3

なぜVerticesはListの実装ではなくインターフェイスとして公開されるべきであるかの大きな理由 – Vadim

2

似たような状況のために私のソリューションは、このように、グラフに頂点オブジェクトを追加するヘル​​パーメソッドを追加することです:

public void AddVertex(Vertex vertex) 
{ 
    if (vertex.IsValid()) 
     _vertices.Add(vertex); 
} 

の場合あなたは多くのGraphオブジェクトを持っておらず、グラフには通常頂点があり、Listコレクションをあらかじめ割り当てておくので、常に空であり、決してnullではありません(私はこの特別なケースではおそらく良いアイデアだと思います)。それ以外の場合、AddVertexメソッドは、_verticesがnullであることをチェックし、Listを割り当てる必要があります。そのような状況では、私は通常、nullの場合にListを割り当てるCreateVertices()メソッドを作成し、必要に応じてクラスの他のメソッドや、クラスのユーザーによって使用することもできます。簡単な方法は、常にコレクションを事前に割り当てることですが、クラスのインスタンスが多数あり、コレクションを使用しないことが多い場合は、これを避けます。

Listは不変ではないため、このソリューションは完璧ではありません。クラスのユーザーはVerticesプロパティを使用してリストを取得し、直接Add()を実行できます。そのための私の唯一の解決策は、ドキュメントに追加する適切な方法を説明するVerticesプロパティの備考タグなどのドキュメントです。 C#は、返されたコレクションを読み取り専用としてフラグを設定する方法から利益を得ることができます。あなたがそれをすることが必死なら、Listをラップして、通常のListからそれ自身をコピーして作成できる読み取り専用のコレクションを作成し、そのプロパティで不変のリストを返すことができます。

関連する問題