记录一次代码演变过程——35行变24行

640?wx_fmt=gif

640?wx_fmt=jpeg

Linux编程 点击右侧关注,免费入门到精通! 640?wx_fmt=jpeg


作者丨鹏小轩
https://www.jianshu.com/p/c1af336d29cc


640?wx_fmt=gif1 最初的实现


一般Android应用首页底部都分几个tab模块,点击一个tab就跳转到相应的功能点模块去,所以代码里一般都会有一个方法pageTo(),如下:


private void pageTo(int pageIndex{
    if (pageIndex == mCurrentPage) return;
    mCurrentPage = pageIndex;

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    hideFragment(transaction);

    switch (pageIndex) {
        case PAGE_POSITION_HOME:
            if (mHomeFragment == null) {
                mHomeFragment = new HomeFragment();
                transaction.add(R.id.fragment_container, mHomeFragment);
            } else {
                transaction.show(mHomeFragment);
            }
            transaction.commit();
            break;

        case PAGE_POSITION_MESSAGE:
            if (mMessageFragment == null) {
                mMessageFragment = new MessageFragment();
                transaction.add(R.id.fragment_container, mMessageFragment);
            } else {
                transaction.show(mMessageFragment);
            }
            transaction.commit();
            break;

        case PAGE_POSITION_PERSON:
            if (mUserFragment == null) {
                mUserFragment = new UserFragment();
                transaction.add(R.id.fragment_container, mUserFragment);
            } else {
                transaction.show(mUserFragment);
            }
            transaction.commit();
            break;
    }
}


咋一看,好像没有问题,但是总是觉得还有重复的代码在里面。比如说,else里面的所有逻辑其实重复的。上面的代码,我们认真分析就能够知道,一共做了两件事。


第一,初始化fragment;
第二,提交显示fragment。(这里可以提取出来)


640?wx_fmt=gif2 第二个版本


顺着以上思路,我们很容易的编写了第二个版本。


private void pageTo(int pageIndex{
    if (pageIndex == mCurrentPage) return;
    mCurrentPage = pageIndex;

    FragmentTransaction transaction = getSupportFragmentManager()
                       .beginTransaction();
    hideFragment(transaction);

    switch (pageIndex) {
        case PAGE_POSITION_HOME:
            showFragment(PAGE_POSITION_HOME, transaction, mHomeFragment);
            break;

        case PAGE_POSITION_MESSAGE:
            showFragment(PAGE_POSITION_MESSAGE, transaction
                      , mMessageFragment);
            break;

        case PAGE_POSITION_PERSON:
            showFragment(PAGE_POSITION_PERSON, transaction
                      , mUserFragment);
            break;
    }
}

private void showFragment(int index, FragmentTransaction transaction
            , BaseFragment fragment
{
    if (fragment == null) {
        // 当传入的fragment没有被初始化
        if (index == PAGE_POSITION_HOME) {
            fragment = mHomeFragment = new HomeFragment();
        } else if (index == PAGE_POSITION_MESSAGE) {
            fragment = mMessageFragment = new MessageFragment();
        } else {
            fragment = mUserFragment = new UserFragment();
        }
        transaction.add(R.id.fragment_container, fragment);

    } else {
        transaction.show(fragment);
    }
    transaction.commit();
}


这个版本主要是提取出了初始化和显示fragment的代码,初始化已经没有办法更改得更加简单,显示fragment这段代码就可以共用起来。


但是看到这里,发现另一个问题,就是在pageTo()和showFragment()这两个方法中,都对index进行了判断。其实是重复的,于是就有了第三个版本。


640?wx_fmt=gif3 第三版本

 
 


private SparseArray<BaseFragment> fragmentMap = new SparseArray<>();

private void pageTo(int pageIndex{
    if (pageIndex == mCurrentPage) return;
    mCurrentPage = pageIndex;

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    hideFragment(transaction);

    showFragment(pageIndex, transaction, fragmentMap.get(pageIndex));

}

private void showFragment(int index, FragmentTransaction transaction, BaseFragment fragment{
    if (fragment == null) {
        // 当传入的fragment没有被初始化
        if (index == PAGE_POSITION_HOME) {
            fragment = mHomeFragment = new HomeFragment();
        } else if (index == PAGE_POSITION_MESSAGE) {
            fragment = mMessageFragment = new MessageFragment();
        } else {
            fragment = mUserFragment = new UserFragment();
        }
        transaction.add(R.id.fragment_container, fragment);
        // 缓存住已经初始化的fragment,以便点击tab时传入到此方法中。
        fragmentMap.put(index, fragment);

    } else {
        transaction.show(fragment);
    }
    transaction.commit();
}


利用集合来缓存住 fragment,这样就可以省去一次判断。到此,大功告成,代码瞬间感觉清爽了许多,迷之缩进也少了。


精雕细琢,就是你思考行走的路径。


 推荐↓↓↓ 

640?wx_fmt=png

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

640?wx_fmt=png万水千山总是情,点个 “ 好看” 行不行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值