delegateでDecorator

といっても,話題のAnonymous Methodではなく普通のdelegateのほうです.
先日までやっていたプロジェクトで仕変が入って,ある処理をするのに,前処理を1本追加してほしいと.まぁ,ちょろっと修正すればいいだけなんですが,今後さらに前処理を追加ってことになったときに,だんだんと複雑化していくのはいやだし……そうだ,Decoratorにしてみよう,と思いました.


(※ここから先は,サンプル用の仕様です)
これまで,電話番号のフォーマットは数字の羅列でした.
例)01234567890
それがハイフン付のフォーマットもサポートすることになり,ハイフンを削除する前処理が必要になりました.
例)012-3456-7890
しかし,今後スペース区切りやカッコ付もサポートすることになるかもしれません.
例)012 3456 7890 , 012-(3456)-7890


こんな感じで実装してみました.

class Program
{
  private delegate string PreProcessCallback(string s, Queue<PreProcessCallback> callbackQueue);

  private static string PreProcess1(string s, Queue<PreProcessCallback> callbackQueue)
  {
    string s2 = s.Replace("-", "");

    if (callbackQueue != null && callbackQueue.Count != 0)
    {
      PreProcessCallback callback = callbackQueue.Dequeue();
      s2 = callback(s2, callbackQueue);
    }

    return s2;
  }
  
  private static string PreProcess2(string s, Queue<PreProcessCallback> callbackQueue)
  {
    string s2 = s.Replace("(","").Replace(")","");

    if (callbackQueue != null && callbackQueue.Count != 0)
    {
      PreProcessCallback callback = callbackQueue.Dequeue();
      s2 = callback(s2, callbackQueue);
    }

    return s2;
  }
  
  private static string PreProcess(string s, Queue<PreProcessCallback> callbackQueue)
  {
    if (callbackQueue != null && callbackQueue.Count != 0)
    {
      PreProcessCallback callback = callbackQueue.Dequeue();
      s = callback(s, callbackQueue);
    }

    return s;
  }

  static void Main(string[] args)
  {
    string telno1 = "01234567890";
    string telno2 = "012-3456-7890";
    string telno3 = "012-(3456)-7890";

    Queue<PreProcessCallback> callbackQueue1 = new Queue<PreProcessCallback>();
    callbackQueue1.Enqueue(PreProcess1);

    Queue<PreProcessCallback> callbackQueue2 = new Queue<PreProcessCallback>();
    callbackQueue2.Enqueue(PreProcess1);
    callbackQueue2.Enqueue(PreProcess2);

    Console.WriteLine("telno1:=[{0}]",PreProcess(telno1,null));
    Console.WriteLine("telno2 before:=[{0}]", telno2);
    Console.WriteLine("telno2 after :=[{0}]", PreProcess(telno2,callbackQueue1));
    Console.WriteLine("telno3 before:=[{0}]", telno3);
    Console.WriteLine("telno3 after :=[{0}]", PreProcess(telno3,callbackQueue2));
  }
}

実行結果

telno1:=[01234567890]
telno2 before:=[012-3456-7890]
telno2 after :=[01234567890]
telno3 before:=[012-(3456)-7890]
telno3 after :=[01234567890]

もうちょっと工夫できそう(似たような処理があるので)ですが,まずまずかなぁ……?
そんなわけであとはT君,よろ!