gpt4 book ai didi

java - 有没有一种方法可以遵守单一职责原则,而无需在此代码中调用多个数据库调用?

转载 作者:行者123 更新时间:2023-12-02 06:45:47 25 4
gpt4 key购买 nike

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

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

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

第一个函数将分数从 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();
}
}

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

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

是否有一种更简洁的方法来设计代码,同时遵守 SRP?

最佳答案

通常SRP是引用类或模块来讨论的,但我认为你考虑函数的含义是正确的,一个“ragbag”函数,其工作是“x和y和z”可能不是一个好的设计.

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

我倾向于从商业意义的角度考虑功能,例如:

snapshotTest()

endTest()

并具有一个实用函数,可以更新两者使用的学生分数。

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

关于java - 有没有一种方法可以遵守单一职责原则,而无需在此代码中调用多个数据库调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18651747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com