やりたいこと
ある処理をクラス化する場合、クラスのコードをべた書きすると当然逐次処理となる。
べた書きの場合、ある処理の一部を少しだけ変えて処理をしたい場合は別クラスを作成するか、その部分のクラス化をあきらめるかしないといけない。
それを回避するためにeventを活用しクラスに汎用性を持たし再利用性を高めることにした。
やったこと
登場人物
クラス | 概要 |
---|---|
SomeProcessExecutor | ある処理を実行するクラス(ここがメイン) |
GenericEventArgs<T> | イベント引数。SomeProcessExecutorのイベント発生時に呼び出し元クラスが特定の値を受け取る。 EventArgsクラスを継承 |
Form1 | SomeProcessExecutorを呼び出すクラス |
クラスの内容
GenericEventArgs<T>
public class GenericEventArgs<T> : EventArgs
{
public T EventData { get; set; }
public GenericEventArgs(T evenData)
{
EventData = evenData;
}
}
ジェネリクスを使用し、処理に応じて呼び出し元に引き渡す型を変えられるようにした。ここでは引き渡しは1つにしてある。
SomeProcessExecutor
public class SomeProcessExecutor
{
public event EventHandler<GenericEventArgs<string>> MainProcessHandler;
public event EventHandler<GenericEventArgs<Exception>> ExceptionHandler;
public void Execute()
{
try
{
//共通の前処理の実施
//(イベント発生】呼び出し元個別の処理
//呼び出し元でイベント発生時の処理を記述
ExecuteMainProcessHandler(new GenericEventArgs<string>("Hello World!"));
//共通の後処理を実施
}
catch(Exception e)
{
//呼び出し元でイベント発生時の処理を記述
ExecuteExceptionHandler(new GenericEventArgs<Exception>(e));
}
}
private void ExecuteMainProcessHandler(GenericEventArgs<string> arg)
{
//イベントが呼び出し元で定義されている場合のみイベント処理を実施
EventHandler<GenericEventArgs<string>> handler = this.MainProcessHandler;
if (handler != null)
{
handler(this, arg);
}
}
private void ExecuteExceptionHandler(GenericEventArgs<Exception> arg)
{
//イベントが呼び出し元で定義されている場合のみイベント処理を実施
EventHandler<GenericEventArgs<Exception>> handler = this.ExceptionHandler;
if (handler != null)
{
handler(this, arg);
}
}
}
呼び出し元個別に処理を定義したい箇所でイベントを定義
Form1
private void button1_Click(object sender, EventArgs e)
{
//ある処理のインスタンスを生成し、イベントの処理を定義
SomeProcessExecutor executor = new SomeProcessExecutor();
executor.MainProcessHandler += Execute;
executor.ExceptionHandler += handleException;
//ある処理を実行する処理を実行
executor.Execute();
}
private void Execute(object sender, GenericEventArgs<string> args)
{
//呼び出し元個別の処理を定義
MessageBox.Show(args.EventData);
}
private void handleException(object sender, GenericEventArgs<Exception> args)
{
//呼び出し元個別の処理を定義(例外発生時)
MessageBox.Show(args.EventData.ToString());
}
イベントそれぞれに個別処理を定義し、処理を実行。
以上