R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

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

今リアルで書いてある 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;
}


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

投稿日時 : 2008年9月19日 14:30

Feedback

# re: とても似ているメソッドの共通化 2008/09/19 16:29 凪瀬

引数を何らかのクラスでラップして、ジェネリクスを適用してしまうんですよ。

public bool X(P param) {}

# re: とても似ているメソッドの共通化 2008/09/19 16:56 シャノン

ジェネリックは < > って書かないとダメっすよー?
HTML とジェネリックの相性の悪さは何とかなんないっすかね。

# re: とても似ているメソッドの共通化 2008/09/19 17:27 R・田中一郎

凪瀬 さん

>引数を何らかのクラスでラップして、ジェネリクスを適用してしまうんですよ

実は試してみたんですけど、引数のクラスを都度作るのが面倒くさくなって断念してしまいました。
匿名型をジェネリクスでうまく渡せれば最高なんだけどねー

・・・って、ここまで書いて何となくできそうな気がしてきた俺ガイルー
やってみよう。

--------------------------------
シャノン さん

>ジェネリックは < > って書かないとダメっすよー?

おー、ご指摘ありがとうございますー
書いて保存して、開いて一部修正すると消えちゃうんですよね。

結局、html で直書きするか、どこかにソースを書いてコピペしないとダメっぽい・・・

# 処理のクラス化 2008/09/23 23:09 C#と諸々

とても似ているメソッドの共通化ロギングのような別の関心事に関する共通処理ならばアスペクト指向という手もある。が、ここではそういうケ...

# Someone necessarily help to make severely posts I would state. This is the very first time I frequented your web page and to this point? I amazed with the analysis you made to make this particular put up amazing. Magnificent process! 2019/04/05 22:42 Someone necessarily help to make severely posts I

Someone necessarily help to make severely posts I would state.
This is the very first time I frequented your web page
and to this point? I amazed with the analysis you made to make this particular put up amazing.

Magnificent process!

# It's awesome to pay a visit this web site and reading the views of all friends regarding this article, while I am also keen of getting know-how. 2019/05/11 21:52 It's awesome to pay a visit this web site and read

It's awesome to pay a visit this web site and reading
the views of all friends regarding this article, while I am
also keen of getting know-how.

タイトル  
名前  
Url
コメント