0

オブジェクトの設定が非常に複雑で、途中で選択するたびに利用可能なオプションが制限または拡張されます。例外をスローしたり、オブジェクトの無効なインスタンスを作成したりするのは嫌いです。そのため、以前のメソッド入力パラメーターに基づいてインスタンスを構築するときに、オプション (呼び出し可能なメソッド) を制限したいと考えています。たとえば、ユーザーがタイプ「A」の場合はロールに追加できるというルールがある場合、それ以外の場合はタイプ「B」の場合は場所を尋ね、場所が特定の郵便番号の場合...取得しますアイデア

これは、匿名のメソッド、タイプなどで可能ですか

ユーザータイプA

UserBuilder builder = new UserBuilder
builer.Build().ForType("A").WithRoles(rolesList);

ユーザータイプB

UserBuilder builder = new UserBuilder
builer.Build().ForType("B").WithLocations(locationList);

更新: 基本的に私の質問は、オブジェクトの状態に基づく有効なものを除いて、API からの他のすべてのパブリック メソッド オプションを制限する方法はありますか?

4

2 に答える 2

2

はい、これは理論的には可能です。(ただし、匿名のメソッド/型は、ほとんどの場合、関与しません。)

ただし、使用は少し悪夢になります。残念ながら、これらのタイプの制限を流暢なインターフェースの使用に適用する場合、タイプを「構築」する方法を理解するためのルールを知る必要があります。

さまざまなタイプのユーザーに特化したユーザー サブクラスを作成することをお勧めします。各サブクラスのコンストラクターが正しく初期化されるために必要なパラメーターを必要とし、必要に応じてメソッドとプロパティを公開します。

このようにして、適切なユーザーを作成するだけです。

UserA userA = new UserA(rolesList); // This requires roles to construct
UserB userB = new UserB(locationList); // This requires locations to construct
于 2009-10-28T17:16:44.450 に答える
0

以下のコードのようなことを行うことができますが、これは明らかに単なる概念です。問題は、流暢なインターフェイスを維持するために、チェーン内の各型のメソッド呼び出しをコーディングする必要があることです。

class Program
{
    static void Main(string[] args)
    {
        var builder = new UserBuilder();
        builder.BuildTypeA().WithRoles("a,b");
        builder.BuildTypeB().WithLocations("c,d");
    }
}

public abstract class User {}
public class UserA : User {}
public class UserB : User {}

public class UserBuilder
{
    public UserABuilder BuildTypeA() { return new UserABuilder(); }
    public UserBBuilder BuildTypeB() { return new UserBBuilder(); }
}

public class UserABuilder
{
    public UserABuilder WithRoles(string roles)
    {
        // add roles
        return this;
    }
}

public class UserBBuilder
{
    public UserBBuilder WithLocations(string locations)
    {
        // add locations
        return this;
    }
}
于 2009-10-28T17:44:01.647 に答える