Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单一责任原则-我的班级_Java_Solid Principles - Fatal编程技术网

Java 单一责任原则-我的班级

Java 单一责任原则-我的班级,java,solid-principles,Java,Solid Principles,这个班违反单一责任原则吗? 它有更多的职责,但它们都与数据库通信, 还是应该为每个方法创建一个类 public class DBLoader { Connection connection; ArrayList<Book> list; public DBLoader(String url, String userName, String password) { connection = DriverManager.getConnection(url, userN

这个班违反单一责任原则吗? 它有更多的职责,但它们都与数据库通信, 还是应该为每个方法创建一个类

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 = ?");
}

在本课程中,您有两个想法:创建到数据库的连接,以及将书籍持久化到数据库

您可以考虑拆分这些,并给图书类提供一种检索活动DB连接的方法。


一般来说,如果需要使用and之类的连词来描述类的职责,那么很明显它可能不止一个类。

您的类的目的是加载数据库,正如DBLoader的名称所建议的那样。因此,它应该负责加载数据库并跟踪连接,可能是运行收到的查询。在这个层面上,我们不应该谈论书籍之类的概念。我们应该讨论连接、命令、查询、响应和错误。这是您的连接层。更高的一层应该是数据访问层,您可以在其中定义类,例如Book,它可以作为数据库表的模型。更高的一层应该是业务层,您可以在其中定义类,这些类将对您的模型执行更复杂的操作。因此,是的,您应该将book的概念与database loader的概念分离成不同的类。

根据发布的代码,如果您需要在同一事务中访问或保存不同的实体,您会怎么做?如果不同的用户想用同一个实体做些什么呢?一个必须等待另一个完成连接,这将是很糟糕的。这是一个责任被纠缠的例子,当你试图扩展一个设计来做一些意想不到的事情,或者你必须写很多额外的代码来修补这些东西,或者你会得到不利的后果

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

1获取数据库连接

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

3保存一个图书清单,很难说为什么,可能是为了缓存

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

在一个典型的JavaEE应用程序中,这些都是在不同的地方处理的,并且由于不同的原因而有所不同,不应该将它们归为同一个类

通常有一个称为数据访问对象DAO的JavaEE模式,其中实现了2个功能。DAO不应该知道连接是如何获得的,它应该能够在不同的事务中重用,因此它不应该在其中编码事务性。DAO通常是无状态的,对用户特定的状态一无所知

连接检索是通过连接池和一些servlet过滤器或拦截器来处理的,这些过滤器或拦截器隐藏连接或可能的连接堆栈,以便在threadlocal中存在嵌套事务的情况下,任何需要它的代码都可以使用它,而不管它用于哪个实体。连接和事务应该能够被许多实体使用,将连接专用于每种类型的实体是没有意义的

事务通常由包含多个DAO的服务层或无状态会话bean处理。对服务方法进行注释,以声明事务边界的位置,框架使用该边界创建封装服务的代理,代理在threadlocal中查找连接,并在传入或传出时启动或提交事务。这样,不同的职责就彼此分离了


<>我建议多了解java框架是如何处理这种事情的,并查找java EE设计模式。

我会把所有书籍都分成自己的类。我认为这可能更适合于@ BeleSfDET,这似乎是示例代码,而不是我认为适合代码审查的东西。