上下文重用

我几乎不需要讨论为什么重用代码是有利的。代码重用通常使得程序开发更加快速,并使得 BUG 减少。一旦一段代码被封装和重用,那么只需要检查很少的一段代码即可确保程序的正确性。如果在整个应用程序中只需要在一个地方打开和关闭数据库连接,那么确保连接是否正常则容易的多。但我确信这些你已经都知道了。

有两种类型的重用代码,我称它们为重用类型:

功能重用(Action Reuse)

上下文重用(Context Reuse)

第一种类型是功能重用,这是最常见的一种重用类型。这也是大多数开发人员掌握的一种。即重用一组后续指令来执行某种操作。

第二种类型是上下文重用,即不同功能或操作代码在相同上下文之间,将相同上下文封装为重用代码(这里的上下文指的是一系列相同的操作指令)。虽然它在控制反转中越来越受欢迎但它并不常见。而且,上下文重用并没有被明确的描述,因此它并没有像功能重用一样被系统的使用。我希望你看完这篇文章之后会有所改变。

功能重用

功能重用是最常见的重用类型。它是一组执行某种操作指令的重用。下面两个方法都是从数据库中读取数据:

public List readAllUsers(){ Connection connection = null; String sql = "select * from users"; List users = new ArrayList(); try{ connection = openConnection(); PreparedStatement statement = connection.prepareStatement(sql); ResultSet result = statement.executeQuery(); while(result.next()){ // 重用代码 User user = new User(); user.setName (result.getString("name")); user.setEmail(result.getString("email")); users.add(user); // END 重用代码 } result.close(); statement.close(); return users; } catch(SQLException e){ //ignore for now } finally { //ignore for now } } public List readUsersOfStatus(String status){ Connection connection = null; String sql = "select * from users where status = ?"; List users = new ArrayList(); try{ connection = openConnection(); PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, status); ResultSet result = statement.executeQuery(); while(result.next()){ // 重用代码 User user = new User(); user.setName (result.getString("name")); user.setEmail(result.getString("email")); users.add(user); // END 重用代码 } result.close(); statement.close(); return users; } catch(SQLException e){ //ignore for now } finally { //ignore for now } }

对于有经验的开发人员来说,可能很快就能发现可以重用的代码。上面代码中注释“重用代码”的地方是相同的,因此可以封装重用。这些是将用户记录读入用户实例的操作。可以将这些行代码封装到他们自己的方法中,例如:

// 将相同操作封装到 readUser 方法中 private User readUser(ResultSet result) throws SQLException { User user = new User(); user.setName (result.getString("name")); user.setEmail(result.getString("email")); users.add(user); return user; }

现在,在上述两种方法中调用readUser()方法(下面示例只显示第一个方法):

public List readAllUsers(){ Connection connection = null; String sql = "select * from users"; List users = new ArrayList(); try{ connection = openConnection(); PreparedStatement statement = connection.prepareStatement(sql); ResultSet result = statement.executeQuery(); while(result.next()){ users.add(readUser(result)) } result.close(); statement.close(); return users; } catch(SQLException e){ //ignore for now } finally { //ignore for now } }

readUser()方法也可以在它自己的类中使用修饰符private隐藏。

以上就是关于功能重用的内容。功能重用是将一组执行特定操作的指令通过方法或类封装它们来达到重用的目的。

参数化操作

有时,你希望重用一组操作,但是这些操作在使用的任何地方都不完全相同。例如readAllUsers()和readUsersOfStatus()方法都是打开一个连接,准备一条语句,执行它,并循环访问结果集。唯一的区别是readUsersOfStatus()需要在PreparedStatement上设置一个参数。我们可以将所有操作封装到一个readUserList()方法。如下所示:

private List readUserList(String sql, String[] parameters){ Connection connection = null; List users = new ArrayList(); try{ connection = openConnection(); PreparedStatement statement = connection.prepareStatement(sql); for (int i=0; i < parameters.length; i++){ statement.setString(i, parameters[i]); } ResultSet result = statement.executeQuery(); while(result.next()){ users.add(readUser(result)) } result.close(); statement.close(); return users; } catch(SQLException e){ //ignore for now } finally { //ignore for now } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/05f7ef8a3be87694e4ee839bb6e9e194.html