LoginSignup
0
1

More than 5 years have passed since last update.

メソッドの再利用性を高めるためeventを活用した

Posted at

やりたいこと

ある処理をクラス化する場合、クラスのコードをべた書きすると当然逐次処理となる。
べた書きの場合、ある処理の一部を少しだけ変えて処理をしたい場合は別クラスを作成するか、その部分のクラス化をあきらめるかしないといけない。
それを回避するために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());
        }

イベントそれぞれに個別処理を定義し、処理を実行。

以上

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1