0

我有一段代码基本上是通过 Hibernate 从数据库中检索 Bean 对象,在将其存储回数据库之前对两个或三个属性的值进行一些更改。

让我们看一个真实的例子。我的应用程序的目的是让几个人参加 MCQ 测试。为了防止在每次用户提交答案时更新分数而使数据库过载,我将分数计数器存储在 aHashMap中,该计数器将在测试结束时刷新到数据库中。我还需要更新时间戳,指示测试结束的时间。

我目前的设计涉及两个功能。

这第一个函数将分数从 刷新HashMap到数据库。

private void flushScoreToDatabase(String id) {

    int score = scoreMap.get(id);

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();

    try {
        session.beginTransaction();
        Student student = (Student)session.get(Student.class, Integer.parseInt(id));
        student.setScore(score);
        session.getTransaction().commit();
        scoreMap.remove(id);
    } catch (HibernateException e) {
        session.getTransaction().rollback();
    }
}

第二个功能将涉及更新时间戳。

private void updateTimestamp(String id) {
    Session session = Hibernate.getSessionFactory().getCurrentSession();

    try {
        sesssion.beginTransaction();
        Student student = (Student)session.get(Student.class, Integer.parseInt(id));
        student.setEndTime(timestamp);
        session.getTransaction().commit();
    } catch (HibernateException e) {
        session.getTransaction().rollback();
    }
}

这两个函数都将被另一个函数包装,该函数id从经过身份验证的会话中获取用户的 。

这是相当昂贵的,因为这涉及两个SELECT语句以及两个UPDATE语句,只是为了为同一用户更新两个不同的属性。

在遵守 SRP 的同时,有没有更简洁的方法来设计代码?

4

1 回答 1

2

通常,SRP 是参考一个类或模块来讨论的,但我认为考虑函数的含义是正确的,一个“杂乱无章”的函数,其工作是“x 和 y 和 z”可能不是好的设计。

还执行两个单独的事务来更新分数和时间戳肯定是多余的。

我倾向于从商业意义的角度来考虑这些功能,比如:

snapshotTest()

endTest()

并且有一个效用函数可以更新这两者使用的学生的分数。

顺便说一句,所有这些事务性的东西都妨碍了你的业务逻辑,你能不使用 EJB 或 Spring 将其推送到容器吗?

于 2013-09-06T07:12:19.867 回答