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君,よろ!