质量属性(可修改性)

质量属性其一:可修改性

可修改性战术的目标是控制实现、测试和部署变更的时间和成本。

就我的理解其实就是在编写软件代码的时候需要为以后的维护,修改着想,其实就是在以后的检测以及修改的时候尽可能的节省时间以及成本。

在之前作业中,对于信息领域热词分析其实我就没有考虑到可修改性这一环节,在用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("电视机关闭!");    
    }
}

在此基础上,我想添加其他电器,只需要添加一个类,并且在总接口写入方法就行了。不需要重新修改跟多代码。

 

防止联锁反应其实就是低耦合,各个模块之间的关联尽量的小,这也是为什么在实际编程中一般不使用继承的原因,大多都是使用组合关联等关系,就是减少模块之间联系,当修改一个模块的时候不会涉及到其他模块。

限制选择参数,在我的这个项目中就没有设置这些参数的控制,比如在搜索框中输入字符很长的时候可能就会报错了,还有可能换个系统就不能运行了。其实这都是需要不便于修改的。控制项目的选择会减少很多麻烦。

 

总结:在修改性中,我认为最基本的核心就是设计模式,高内聚低耦合的设计思想。不论在战术中提到的:局部化变更,防止联锁反应,推迟绑定时间其实就是上述如此,语义一致,低耦合。这样的软件才是便于修改的软件

 

posted @ 2020-03-02 22:35  birdmmxx  阅读(454)  评论(0编辑  收藏  举报