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,这似乎是示例代码,而不是我认为适合代码审查的东西。