Web サイトのリボン/実績システムをコーディングしていますが、システム内の各リボンにいくつかのロジックを記述する必要があります。たとえば、最初の 2,000 人が Web サイトに登録した場合、またはフォーラムに 1,000 件の投稿があった場合、リボンを獲得できます。このアイデアは、実際には、stackoverflow のバッジと非常によく似ています。
したがって、すべてのリボンは明らかにデータベースにありますが、ユーザーがいつリボンを獲得したかを判断するためのロジックも少し必要です。
私がコーディングした方法でRibbon
は、シンプルなインターフェースです:
public interface Ribbon {
public void setId(int id);
public int getId();
public String getTitle();
public void setTitle(String title);
public boolean isEarned(User user);
}
RibbonJpa
メソッドRibbon
の定義を回避して、インターフェースを実装する抽象クラスです。isEarned()
@Entity
@Table(name = "ribbon")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "ribbon_type")
public abstract class RibbonJpa implements Ribbon {
@Id
@Column(name = "id", nullable = false)
int id;
@Column(name = "title", nullable = false)
private String title;
@Override
public int getId() {
return id;
}
@Override
public void setId(int id) {
this.id= id;
}
@Override
public String getTitle() {
return title;
}
@Override
public void setTitle(String title) {
this.title = title;
}
}
継承戦略を次のように定義していることがわかりますSINGLE_TABLE
(50 個のリボンのようにコーディングする必要があり、それらのいずれにも追加の列は必要ないため)。
これで、特定のリボンが次のように実装されます。
@Entity
public class FirstUsersRibbon extends RibbonJpa implements Ribbon {
public FirstUsersRibbon() {
super.setId(1);
super.setTitle("First 2,000 users registered to the website");
}
@Override
public boolean isEarned(User user) {
// My logic to check whether the specified user has won the award
}
}
このコードは正常に動作し、期待どおりにテーブルがデータベースに作成されます (ローカル環境で DDL 生成を使用しています)。
問題は、ドメイン オブジェクトでビジネス ロジックをコーディングするのは間違っていると感じることです。それは良い習慣ですか?より良い解決策を提案できますか? また、エンティティ ( ) 内の DAO を Autowire することができずFirstUsersRibbon
、ビジネス ロジックでそれらが必要です (この場合、ユーザーが Web サイトに登録された最初の 2,000 ユーザーに含まれているかどうかを確認するために DAO が必要です)。
どんな助けでも大歓迎です。
ありがとうございました!