3

私は非常に単純なシナリオを持っています。私のサイトのユーザーは、月額会員または年会費のいずれかになります

public class User
{
    public string UserName { get; set; }
    public MembershipType MembershipType { get; set; }
}

public enum MembershipType
{
    MONTHLY,
    ANNUALLY
}

メンバーシップに応じて、異なる課金戦略を適用します。

public interface IBillingStrategy
{
    void Bill(User user);
}

if (user.MembershipType == MembershipType.ANNUALLY)
{
     _billingStrategy = new AnnualBillingStrategy();
}
else if (user.MembershipType == MembershipType.MONTHLY)
{
      _billingStrategy = new MonthlyBillingStrategy();
}

これは非常に単純明快です。今度はビジネスがやって来て、「友人のボブの面倒を見たいので、彼の請求書を他の人とは少し違った方法で計算してほしい!」と言います。

したがって、このパターンを続ければ、BobBillingStrategy を作成できます。次に、いくつかのロジックを追加できます。ボブを識別する方法が 2 つあります。

if (user.UserName.Equals("bob"))
{
     _billingStrategy = new BobBillingStrategy();
}

ユーザー名をハードコーディングしているため、これは汚いと感じます。運が良ければ、新しいユーザーが作成されます。したがって、IsBob というブール値のプロパティをユーザーに追加できます。

if (user.IsBob)
{
     _billingStrategy = new BobBillingStrategy();
}

どちらも私には面白いにおいがするようです。最終的にはフレッドとテッドのテストを開始する予定です。上記のコードは機能しますが、よりクリーンなソリューションが必要であると確信しています。

ありがとう

4

4 に答える 4

1

ある種のクーポン コード メカニズムを追加して、他のユーザーとは異なる方法で計算する必要がある場合でも、同じように柔軟に計算できるようにします。

于 2014-08-26T08:40:20.397 に答える
1

請求手順の別のバリエーションを作成します。

public enum MembershipType
{
    MONTHLY,
    ANNUALLY,
    SPECIAL1
}

そうすれば、少なくとも同じ手順を他の「友達」に割り当てることができます

于 2014-08-26T08:17:11.767 に答える