インターフェースを考える(11)IActionを手直し
ISpecification同様IActionを手直し+拡張メソッドを導入
まずCompositeActionクラス
namespace Nmdm.Actions { public sealed class CompositeAction<TContext> : IAction<TContext> { public CompositeAction(IAction<TContext> one, IAction<TContext> other) { this.One = one ?? new NullAction<TContext>(); this.Other = other ?? new NullAction<TContext>(); } private IAction<TContext> One { get; } private IAction<TContext> Other { get; } public void Do(TContext context) { this.One.Do(context); this.Other.Do(context); } } }
これの拡張メソッドが以下の通り
namespace Nmdm.Actions { public static class CompositeActionExtension { public static IAction<TContext> Add<TContext>(this IAction<TContext> one,IAction<TContext> other) { return new CompositeAction<TContext>(one, other); } } }
考え方はISpecificationで実装した拡張メソッドと同じか、
前にCompositeActionを書いた時は無理やり不変+流暢にするため、CompositeActionにAddメソッドを持たせたけど、
やはりあの書き方だとクラスが無駄に複雑になってましたね。
あくまで「書き方」に留まるレベルなら無理にクラスの実装をこねくり回すより、
拡張メソッドに委譲した方が楽ですね。