No more Death March

あるSEのチラシの裏 C# WPF

インターフェースを考える(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メソッドを持たせたけど、
やはりあの書き方だとクラスが無駄に複雑になってましたね。
あくまで「書き方」に留まるレベルなら無理にクラスの実装をこねくり回すより、
拡張メソッドに委譲した方が楽ですね。