质量属性战术-可修改性战术代码层面实现(以“信息领域热词分析系统为例”)
- 对可修改性的理解
可修改性战术可以理解为:指系统或软件的能够快速地以较高的性价比对系统举行调换的能力,就好比热词分析系统为例,如果我想把项目从本地部署到服务器上,由于Mysql数据库的相关配置不一样,所以就需要对数据库的操作相关代码进行修改,修改时间长短、变更的代码量多少就体现了项目是否具备可修改性
其目标是控制实现、测试和部署的变更的时间和成本;
- 可修改性的相关战术
根据其目标可以将战术进行分为三组:
- 减少由某个变更直接影响的模块数量-----局部化修改;
- 限制对局部化的模块的修改------防止连锁反应;
- 控制部署时间并允许非开发人员进行修改------延迟绑定时间。
在信息领域热词分析系统的开发中,在对数据库的读取操作中,我使用了数据库的连接池技术,使用这一技术,可以很简单的对数据进行读取,数据项的变更,甚至更换数据库;
1、写好数据库的连接配置文件c3p0-config.xml(局部化修改战术)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <c3p0-config> 3 <default-config> 4 <property name="user">root</property> 5 <property name="password"></property> 6 <property name="driverClass">com.mysql.jdbc.Driver</property> 7 <property name="jdbcUrl">jdbc:mysql://localhost:3306/reci?useUnicode=true&characterEncoding=utf-8</property> 8 </default-config> 9 </c3p0-config>
在更改数据库时,只需要修改连接数据库名,密码等就可以,这使用了可修改性战术的第一个战术-----局部化修改战术。
2、读取数据,在建立好javaBean文件后(以“热词类”举例,防止连锁反应战术)
1 package reci.bean; 2 3 public class wordBean { 4 private int id; 5 private String words; 6 private String content; 7 private int counts; 8 public wordBean() { 9 super(); 10 // TODO Auto-generated constructor stub 11 } 12 13 public wordBean(int id, String words, String content, int counts) { 14 super(); 15 this.id = id; 16 this.words = words; 17 this.content = content; 18 this.counts = counts; 19 } 20 21 public int getCounts() { 22 return counts; 23 } 24 25 public void setCounts(int counts) { 26 this.counts = counts; 27 } 28 29 public int getId() { 30 return id; 31 } 32 public void setId(int id) { 33 this.id = id; 34 } 35 public String getWords() { 36 return words; 37 } 38 public void setWords(String words) { 39 this.words = words; 40 } 41 public String getContent() { 42 return content; 43 } 44 public void setContent(String content) { 45 this.content = content; 46 } 47 48 49 }
在读取数据时,就比较简单(可以看代码)
1 package reci.dao; 2 import java.sql.SQLException; 3 import java.util.List; 4 5 import javax.sql.DataSource; 6 7 import org.apache.commons.dbutils.QueryRunner; 8 import org.apache.commons.dbutils.handlers.BeanHandler; 9 import org.apache.commons.dbutils.handlers.BeanListHandler; 10 11 import reci.bean.wordBean; 12 import reci.utils.DataSourceUtils; 13 public class wordDao { 14 DataSource ds = DataSourceUtils.getDataSoucre(); 15 16 public List<wordBean> listWord() throws SQLException { 17 QueryRunner runner = new QueryRunner(ds); 18 String sql = "select * from word"; 19 return runner.query(sql, new BeanListHandler<wordBean>(wordBean.class)); 20 } 21 public wordBean getBaseInfo(String name) throws SQLException { 22 QueryRunner runner = new QueryRunner(ds); 23 String sql = "select * from word where words = ?"; 24 return runner.query(sql, new BeanHandler<wordBean>(wordBean.class),name); 25 } 26 27 }
如果数据项变更后,只需要修改Bean文件,而不需要修改其他的文件,大大减少了修改模块的数量,以及更改后的部署时间,这使用了可修改性战术的第二个战术---防止连锁反应战术中信息隐藏方法。
以上这两种战术都是基于“高内聚,低耦合”思想
3、推迟绑定时间,控制部署时间以及允许非开发人员进行修改,此项目中表现较为突出的还是数据库连接池的使用;
将数据库可能发生的修改放在c3p0-config.xml配置文件中,可以减少部署时间,甚至没有变成基础的人员也可以实现对数据库配置的修改。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <c3p0-config> 3 <default-config> 4 <property name="user">root</property> 5 <property name="password"></property> 6 <property name="driverClass">com.mysql.jdbc.Driver</property> 7 <property name="jdbcUrl">jdbc:mysql://localhost:3306/reci?useUnicode=true&characterEncoding=utf-8</property> 8 </default-config> 9 </c3p0-config>
以上是本人对可修改性战术的理解,望大佬指教