【问题标题】:Where to put logic - domain class vs. service class vs. other class?在哪里放置逻辑 - 域类与服务类与其他类?
【发布时间】: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 种方法:

  1. 在域类中添加方法isOverdue()
  2. 使用方法isOverdue(Todo todo)添加一个单独的类OverdueChecker
  3. 在我现有的 TodoService 类中添加一个方法 isOverdue(Todo todo)

以下哪些被认为是良好的编码习惯?

【问题讨论】:

  • 不要永远做任何类似 2 或 3 的事情。一个对象应该公开有意义的行为,而不是像其他类使用的哑数据包一样。跨度>
  • 1 没问题。 isOverdue(LocalDate date) 的签名可能更有用,并且更容易测试。
  • Todo 对象是否应该在本质上知道它是否过期?如果它是确定状态,为什么服务需要处理它?如果它做其他事情,比如跟踪系统时间,那么服务就有意义,但如果它只是使用今天的日期,那么对象本身可以评估它。
  • @Michael 我不是在这个问题的上下文中判断,但是“从不做 2”的方法通常以类有太多的责任、数百行代码和太难维护而告终.不要害怕从类中提取相关职责。
  • @ŁukaszNojek “不要害怕从一个类中提取相关的职责”显然......但从不将对象视为愚蠢的数据持有者有 10 个 getter 和 setter。例如,将行为提取到可组合的装饰器中。

标签: java spring


【解决方案1】:

我会推荐第一个解决方案,因为它是一个容易确定的状态(我猜你只是在比较 doDate 和 doday 的日期)并且它不需要很多逻辑,如果它这样做我会推荐使用服务。 除了在 toDo 类中有public boolean isOverdue(){...} 之类的东西更干净

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 2013-06-12
    • 2011-07-17
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多