【发布时间】:2019-07-10 16:42:13
【问题描述】:
我正在使用 Spring 框架在 Java 中开发一个简单的待办事项应用程序。现在,我添加了一项功能,用于显示任务是否过期。我不确定在哪里放置检查是否存在的逻辑。
这是我的 To-do 域类:
public class Todo {
private Long id;
private String body;
private LocalDate doDate;
// Constructors, getters and setters
}
这是我的 TodoService 类:
@Service
public class TodoService {
@Autowired
private TodoRepository todoRepository;
public void save(Todo todo) { // ... }
public void deleteById(Long id) { // ... }
public Iterable<Todo> findAll() { // ... }
public Optional<Todo> findById(Long id) { // ... }
}
我正在考虑 3 种方法:
- 在域类中添加方法isOverdue()
- 使用方法isOverdue(Todo todo)添加一个单独的类OverdueChecker
- 在我现有的 TodoService 类中添加一个方法 isOverdue(Todo todo)
以下哪些被认为是良好的编码习惯?
【问题讨论】:
-
不要永远做任何类似 2 或 3 的事情。一个对象应该公开有意义的行为,而不是像其他类使用的哑数据包一样。跨度>
-
1 没问题。
isOverdue(LocalDate date)的签名可能更有用,并且更容易测试。 -
Todo 对象是否应该在本质上知道它是否过期?如果它是确定状态,为什么服务需要处理它?如果它做其他事情,比如跟踪系统时间,那么服务就有意义,但如果它只是使用今天的日期,那么对象本身可以评估它。
-
@Michael 我不是在这个问题的上下文中判断,但是“从不做 2”的方法通常以类有太多的责任、数百行代码和太难维护而告终.不要害怕从类中提取相关职责。
-
@ŁukaszNojek “不要害怕从一个类中提取相关的职责”显然......但从不将对象视为愚蠢的数据持有者有 10 个 getter 和 setter。例如,将行为提取到可组合的装饰器中。