odule.methodC(b);
}
});
}
});
例子C的XxxModule单纯化,第一步:
private OnPppListener getAaaOnPppListener(Type5 finalObj5) {
return new OnPppListener() {
@Override ublic void onPpp(QType1 q1, QType2 q2, QType3 q3) {
TypeR1 r1 = xxxMethodE(q1, q2);
mRrrModule.methodW(r1);
TypeR2 r2 = xxxMethodF(q2, q3, finalObj5);
mSssModule.methodA(r1, r2, new OnDddListener() {
@Override public onDdd(TypeB b) {
mRrrModule.methodC(b);
}
});
}
};
}
public TypeR1 xxxMethodE(QType1 q1, QType2 q2) {
mObj1.doThingU(q1);
TypeR1 r1 = Calc.doThingV(q1, q2);
return r1;
}
public TypeR2 xxxMethodF(QType2 q2, QType3 q3, Type5 finalObj5) {
mObj2.methodY(q3);
TypeR2 r2 = Calc.doThingZ(q2, q3, finalObj5);
return r2;
}
mObj3.setOnPppListener(getAaaOnPppListener(finalObj5));
例子C的XxxModule单纯化,第二步:
public class MiddleClass {
XxxModule mXxxModule;
RrrModule mRrrModule;
SssModule mSssModule;
public MiddleClass(XxxModule xxxModule) {
mXxxModule = xxxModule;
...
}
public OnPppListener getAaaOnPppListener(Type5 finalObj5) {
return new OnPppListener() {
@Override public void onPpp(QType1 q1, QType2 q2, QType3 q3) {
TypeR1 r1 = mXxxModule.xxxMethodE(q1, q2);
mRrrModule.methodW(r1);
TypeR2 r2 = mXxxModule.xxxMethodF(q2, q3, finalObj5);
mSssModule.methodA(r1, r2, new OnDddListener() {
@Override public onDdd(TypeB b) {
mRrrModule.methodC(b);
}
});
}
};
}
}
class XxxModule {
Type1 mObj1;
Type2 mObj2;
Type3 mObj3;
MiddleClass mMiddleClass;
...
void functionO() {
mObj1.methodT();
Type4 obj4 = new Type4();
final Type5 finalObj5 = new Type5();
mObj3.setOnPppListener(mMiddleClass.getAaaOnPppListener(finalObj5));
...
}
public TypeR1 xxxMethodE(QType1 q1, QType2 q2) {
mObj1.doThingU(q1);
TypeR1 r1 = Calc.doThingV(q1, q2);
return r1;
}
public TypeR2 xxxMethodF(QType2 q2, QType3 q3, Type5 finalObj5) {
mObj2.methodY(q3);
TypeR2 r2 = Calc.doThingZ(q2, q3, finalObj5);
return r2;
}
}
下面将事件的监听器的回调方法简称为“事件方法”;
当外部关系是由事件方法嵌套其他代码构成时,称这个外部关系为“事件外部关系”;
上述例子C中,onPpp()是事件方法;getAaaOnPppListener()是事件外部关系;
由例子C可见:
结论2:在任何一个基础模块的事件方法中调用其他基础模块的逻辑,必然可以单纯化重构为事件外部关系;并且重构之后,这个事件外部关系处于中间类中;
6.多个基础模块包含事件方法时的单纯化重构
例子D:
假设程序有A, B, C, D四个基础模块,并且除D以外,它们都有在事件方法中调用其他基础模块的逻辑,即:
A: (paramA)-> {...A, B, C, D}, B: (paramB)-> {...A, B, C, D}, C: (paramC)-> {...A, B, C, D};
根据结论2,单纯化重构A之后,(paramA)-> {...}这个事件外部关系处于中间类中;
再单纯化重构B之后,(paramB)-> {...}这个事件外部关系也处于中间类中;
再单纯化重构C之后,(paramA)-> {...}, (paramB)-> {...}, (paramC)-> {...}这三个事件外部关系都处于中间类中;
根据例子D:
结论3:整个程序在单纯化重构之后,所有的事件外部关系都处于中间类中;
7.对基础模块初始化逻辑的单纯化重构
例子E:
public class AaaActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
mGpsManager = new GpsManager(mainActivity.getApplicationContext(), this);
String filename = ...;
mFileManager = new FileManager(filename);
mFileManager.open();
}
下面对显示模块AaaActivity进行单纯化重构:
public class AaaActivity {
MiddleClass mMiddleClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
mMiddleClass = new MiddleClass(this);
}
public class MiddleClass {
public MiddleClass(MainActivity mainActivity) {
mMainActivity = mainActivity;
mGpsManager = new GpsManager(mainActivity.ge