我正在Spring和hibernate中开发Web应用程序。 我正在Database.Authors,书籍,出版物等中加载实体是我从excel加载的实体。 我有模式一个实体加载服务接口,然后我有每个实体的实现。 我的服务调用DAO实现。 现在我正在努力寻找下面提到的代码是否违反了SRP。 另外,我总是对如何决定班级的责任感到困惑,因为任何班级都可以有很多方法,每种方法都可以表现不同。所以他们应该在不同的班级中分开吗?。在我的案例中。我有4个方法,每个方法执行不同的任务。所以我最终得到每个方法的4个不同的类。如果我遵循这种方法(我知道是错的)那么我将总是在具有单一方法的类中。 此外,有时我觉得我会远离域驱动设计,因为我在功能的基础上折射代码。
关于如何从课堂角度决定责任是什么的任何建议? SRP代表单一责任原则。我很难确定这一责任。
public interface EntitiesLoadService {
public void loadEntities(Object o);
public void deleteEntities(Object o);
public List getEntities();
public Object getEntity(Object o);
}
服务实施
@Service("authorLoadService")
@Transactional
public class AuthorEntityLoadService implements EntitiesLoadService{
private AuthorDAO authorDao;
@Autowired
@Qualifier("authorDAO")
public void setAuthorDao(AuthorDAO authorDao) {
this.authorDao = authorDao;
}
@Override
public void deleteEntities(Object o) {
// TODO Auto-generated method stub
}
@Override
public void loadEntities(Object o) {
Set<author_pojo> author=(Set<author_pojo>)o;
Iterator<author_pojo> itr=author.iterator();
while (itr.hasNext()) {
author_pojo authorPojo = (author_pojo) itr.next();
authorDao.save(authorPojo);
}
}
@Override
@Transactional(readOnly=true)
public List getEntities() {
// TODO Auto-generated method stub
return null;
}
@Override
@Transactional(readOnly=true)
public Object getEntity(Object o) {
String author=(String)o;
author_pojo fetAuthor=authorDao.findOneByName(author);
return fetAuthor;
}
}
答案 0 :(得分:2)
你有AuthorDAO
这是应该与持久层进行所有交互的类,例如。数据库。
在您的示例中并不明显,因为您的AuthorEntityLoadService
具有仅委托给DAO层的类似方法。
随着项目和需求的增长,您将看到此类需要更多方法。这些方法将不仅仅负责DAO层上的CRUD操作。他们可能需要与内部或外部的其他服务进行交互。他们可能需要进行多次DAO调用。
在这种情况下,单一责任是提供与AuthorEntity
个实例交互的服务。
有许多正确的方法可以实现你提出的建议。
更具体地说,我对
的看法另外,我总是对如何决定责任感到困惑 class因为任何类都可以有很多方法,每个方法都可以 执行不同的事情。所以他们应该分开 不同的班级?
仅仅因为你有许多方法做不同的事情,并不意味着责任不被分享。 AuthorEntityLoadService
,我只需要AuthorEntityService
来管理服务层的AuthorEntity
个实例。图像,如果您有一个类,每个创建,更新,检索,删除AuthorEntity
都有一个方法。这没有多大意义。
并且
关于如何决定责任是什么的任何建议 透视一类?
进一步阅读,请尝试http://java.dzone.com/articles/defining-class-responsibility
答案 1 :(得分:2)
通常,在这种类型的n层体系结构中,您的服务层旨在提供事务(或其他依赖于资源)操作的API。每个服务的实现可以使用它需要的任何特定于资源的依赖项(如特定数据源的DAO),但它允许服务使用者保持对这些特定依赖项或资源的不可知。
因此,即使您的服务只是委托其特定于资源的依赖项,它也不会违反SRP,因为它的职责是定义与资源无关的API(以便消费者不需要知道所有资源 - 特定的东西),指定原子操作(必要时是事务性的)。