tApplicationContext(), this);
String filename = ...;
mFileManager = new FileManager(filename);
mFileManager.open();
}
}
基础模块初始化的外部关系,下面称为“初始化外部关系”;
由例子E可见:
结论4:显示模块的onCreate()中调用其他基础模块初始化的逻辑,可以单纯化重构;并且重构之后,所得到的一个初始化外部关系就是中间类的构造方法;
根据结论3与结论4,可得到:
结论5:单纯化重构的一般性方法:
各个基础模块的初始化的逻辑,必须重构为初始化外部关系,在重构之后,这个初始化外部关系处于中间类中,并且初始化外部关系不是private方法;
在任何一个基础模块的事件方法中调用其他基础模块的逻辑,必须重构为事件外部关系,在重构之后,这个事件外部关系处于中间类中,并且这个事件外部关系不是private方法;
因此程序单纯化重构之后,中间类包含一个初始化外部关系,并且包含所有事件外部关系,它们都不是private方法;
8.对方法进行拆解封装重构
例子F:
void functionX() {
mXxxModule.methodA();
functionB();
functionF();
}
private void functionB() {
mYyyModule.methodC();
functionD();
}
private void functionD() {
mZzzModule.methodE();
}
private void functionF() {
sentenceG();
sentenceH();
}
对方法进行拆解封装重构之后:
void functionX() {
mXxxModule.methodA();
mYyyModule.methodC();
mZzzModule.methodE();
sentenceG();
sentenceH();
}
重构之前,functionX()方法调用语句mZzzModule.methodE()形成的栈是:
functionX() > functionB() > functionD() > mZzzModule.methodE();
重构之后,形成的栈是:
functionX() > mZzzModule.methodE();
由例子F,可得到:
结论6:在某个类classA中,对方法methodM内调用的classA中的方法的语句,进行拆解封装重构后,可以使得methodM内没有调用classA中的其他方法的语句;
9.对类的拆解封装重构
定义:对某个类的拆解封装重构,是要将类中的除了构造方法外的所有private方法,进行拆解封装到调用它们的方法中,最后类中只剩下public、protected以及没有修饰符的方法;
如果对程序进行单纯化重构,得到中间类,再对中间类进行拆解封装重构;
根据结论5,程序单纯化重构之后,中间类包含一个初始化外部关系,并且包含所有事件外部关系,它们都不是private方法,因此再对中间类进行拆解封装重构之后,初始化外部关系、所有事件外部关系都不会消失;
10.事件是程序执行的动机
根据哲理2,事件是程序执行的动机,那么有如下结论:
结论7:假设初始化方法是init(),事件方法是onEvent();对于程序中的任意一个方法functionEee(),程序执行时的方法调用栈为
init() > functionAaa() > functionBbb() ... > functionEee() ... > functionXxx()
或者
onEvent() > functionAaa() > functionBbb() ... > functionEee() ... > functionXxx()
,即init()或者onEvent()处于栈底,而functionEee()处于栈中;
11.中间类的性质,与外部关系模块
下面证明,关于中间类性质的,以及关于“外部关系模块”的概念的结论8;
结论8:程序的单纯化重构可以通过创建中间类来实现;并且单纯化重构、再对中间类进行拆解封装重构之后,中间类包含且仅包含基础模块的一个初始化外部关系以及基础模块的所有事件外部关系;(3点含义,因此上述的中间类从此称之为“外部关系模块”);
证明:由结论5可知,单纯化重构之后,中间类包含一个初始化外部关系,并且包含所有事件外部关系;
假设,程序单纯化重构、再对中间类进行拆解封装重构之后,中间类中存在一个不是初始化外部关系或事件外部关系的方法A;下面证明这样的方法A不存在;(因此中间类仅包含一个初始化外部关系以及事件外部关系)
根据结论7可得,方法A的调用栈的栈底必然为onEvent()或者init(),当栈底为init()时,init()处于中间类中,因此方法A在拆解封装重构之后就消失了,即这样的方法A不存在;
当栈底为onEvent()、并且这个onEvent()是事件外部关系的事件方法时,由于事件外部关系处于中间类中,因此方法A在拆解封装重构之后就消失了,即这样的方法A不存在;
当栈底为onEvent()、并且这个onEvent()不是事件外部关系的事件方法时,根据结论5(单纯化重构的一般性方法)可知,单纯化重构不会将它重构到中间类,所以这样的方法A不存在;
[证明完毕]
12.Java桌面应用程序的一般形式
任何Java桌面应用程序,都可以进行单纯化重构、并且拆解封装重构,得到例子G的这种形式的中间类;
例子G:
public class XxxExternalRelations {
ViewManager mViewManager;
FileManager mFileManager;
GpsManager mGpsManager;
GeocoderManager mGeocoderManager;
public XxxExternalRelations(Object param) {
XxxExternalRelations page = this;
// 在ViewManager的构造方法内调用vMember.setVvvListener(page.getVvvListener());
mViewManager = new ViewManager(page);
// 在FileManager的构造方法内调用fMember.setFffListener(page.getFffListener());
mFileManager = new FileManager(page);
// 在GpsManager 的构造方法内调用gMember.setGggListener(page.getGggListener());
mGpsManager = new GpsManager(page);
mGeocoderManager = new GeocoderManager();
...// 调用mViewManager, mFileManager, mGpsManager, mGeocoderManager进行初始化
}
public VvvListener getVvvListener() {
retrun (vparam) ->