我正在编写一个网站的功能区/成就系统,我必须为我的系统中的每个功能区编写一些逻辑。例如,如果您在前2000人注册到网站或在论坛中发布了1000个帖子后,就可以获得功能区。这个想法非常类似于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(FirstUsersRibbon
),并且我需要它们处理业务逻辑(在这种情况下,我需要一个DAO来检查用户是否在注册到该网站的前2000个用户中) 。
任何帮助非常感谢。
谢谢!
您是否听说过SOLID?我认为你在这里打破了2个原则。 LSP(在您的类RibbonJpa实现功能区中)和ISP(功能区中的方法签名) – karlihnos