【问题标题】:Does it make sense for a Student class to have a static method getAllStudents()?Student 类有一个静态方法 getAllStudents() 有意义吗?
【发布时间】:2021-05-07 17:02:58
【问题描述】:

我正在为一个 Java 项目练习 MVC、DAO 和其他设计模式。

假设我有一个与 Student 类模型交互的 PageController。

public class Student {
    private int id;
    private String name;
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
    //Getters and setters blabla
}

然后我显然有一个 StudentDAO 接口和 StudentDAOImpl 来执行 SQL 查询和东西。

假设 PageController 需要检索所有学生的列表(在其页面上列出它们),显然我有一个 SQL 查询来检索学生列表,使用 StudentDAOImpl 中的 Java 方法实现。

我应该在哪里实例化 studentDao(StudentDAOImpl 的实例)? 我可以简单地在 Student 中创建一个静态方法来检索所有学生吗?此静态方法将简单地实例化 studentDAO 并执行其 getAllStudents 方法来检索所有学生。

或者我可以简单地在 PageController 中实例化 studentDao 并从那里做所有的事情?

【问题讨论】:

  • 哪种方式最有效地满足您的特定需求?
  • @RobertHarvey 我真的不知道,这些选项都没有真正限制我的可能性,但我不知道将 Dao 实例放在控制器中有多正确。或者要在 Student 中创建一个执行 getAllStudents() 的静态方法,我实际上更喜欢第二种方法,因为我可以将所有 Dao 的东西放在我项目的 Model 部分中。
  • “正确”的标准是什么?
  • 如果您更喜欢第二种方法,请使用它。
  • @RobertHarvey 正确我的意思是“遵循 MVC/DAO 模式”我猜

标签: java class model-view-controller static dao


【解决方案1】:

在主要情况下,我认为您可以使用this guide

DAO 不是模型,因此您可以添加方法。我想 PageController 会有一个 StudentRepository(StudentDAO) 方法 getAll。

结构主要取决于应用程序的逻辑。

【讨论】:

    【解决方案2】:

    在Student类中添加getAllStudents(数据库访问方法),其实和一种叫做Active Record的设计模式有关 好吧,对于某些人来说,这通常是一种反模式。详细解释请看this article

    另一方面,您提到您正在使用 DAO,对于相同的用例,它是不同的 design pattern。我建议您只决定一个选项。

    如果您依赖 DAO,则与数据访问相关的所有内容都在那里。模型类必须只保留数据。但是,请注意,这会导致您访问 Anemic Domain Model,而这也有其自身的缺点。

    我首选的方法是DDD,它以更一致的方式平衡了数据相关类的职责。

    关于在哪里实例化您的 DAO,经验法则是:不要这样做。请改用Dependency Injection。 它更好,因为它利用了代码的可测试性和可维护性。

    【讨论】:

    • DDD 与这些存储模式没有任何关系,不是吗? DDD 对如何持久化数据没有任何意见。这是一个实现细节。
    • @RobertHarvey 确实,这是关于如何实现存储库的详细信息。然而,问题在于如何组织检索数据的方法,而且由于这是一项研究,因此至少值得一提更广泛的方法。
    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多