R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

2008年9月19日

とても似ているメソッドの共通化

今リアルで書いてある 4 つのメソッドは、とても似ている訳だ。
基本的に、先頭と末尾に同じ処理がダラダラとあって、その真ん中に各メソッド特有の処理が来る。

例えば、こんな感じ。(あんまり良いサンプルじゃないけど)


public Test1() {
  Console.WriteLine(this.A(true));
  Console.WriteLine(this.B(1, true));
  Console.WriteLine(this.C("R", 2, false));
  Console.ReadKey();
}

public int A(bool b) {
  Console.WriteLine("----------------------------------");
  Console.WriteLine(DateTime.Now.Ticks);
  Console.WriteLine("----------------------------------");
  Console.WriteLine("A : {0}", b);
  Console.WriteLine("--");
  return 1;
}

public string B(int i, bool b)  {
  Console.WriteLine("----------------------------------");
  Console.WriteLine(DateTime.Now.Ticks);
  Console.WriteLine("----------------------------------");
  Console.WriteLine("B:{0}, {1}", i, b);
  Console.WriteLine("--");
  return "R";

}

public bool C(string s, int i, bool b)  {
  Console.WriteLine("----------------------------------");
  Console.WriteLine(DateTime.Now.Ticks);
  Console.WriteLine("----------------------------------");
  Console.WriteLine("C:{0}, {1}, {2}", s, i, b);
  Console.WriteLine("--");
  return true;
}


引数の型や数、戻り値の型が同じならデリゲートで共通化できるのになぁ・・・と悩んでいたのですが、よくよく考えてみればデリゲートって外側の変数をそのまま使えちゃうんでしたっけ。
なんだ、簡単じゃん・・・orz

以下にように、

とても似ているメソッドの共通化

してみた。


public Test2() {
  Console.WriteLine(this.A(true));
  Console.WriteLine(this.B(1, true));
  Console.WriteLine(this.C("R", 2, false));
  Console.ReadKey();
}

public int A(bool b) {
  int r = 0;
  D(() => { Console.WriteLine("A : {0}", b); r = 1; });
  return r;
}

public string B(int i, bool b)  {
  string r = string.Empty;
  D(() => { Console.WriteLine("B:{0}, {1}", i, b); r = "R"; });
  return r;
}

public bool C(string s, int i, bool b)  {
  bool r = false;
  D(() => { Console.WriteLine("C:{0}, {1}, {2}", s, i, b); r = true; });
  return r;
}


public void D(Action a)  {
  Console.WriteLine("----------------------------------");
  Console.WriteLine(DateTime.Now.Ticks);
  Console.WriteLine("----------------------------------");
  a();
  Console.WriteLine("--");
}


なんか、気に入らないのでジェネリクスを使ってみた。


public Test3() {
  Console.WriteLine(this.A(true));
  Console.WriteLine(this.B(1, true));
  Console.WriteLine(this.C("R", 2, false));
  Console.ReadKey();
}

public int A(bool b) {
  return D(() => { Console.WriteLine("A : {0}", b); return 1; });
}

public string B(int i, bool b)  {
  return D(() => { Console.WriteLine("B:{0}, {1}", i, b); return "R"; });
}

public bool C(string s, int i, bool b)  {
  return D(() => { Console.WriteLine("C:{0}, {1}, {2}", s, i, b); return true; });
}

public T D<T>(Func<T> a)  {
  Console.WriteLine("----------------------------------");
  Console.WriteLine(DateTime.Now.Ticks);
  Console.WriteLine("----------------------------------");
  var r = a();
  Console.WriteLine("--");
  return r;
}


うーん、こんな感じで本番のコードも共通化できるかな。

posted @ 14:30 | Feedback (38)