今リアルで書いてある 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;
}
うーん、こんな感じで本番のコードも共通化できるかな。