去单纯性,因此基础模块之间的相互调用必须通过中间类来实现;
例如,A模块调用B模块的方法functionBbb(),变为,A模块调用中间类、中间类调用B模块的方法functionBbb();
例如,A模块定义了B模块的变量mBbb,变为,中间类定义mBbb变量;
基础模块的单纯化重构:
例子B:
public class KkkActivity {
View vViewA;
View vViewB;
FileManager mFileManager;
...
private void functionL() {
vViewA.setOnClickListener((v) -> {
mFileManager.write("abcdef");
});
}
private void functionM() {
vViewA.setOnClickListener((v) -> {
vViewB.setVisibility(View.GONE);
});
}
}
在例子B中,mFileManager的声明语句和mFileManager.write("abcdef")语句处在显示模块KkkActivity中,使KkkActivity有失单纯性;因此需要调进行单纯化重构,使KkkActivity保持单纯性;
下面对例子B的显示模块进行单纯化重构:
对于例子B,其中的
vViewA.setOnClickListener((v) -> {
mFileManager.write("abcdef");
}
这个语句,可以分解为:
View.OnClickListener listener = new View.OnClickListener() {
@Override public void onClick(View v) {
mFileManager.write("abcdef");
}
};
vViewA.setOnClickListener(listener);
这几个语句调用了
View.OnClickListener listener = new View.OnClickListener() {...};
mFileManager.write("abcdef");
这两个语句;它们一个属于显示模块、一个属于文件模块;
这两个语句可以提取封装为一个方法getWriteOnClickListener(),如下:
private View.OnClickListener getWriteOnClickListener() {
View.OnClickListener listener = new View.OnClickListener() {
@Override public void onClick(View v) {
mFileManager.write("abcdef");
}
};
return listener;
}
vViewA.setOnClickListener(getWriteOnClickListener());
因此这两个语句构成的getWriteOnClickListener()是显示模块与文件模块的外部关系;
与八.2例子A的差异:在这里,监听器创建的语句嵌套文件模块的语句,而不是语句排列;
下面构建中间类——MiddleClass,使KkkActivity保持单纯性:
public class MiddleClass {
FileManager mFileManager;
public View.OnClickListener getWriteOnClickListener() {
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
mFileManager.write("abcdef");
}
};
return listener;
}
}
public class KkkActivity {
View vViewA;
View vViewB;
MiddleClass mMiddleClass;
...
private void functionL() {
vViewA.setOnClickListener(mMiddleClass.getWriteOnClickListener());
}
private void functionM() {
vViewA.setOnClickListener((v) -> {
vViewB.setVisibility(View.GONE);
});
}
}
5.不满足单纯性的一般性例子
例子C:
假设mObj1、mObj2、mObj3是属于基础模块XxxModule的变量,RrrModule、SssModule是另外两个基础模块;
class XxxModule {
Type1 mObj1;
Type2 mObj2;
Type3 mObj3;
RrrModule mRrrModule;
SssModule mSssModule;
void functionO() {
mObj1.methodT();
Type4 obj4 = new Type4();
final Type5 finalObj5 = new Type5();
mObj3.setOnPppListener(new OnPppListener() {
@Override public void onPpp(QType1 q1, QType2 q2, QType3 q3) {
mObj1.doThingU(q1);
TypeR1 r1 = Calc.doThingV(q1, q2);
mRrrModule.methodW(r1);
mObj2.methodY(q3);
TypeR2 r2 = Calc.doThingZ(q2, q3, finalObj5);
mSssModule.methodA(r1, r2, new OnDddListener() {
@Override public onDdd(TypeB b) {
mRrrModule.methodC(b);
}
});
}
});
...
}
}
回调方法onPpp()内可引用的对象有q1, q2, q3, finalObj5, mObj1, mObj2, mObj3, mRrrModule, mSssModule;
下面将例子C的XxxModule单纯化:
对于例子C中的
mObj3.setOnPppListener(new OnPppListener() {
@Override public void onPpp(QType1 q1, QType2 q2, QType3 q3) {
mObj1.doThingU(q1);
TypeR1 r1 = Calc.doThingV(q1, q2);
mRrrModule.methodW(r1);
mObj2.methodY(q3);
TypeR2 r2 = Calc.doThingZ(q2, q3, finalObj5);
mSssModule.methodA(r1, r2, new OnDddListener() {
@Override public onDdd(TypeB b) {
mRrrM