初心者のためのC#プログラミング本格入門105 - 関係オブジェクトの変更を検知しよう
前回解説した問題は、関係を持つオブジェクトが変更された時に発生します。2つのオブジェクトが関係している場合、どちらか一方が変更されてしまうと整合性が取れなくなります。この問題を解決する方法は、変更されたことを知る仕組みを仕込む所から始まります。
変更されたことを知る方法は様々ですが、一番簡単な方法は変更回数の記録です。管理する要素が追加された時と削除された時に、用意した変数をインクリメントすれば変更回数を記録できます。記録できれば後はエラーを知らせるだけです。エラーの通知方法はまだ解説していないので、更新回数を記録するプログラムをサンプルに追加します。
partial class SimpleList
{
//関係のないプログラムは省略
private int updateCount; //更新回数
public SimpleList()
{
this.updateCount = 0;
}
public void Add( int value )
{
++this.updateCount;
}
public void Remove()
{
++this.updateCount;
}
}
private class Enumerator :
System.Collections.Generic.IEnumerable<int>,
System.Collections.Generic.IEnumerator<int>
{
private SimpleList owner;
private int initCount;
public Enumerator( SimpleList owner )
{
this.owner = owner;
this.initCount = owner.updateCount;
}
public System.Collections.Generic.IEnumerator GetEnumerator()
{
return ( System.Collections.Generic.IEnumerator<int> ) this;
}
System.Collections.IEnumerator
System.Collections.IEnumerable.GetEnumerator()
{
return ( System.Collections.IEnumerator ) this;
}
public int Current
{
get { return this.data[ this.readIndex ]; }
}
public bool MoveNext()
{
if ( this.initCount != this.owner.updateCount ) {
//問題あり!
System.Console.WriteLine( "取得後に変更されました。" );
}
++this.readIndex;
return this.data.Length > this.readIndex;
}
}
やっていることは簡単です。変更された回数の記録を取って、要素を取得するメソッドでエラーチェックをしているだけです。ここまでは問題ないと思います。問題なのはプログラマーにエラーを通知する方法です。コンソール画面に出力すると決めてしまうと、CUIでないアプリケーションでこのオブジェクトを使用した際に、問題が発生した事が伝わりません。例えば、WPFアプリケーションを作っている時に、コンソールにエラーを表示されても、普通はコンソール画面を見ていません。アプリケーションの種類に関係なく、エラーを通知する方法が必要です。続く...