单一责任原则 - 我的班级

时间:2015-03-28 22:52:00

标签: java solid-principles

此课程是否违反单一责任原则? 它有更多的责任,但所有这些都与数据库沟通, 或者我应该为每种方法创建一个类?

public class DBLoader {

Connection connection;
ArrayList<Book> list;

public DBLoader(String url, String userName, String password) {

        connection = DriverManager.getConnection(url, userName, password);
        list = new ArrayList();

}

public ArrayList getBooks() {
//select * from books
}

public boolean registerBook(String isbn, String title) {

    PreparedStatement preparedStatement = connection
    .prepareStatement("insert into book(isbn, title) values (?, ?)");
}

public boolean updateBook(String title, String isbn) {

    PreparedStatement ps;
    try {
        ps = connection
                .prepareStatement("UPDATE book SET title = ? WHERE isbn = ?");
}

3 个答案:

答案 0 :(得分:3)

本课程中有两个想法:“创建与数据库的连接”,“将书籍持久存储到数据库中。”

您可以考虑拆分它们,并为book类提供一种检索活动数据库连接的方法。

一般来说,如果你需要使用像“和”这样的连词来描述一个类的责任,那就是它可能不止一个类的气味。

答案 1 :(得分:0)

您的课程的目的是加载数据库,如DBLoader的名称所示。所以它应该负责加载数据库并跟踪连接,也许是运行收到的查询。在这个层面上,我们不应该谈论书籍和东西等概念。我们应该讨论连接,命令,查询,响应和错误。这是您的连接层。更高层应该是数据访问层,您可以在其中定义类,例如Book,它将用作数据库表的模型。更高层应该是业务层,您可以在其中定义可以对模型执行更复杂操作的类。所以,是的,您应该将书的概念与数据库加载器的概念分离为单独的类。

答案 2 :(得分:0)

使用已发布的代码,如果您需要在同一事务中访问或保存不同的实体,您会怎么做?如果单独的用户想要对同一个实体做某事怎么办?人们将不得不等待另一个完成连接,这将是糟糕的。这是一个纠结责任的例子,当你试图扩展设计以做一些意料之外的事情,要么你必须编写大量额外的代码来修补事情或者你会得到不良后果。

这里至少有3-4种不同的职责:

1)获取数据库连接

2)更新书籍并将其插入数据库

3)保存一份书籍清单,很难说明原因,也许是缓存

4)事务控制(如果代码可以使用的连接仅限于此实例,则限制了此代码管理事务的能力)

这些都是典型的Java EE应用程序在不同的地方处理并且由于不同的原因而变化的所有内容,它们不应该被集中到同一个类中。

通常,Java EE模式称为数据访问对象(DAO),其中实现了#2功能。 DAO不应该知道如何获取连接,并且它应该能够在不同的事务中重用,因此它不应该将事务编码到其中。 DAO通常是无状态的,并且对用户特定的状态一无所知。

使用连接池和一些servlet过滤器或拦截器来处理连接检索,这些过滤器或拦截器在线程局中存储连接(或者可能是存在嵌套事务的情况下的堆栈连接),以便它可用于任何需要它的代码,无论它是什么实体。连接和事务应该能够被许多实体使用,将连接专用于每种类型的实体是没有意义的。

事务通常使用包含多个DAO的服务层或无状态会话bean来处理。注释服务方法以声明事务边界的位置,框架使用它来创建包装服务的代理,这些代理在threadlocal中找到连接并在进出的路上启动或提交事务。这样,不同的职责就会彼此分开。

我建议更多地了解成熟的Java框架如何处理这类事情,并查找Java EE设计模式。