质量属性(可修改性)
质量属性其一:可修改性
可修改性战术的目标是控制实现、测试和部署变更的时间和成本。
就我的理解其实就是在编写软件代码的时候需要为以后的维护,修改着想,其实就是在以后的检测以及修改的时候尽可能的节省时间以及成本。
在之前作业中,对于信息领域热词分析其实我就没有考虑到可修改性这一环节,在用mapreduce进行数据解析的时候就定死了数据的输出格式以及输出位置,其实这只要在写两个类两个方法都可以让代码各司其职。
然后在mysql进行可视化展示的时候也是如此,现在想想,如果想要加几个变量的话所有的代码都得修改,如果项目很大这样既浪费时间有浪费成本。结合可修改性战术,其实就是充分采用设计模式的理念,类的设计用抽象工厂,这样就可以做到类的添加了。
其实巧妙运用设计模式就可以很好解决问题,高内聚低耦合,多使用依赖关系,这个依赖在代码里面是有很好的体现的,但是在模块的划分上无法运用设计模式进行划分。
这样分布,DBUtil连接工具,LoginForm是登陆表展示以及方法,MainClass是Main函数,UserDao是需要的变量。
每一个类各司其职,在Login中有各个方法。这样的代码对于修改更加便利清晰。
display()只是展示页面,设置界面的大小
public void display() { JFrame frame = new JFrame("登陆页面"); frame.setSize(350, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); // 添加面板 frame.add(panel); /* * 调用用户定义的方法并添加组件到面板 */ inti(panel); // 设置界面可见 frame.setVisible(true); }
inti()是控件加载
public void inti(JPanel panel) { /* 布局部分我们这边不多做介绍 * 这边设置布局为 null */ panel.setLayout(null); // 创建 JLabel JLabel userLabel = new JLabel("Username:"); /* 这个方法定义了组件的位置。 * setBounds(x, y, width, height) * x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。 */ userLabel.setBounds(10,20,80,25); panel.add(userLabel); /* * 创建文本域用于用户输入 */ JTextField userText = new JTextField(20); userText.setBounds(100,20,165,25); panel.add(userText); // 输入密码的文本域 JLabel passwordLabel = new JLabel("Password:"); passwordLabel.setBounds(10,50,80,25); panel.add(passwordLabel); /* *这个类似用于输入的文本域 * 但是输入的信息会以点号代替,用于包含密码的安全性 */ JPasswordField passwordText = new JPasswordField(20); passwordText.setBounds(100,50,165,25); panel.add(passwordText); // 创建登录按钮 JButton loginButton = new JButton("登陆"); loginButton.setBounds(10, 80, 80, 25); panel.add(loginButton); //设置监听事件 loginButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取文本框数据 String usernametext=userText.getText(); @SuppressWarnings("deprecation") String passwordtext=passwordText.getText(); // TODO Auto-generated method stub validate(usernametext,passwordtext); } }); }
validate()登陆显示
public void validate(String usernametext,String passwordtext) { // TODO Auto-generated method stub /*user.username(usernametext); user.password(passwordtext); System.out.print(usernametext);*/ if(user.username(usernametext)&&user.password(passwordtext)) { JOptionPane.showMessageDialog(null, "登陆成功!"); } else { JOptionPane.showMessageDialog(null, "登陆失败!"); } }
利用上述的分布,工具类和操作数据库的类分隔开。这样我需要什么函数我就可以直接import这个类,然后调用其中的函数。这样也更加具有逻辑性,更加便于修改。而且没有继承,及时其中类发生改变,我不用修改全部的类。运用这样的依赖组合关系实现代码低耦合。
其实我在写代码时喜欢为不同的功能创建不同dao层,但是访问的越多就越复杂,还很容易弄错,这只要采用装饰器模式,定义一个统一的接口,用来访问每一个具体类。这样我就只用调用一个接口里的一个方法即可。并且我修改代码时,只需要添加一个具体类,在统一接口添加一个方法即可。这样我访问也不会弄错。
外观模式例子:
总接口
public class GeneralSwitchFacade { private Light lights[]=new Light[4]; private Fan fan; private AirConditioner ac; private Television tv; public GeneralSwitchFacade() { lights[0]=new Light("左前"); lights[1]=new Light("右前"); lights[2]=new Light("左后"); lights[3]=new Light("右后"); fan=new Fan(); ac=new AirConditioner(); tv=new Television(); } public void on() { lights[0].on(); lights[1].on(); lights[2].on(); lights[3].on(); fan.on(); ac.on(); tv.on(); } public void off() { lights[0].off(); lights[1].off(); lights[2].off(); lights[3].off(); fan.off(); ac.off(); tv.off(); } }
各个实例:
public class Fan { public void on() { System.out.println("风扇打开!"); } public void off() { System.out.println("风扇关闭!"); } }
public class Light { private String position; public Light(String position) { this.position=position; } public void on() { System.out.println(this.position + "灯打开!"); } public void off() { System.out.println(this.position + "灯关闭!"); } }
public class Television { public void on() { System.out.println("电视机打开!"); } public void off() { System.out.println("电视机关闭!"); } }
在此基础上,我想添加其他电器,只需要添加一个类,并且在总接口写入方法就行了。不需要重新修改跟多代码。
防止联锁反应其实就是低耦合,各个模块之间的关联尽量的小,这也是为什么在实际编程中一般不使用继承的原因,大多都是使用组合关联等关系,就是减少模块之间联系,当修改一个模块的时候不会涉及到其他模块。
限制选择参数,在我的这个项目中就没有设置这些参数的控制,比如在搜索框中输入字符很长的时候可能就会报错了,还有可能换个系统就不能运行了。其实这都是需要不便于修改的。控制项目的选择会减少很多麻烦。
总结:在修改性中,我认为最基本的核心就是设计模式,高内聚低耦合的设计思想。不论在战术中提到的:局部化变更,防止联锁反应,推迟绑定时间其实就是上述如此,语义一致,低耦合。这样的软件才是便于修改的软件