2

これは、スタックオーバーフローのアナロジーでよりよく説明される設計上の質問です。

ユーザーはバッジを獲得できます。ユーザー、バッジ、獲得バッジはデータベースに保存されます。バッジのロジックは、バッジ条件戦略によって実行されます。バッジ条件戦略は複雑なツリー構造オブジェクトであるため、データベースに保存する必要はありません。

データベースに保存されているバッジをバッジ条件戦略に関連付けるにはどうすればよいですか?回避策しか考えられません。例:バッジごとに1つのクラスを作成し、SINGLE_TABLE継承戦略を使用します。または、データベースからバッジを取得し、プログラムで正しいバッジ条件戦略を検索して挿入します。

より良いデザインを提案してくれてありがとう。

4

2 に答える 2

1

戦略をDBに保存する必要がある理由がわかりません-戦略はほとんどコードで表現されます(おそらく、DBに保存できるいくつかの構成パラメーターを使用しますが、それは私とは別の問題です)。

OTOHバッジとその条件戦略を1つのクラスに保持します。これにより、ルックアップの問題が解消されます。Javaでは、適切なドメインモデルは、バッジを列挙型として表現し、特定のユーザーがその特定のバッジを取得したかどうかを判別するためのオーバーライド可能なメソッドを使用することです。

ここでの更新は例です:

enum Badge {
  EPIC() {
    public boolean isEligible(User user) {
      // determine whether this user is eligible for the Epic badge
    }
  },
  CRITIC() {
    public boolean isEligible(User user) {
      // determine whether this user is eligible for the Critic badge
    }
  },
  ...
  ;

  public abstract boolean isEligible(User user);
}

しかし、本当にそれらを分離したい場合は、たとえばのコンストラクターで次のLegendaryBadgeように言いますthis.strategy = new LegendaryBadgeConditionStrategy();

于 2010-05-28T15:58:08.190 に答える
1

データベース内のバッジに対応するタイプのBadgeType列挙型はどうですか?列挙型には、各列挙型値の正しい戦略を返すgetBadgeConditionStrategy()メソッドを含めることができます。

public enum BadgeType {
     SMARTNESS( new SmartnessBadgeConditionStrategy() ),
     WISDOM( new WisdomBadgeConditionStrategy(),
     ...;

     private BadgeConditionStrategy badgeConditionStrategy;
     BadgeType(BadgeConditionStrategy badgeConditionStrategy) {
          this.badgeConditionStrategy = badgeConditionStrategy;
     }

     public getBadgeConditionStrategy() {
         return badgeConditionStrategy;
     }
 }
于 2010-05-28T16:32:59.673 に答える