5
public class StepClause
{
    public NamedStepClause Action1() {}

    public NamedStepClause Action2() {}
}

public class NamedStepClause : StepClause
{
    public StepClause Step(string name) {}
}

基本的には、次のようなことができるようになりたいです。

var workflow = new Workflow().Configure()
    .Action1()
    .Step("abc").Action2()
    .Action2()
    .Step("def").Action1();

そのため、いくつかの「ステップ」には名前が付けられており、いくつかは付けられていません。

私が気に入らないのは、StepClause がその派生クラス NamedStepClause の知識を持っていることです。

私はこれをよりよくするためにいくつかのことを試しました。私は物事をインターフェイスに移動しようとしましたが、問題は具体的なものからインターフェイスに移動しました. Step() を完全に別の型の一部にすることもできます。その場合、この問題は発生せず、次のようになります。

var workflow = new Workflow().Configure()
    .Step().Action1()
    .Step("abc").Action2()
    .Step().Action2()
    .Step("def").Action1();

これは問題ありませんが、可能であればステップの命名をオプションにしたいと思います。

SO hereに関するこの他の投稿は、興味深く有望に見えます。あなたの意見は何ですか?元の解決策は完全に受け入れられないと思いますか?

ところで、これらのアクション メソッドは述語とファンクターを使用しますが、ステップに名前を付けるために追加のパラメーターを使用する必要はないと思います。

私にとって重要なのは、これらのアクション メソッドを 1 か所だけで定義することです。したがって、ジェネリックと拡張メソッドを使用した参照リンクのソリューションは、これまでのところ最良のアプローチのようです。

4

1 に答える 1

8

2 つのオプションを提示します。

オプション A

var a = new A.NamedStepClause();

a.Action1()
    .Step("abc").Action2()
    .Action2()
    .Step("def").Action1();


namespace A
{
    public class StepClause<SC> where SC : StepClause<SC>
    {
        public SC Action1() { return null; }
        public SC Action2() { return null; }
    }

    public class NamedStepClause : StepClause<NamedStepClause>
    {
        public NamedStepClause Step(string name) { return null; }
    }
}

オプション B

var b = new B.StepClause();

b.Action1()
    .Step("abc").Action2()
    .Action2()
    .Step("def").Action1();

namespace B
{
    public class StepClause
    {
        public StepClause Action1() { return null; }
        public StepClause Action2() { return null; }
    }

    public static class StepClauseExtensions
    {
        public static StepClause Step(this StepClause @this, string name)
        { return null; }
    }
}

どちらのオプションもコンパイルされ、探している流暢なインターフェイスが提供されます。クラスの内部動作にアクセスできるため、オプション A を使用する傾向があります。拡張メソッドを使用するということは、クラスに何らかの外部アクセスを与える必要があり、カプセル化が壊れる可能性があることを意味します。

幸運を!

于 2010-03-17T04:29:50.437 に答える