设为首页 加入收藏

TOP

程序结构设计理论(Android)(四)
2019-09-26 11:11:59 】 浏览:272
Tags:程序 结构设计 理论 Android
去单纯性,因此基础模块之间的相互调用必须通过中间类来实现;
例如,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
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇11.Django基础九之中间件 下一篇Nexus-在项目中使用Maven私服,De..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目