这个服务层是否违反了SRP原则

时间:2013-09-16 21:24:16

标签: java spring-mvc design-principles

我正在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;
    }

}

2 个答案:

答案 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(以便消费者不需要知道所有资源 - 特定的东西),指定原子操作(必要时是事务性的)。