初心者のためのC#プログラミング本格入門98 - 抽象クラスを上手く使って修正箇所を減らそう
前回、内部クラスを使用するように変更したことにより、テストを修正しなければならなくなりました。プログラミングをしていると、こうした事が起こります。経験を重ねると修正回数は減りますが、どうしても修正は避けられません。従って、極力プログラムの修正箇所を減らす為の工夫が必要です。
サンプルのテストプログラムを例にとります。このプログラムは、System.Collections.Generic.IEnumeratorを使用するように変更せねばなりません。また、今まで運よくインスタンスの作成方法が変わりませんでしたが、コンストラクタを修正する必要が生じるかもしれません。そこで、あらかじめ定義しておいた親の抽象クラスが役に立ちます。
先ずはプログラムを見て下さい。
abstract class Test
{
//初期化処理
public abstract void Initialize();
//テストの共通処理
protected void Execute()
{
++this.testCount;
this.Initialize();
}
//他の部分は変更しない
}
新しい抽象メソッドを追加して、そのメソッドを呼び出す処理を追加しています。この意味を詳しく考えてみましょう。親オブジェクトに抽象メソッドを追加すると、子オブジェクトに必要なメソッドの定義を知らせる事が出来ます。その理由はビルドしてみると分かります。先ほどのプログラムを追加した状態でビルドすると、子オブジェクトがInitializeメソッドを定義していないと言う旨のエラーが発生します。これでテスト対象の初期化処理を忘れなくても済むようになります。しかも必要なプログラムは簡単です。
class SimpleListTest : Test
{
private SimpleList target;
System.Collections.Generic.IEnumerator<int> ie;
public override void Initialize()
{
this.target = new SimpleList();
this.ie = this.target.GetEnumerator();
}
}
もうひとつ効果があります。先ほど示したように、抽象メソッドを呼び出すコード(※Executeメソッドの部分)を、親クラスのメソッドに追加できます。こうすることにより、子オブジェクトが書くべきプログラムが減ります。サンプルプログラムを例にとると、メソッドごとにthis.target = new SimpleList();
の様なプログラムを毎回書く必要がなくなります。決まった処理の書き忘れがなくなり、修正も少なくなるので非常に便利です。プログラミングではこうした小さな気配りが大きな生産性を生むきっかけになります。今回紹介した種類の手法を駆使すると、フレームワークが作れます。フレームワークと言うのは、プログラムを極力少なくする為の仕組みだと思って下さい。フレームワークと呼ばれるものが、こうした手法を駆使して作られている事を覚えておくと将来役に立ちます。続く...