我正在寻找一种设计模式或约定来解耦处理拥有实体的服务。我们假设我有一个ThemeService
来处理创建主题。首先,ThemeService
只为每个用户的UserData
保留主题,但需求会发生变化,主题归其他实体所有,例如ThemeCollection
。我的问题是,每个ThemeService
都与他们所拥有的"紧密耦合。实体是。例如:
public class ThemeService{
//coupled to UserData
createTheme(Theme t, UserData u);
getTheme(String name, UserData u);
hasTheme(String name, Userdata u); //Theme name unique within a userdata.
validateTheme(Theme t, UserData u); //unique name per user, valid colors, etc.
}
public class UserDataService{
ThemeService tService; //component for themes
getUsername(UserData u);
addTheme(Theme t, UserData u){ tService.createTheme(t, u); }
getTheme(String name, UserData u){ tService.getTheme(name, u); }
hasThemes(String name, UserData u){ tService.hasTheme(name, u); }
}
现在ThemeService与UserData紧密耦合。如果需求发生变化并且主题可以属于另一个实体,例如ThemeCollection,那么我无法重复使用ThemeService中的大部分代码,现在需要更多的ThemeCollection代码:
public class ThemeService{
//...continued or in another ThemeService class...
createTheme(Theme t, ThemeCollection c);
getTheme(String name, ThemeCollection c);
hasTheme(String name, ThemeCollection c);
validateTheme(Theme t, ThemeCollection c);
}
public class ThemeCollectionService{
ThemeService tService;
getCollectionName(ThemeCollection c);
addTheme(Theme t, ThemeCollection c){ tService.createTheme(t, c); }
getTheme(String name, ThemeCollection c){ tService.getTheme(name, c); }
hasThemes(String name, ThemeCollection c){ tService.hasTheme(name, c); }
}
我很想让它采用一个通用参数来实现类似" Themeable。"但是,这会使实体实现一个接口:
public class ThemeService{
createTheme(Theme t, Themeable owner);
getTheme(String name, Themeable owner);
hasTheme(String name, Themeable owner);
validateTheme(Theme t, Themeable owner);
}
@Entity
public class UserData implements Themeable{
getUsername();
getThemes(); //From Themable
}
@Entity
public class ThemeCollection implements Themeable{
getUsername();
getThemes(); //From Themable
}
我没有在Themeable界面中包含创建,获取,验证等,因为我不希望在我的实体类中使用业务逻辑,这应该是一个纯粹的数据结构(具有业务逻辑)根据Robert Martin"清洁代码"以及我试图遵循某些标准,模型很草率。
是否有标准的方式,模式,约定等来解耦?是我或多或少的"好的"还是在生产环境中不受欢迎?我试图摆脱那些完成工作的代码"对于模块化和可重用的代码,所以非常感谢任何帮助和指针。
编辑:"为什么您的服务与两个实体相关联?"
我需要一个地方来拼接'拥有实体和拥有实体在一起。例如,为UserData创建主题:
public void createTheme(Theme t, UserData u){
entityManager.persist(t);
if(!hasTheme(t.name(), u){
u.getThemes().add(t);
entityManager.merge(u);
}
}
因此,此功能与UserData以及任何类似的主题所有者"相关联。会有类似的代码。