美文网首页
重构读书笔记-8_6-Duplicate_Observed_Da

重构读书笔记-8_6-Duplicate_Observed_Da

作者: MR_Model | 来源:发表于2019-06-27 09:39 被阅读0次

重构第八章

6.Duplicate Observed Data(复制[被监视数据])
你有一些domain data(业务数据)置身于GUI控件中,而domain method(业务处理的方法)需要访问之。将该笔数据拷贝到一个domain object(业务对象)中。建立一个Observer模式,用以对domain object和GUI object内的复制数据进行同步控制。

Example:

public class IntervalWindow extends Frame...
    java.awt.TextField  _startField;
    java.awt.TextField  _endField;
    java.awt.TextField  _lengthField;
    
    class SysFocus extends java.awt.event.FocusAdapter {
        public void focusLost(java.awt.event.FocusEvent event) {
            Object object = event.getSource();
            if (object == _startField)
                StartField_FocusLost(event);
            else if (object == _endField)
                EndField_FocusLost(event);
            else if (object == _lengthField)
                LengthField_FocusLost(event);
        }
    }
    void StartField_FocusLost(java.awt.event.FocusEvent event) {
        if (isNotInteger(_startField.getText()))
            _startField.setText("0");
        calculateLength();
    }
    void EndField_FocusLost(java.awt.event.FocusEvent event) {
        if (isNotInteger(_endField.getText()))
            _endField.setText("0");
        calculateLength();
    }
    void LengthField_FocusLost(java.awt.event.FocusEvent event) {
        if(isNotInteger(_lengthField.getText()))
            _lengthField.setText("0");
        calculateEnd();
    }
    void calculateLength() {
        try {
            int start = Integer.parseInt(_startField.getText());
            int end = Integer.parseInt(_endField.getText());
            int length = end - start;
            _lengthField.setText(String.valueOf(length));
        } catch (NumberFormatException e) {
            throw new RuntimeException ("Unexpected Number Format Error!");
        }
    }
    void calculateEnd() {
        try {
            int start = Integer.parseInt(_startField.getText());
            int length = Integer.parseInt(_lengthield.getText());
            int end = length + start;
            _endField.setText(String.valueOf(end));
        } catch (NumberFormatException e) {
            throw new RuntimeException ("Unexpected Number Format Error!");
        }
    }

Analyse:
实例中,SysFocus()方法在鼠标焦点离开相应的文本框的时候,即相应的文本框失去焦点的时候开始工作,并传给对应的处理函数。
在对应的处理函数中,首先判断文本框的值是否为整数,不是的话,赋值为0,之后再进行相关的逻辑计算,计算end或者length的值。
此时,将处理业务逻辑的calculateLength()和calculateEnd()函数和界面处理函数分离开来。使用的方法是,讲这些数据复制到domain class中,并确保GUI class数据同步。这就是Duplicate Observed Data的任务。

End:

class Interval extends Observable {     //建立domain class
    private string _end = "0";
    String getEnd() {
        return _end;
    }
    void setEnd(String arg) {
        _end = arg;
        SetChanged();
        notifyObservers();          //通知Observer数据已经被改变
    }
    void calculateLength() {
        try {
            length = end - start;
            SetLength(String.valueOf(length));
        } catch (NumberFormatException e) {
            throw new RuntimeException ("Unexpected Number Format Error!");
        }
    }
    void calculateEnd() {
        try {
            end = length + start;
            setEnd(String.valueOf(end));
        } catch (NumberFormatException e) {
            throw new RuntimeException ("Unexpected Number Format Error!");
        }
    }
}

public class IntervalWindow extends Frame implements Observer
    private Interval _subject;  //建立联系
    IntervalWindow() {          
        _subject = new  Interval();
        _subject.addObserver(this);
        update(_subject,null);
    }
    //为end编辑框设置设值/取值函数即使用 Self Encapsulate Field(自封装值域)的方法
    string getEnd() {
        return _subject.getText();
    }
    void setEnd(String arg) {
        _subject.setText(arg);
    }
    public void update (Observable observed, Object arg) {
        _endField.setText(_subject.getEnd());
    }

Conclusion:

使用Duplicate Observed Data(复制[被监视数据])方法可以是业务和GUI部分分离开来,之后独立对业务部分进行修改,或者对GUI部分修改,都会提供很大的便利。

注意

重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!

相关文章

  • 重构读书笔记-8_6-Duplicate_Observed_Da

    重构第八章 6.Duplicate Observed Data(复制[被监视数据])你有一些domain data...

  • 重构:读书笔记

    重构读书笔记 第一章 重构,第一个案例 第二章 重构原则 2.1 何为重构 重构(名词):对软件内部结构的一种调整...

  • 重构读书笔记

    title: 重构读书笔记date: 2019/11/05 重构:对软件内部结构的一种调整,目的是在不改变软件可观...

  • 《重构》读书笔记

    《重构》读书笔记 总览 第一部分 第一章从实例程序出发,展示设计的缺陷,对其重构可以了解重构的过程和方法。 第二部...

  • 《危机与重构:唐帝国及其地方诸侯》读书笔记

    《危机与重构:唐帝国及其地方诸侯》读书笔记 李碧妍先生的《危机与重构:唐帝国及其地方诸侯》一书。是以唐代后期的藩镇...

  • 《重构--改善既有代码的设计》读书笔记

    《重构--改善既有代码的设计》读书笔记 1为什么重构有用 所有有意义的事情总结下来,都是完成了一个有用的功能,或者...

  • 个人技术文章系列汇总(csdn)

    Java基础 Effective Java读书笔记 java 几种加载驱动的方法 《重构改善既有代码的设计》代码的...

  • 《重构》读书笔记

    chapter 1 重构,第一个案例 1.1 什么时候需要重构 需要为程序添加一个特性,但代码结构无法使自己方便的...

  • 重构-读书笔记

    有一本书叫做《重构 改善既有代码的设计 》,个人感觉写的还蛮不错的,在读这本书时候做的一些读书笔记,分享给大家: ...

  • 重构-读书笔记

    重构 概念:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。重构技术就是以微小的步伐修改程序。...

网友评论

      本文标题:重构读书笔记-8_6-Duplicate_Observed_Da

      本文链接:https://www.haomeiwen.com/subject/obclcctx.html