优雅编制程序之做一个“平常”的程序员(三)

欢呼雀跃一笑

她喜欢上1个在自习室一直坐在他前方的女孩。经过无数十次挣扎,他递给女孩一张字条:你好!小编留心你很久了,
能和您做个对象吗?就又回到做题。女孩看完,收拾了图书到他座位前问:笔者要走了,你要不要和自家一同走?
接下去,他说了一句或许是她毕生中说过的最经典的话:你先走吗,小编还有道题没做……

提出难题

品种中碰到的多少个代码优化难题???

消除难点

图片 1

感悟

先看看上面包车型地铁代码,不清楚给您的首先感觉是何等?

/**
 * 获得设计件当前编辑的章节名称
 * @param deView
 * @return
 */
@Override
public List<FormResult> getEditChapter(DeView deView,List<FormResult> formResultList) throws Exception{
    /** 从后端查询出来的数据,不用管是什么数据 **/
    ResultData resultData = webFormService.getDesignSuitHis(deView.getVid(), deView.getProjectId(), deView.getRevision());
    for(int i=0;i<10;i++){
        ........
        //连接数据库,查询数据代码(只是伪代码,不用太较真)
        webForm = webFormService.findId(id);
        ........
    }
    /** 判空 待修改(2) **/
    if(null != formResultList && formResultList.size() >0){
        for(int i=0;i<formResultList.size();i++){
            StringBuffer editorChapper = null;
            List<TreeModel<TitleDTO>> treeModels = (List<TreeModel<TitleDTO>>)resultData.getEntities().get("titleTreeModel");
            /** 判空 **/
            if(null != treeModels && treeModels.size() >0){
                AllBreak:
                for(TreeModel<TitleDTO> treeModel:treeModels){
                    List<TitleDTO> titleDTOList = treeModel.getData().getChildren();
                    /** 判空 **/
                    if(null != titleDTOList && titleDTOList.size() > 0){
                        for(TitleDTO titleDTO:titleDTOList){
                            editorChapper = new StringBuffer();
                            /** 判空 **/
                            if((null != titleDTO.getChildForm()) && titleDTO.getChildForm().equals(formResultList.get(i).getFormId())){
                                if(null != titleDTO.getBindAttribute()){
                                    String bindEntityVariable =  titleDTO.getBindEntityVariable();
                                    Map<String, IDataObject> map = (Map<String, IDataObject>)resultData.getEntities().get("dataObjects");
                                    IDataObject iDataObject = map.get(bindEntityVariable);
                                    String text = iDataObject.getAttributes().get("name").toString();
                                    /** 拼凑完整章节 **/
                                    editorChapper.append(titleDTO.getTitleNumber()).append(" ").append(text);
                                    /** 设置章节名称 **/
                                    formResultList.get(i).setChapterName(editorChapper.toString());
                                    /** 设置章节Id**/
                                    formResultList.get(i).setTitleId(titleDTO.getId());
                                }else{
                                    /** 拼凑完整章节 **/
                                    editorChapper.append(titleDTO.getTitleNumber());
                                    editorChapper.append(" ");
                                    editorChapper.append(titleDTO.getText());
                                    /** 设置章节名称 **/
                                    formResultList.get(i).setChapterName(editorChapper.toString());
                                    /** 设置章节Id**/
                                    formResultList.get(i).setTitleId(titleDTO.getId());
                                }
                                break AllBreak;
                            }
                        }
                    }
                }
            }
        }
    }

    return formResultList;
}

地点代码有过多题材,大家三个一个化解:

1.for循环中查询数据库

既上面那段代码,在for循环中,连接数据库,查询数据。我们都明白,连接数据库,自己就很耗质量
for(int i=0;i<10;i++){
……..
//连接数据库,查询数据代码(只是伪代码,不用太较真)
webForm = webFormService.findId(id);
……..
}

解决:

  • 依据工作场景,把for循环中的多次一连数据库查询,写到sql中去询问,既一次性查询出来
  • 根据作业场景,看是还是不是足以应用缓存,进步查询效用

2.代码层级太深的标题
**
解决:
针对待修改(2)**,我们要学会用逆向思维的办法,修改如下:

/**
 * 获得设计件当前编辑的章节名称
 * @param deView
 * @return
 */
@Override
public List<FormResult> getEditChapter(DeView deView,List<FormResult> formResultList) throws Exception{
    /** 从后端查询出来的数据,不用管是什么数据 **/
    ResultData resultData = webFormService.getDesignSuitHis(deView.getVid(), deView.getProjectId(), deView.getRevision());
    /** 判空 待修改(1) ,现在用逆向思维的方法,修改如下**/
    if(null == formResultList || formResultList.size() == 0) return;

    for(int i=0;i<formResultList.size();i++){
         ......
         省略代码
         ......   
    }

    return formResultList;
}

3.方法过长

代码整洁之道,对于函数有那样一句话:函数只应该做一件事情,把一件工作办好,而且只由它来做这一件业务

享有地方的代码其实能够挤出很多艺术出来:

既:

/**
 * 获得设计件当前编辑的章节名称
 * @param deView
 * @return
 */
@Override
public List<FormResult> getEditChapter(DeView deView,List<FormResult> formResultList) throws Exception{
    /** 从后端查询出来的数据,不用管是什么数据 **/
    ResultData resultData = webFormService.getDesignSuitHis(deView.getVid(), deView.getProjectId(), deView.getRevision());
    for(int i=0;i<10;i++){
        ........
        //连接数据库,查询数据代码(只是伪代码,不用太较真)
        webForm = webFormService.findId(id);
        ........
    }
    /** 判空 待修改(2) **/
    if(null == formResultList || formResultList.size() == 0) return;
    for(int i=0;i<formResultList.size();i++){
        StringBuffer editorChapper = null;
        List<TreeModel<TitleDTO>> treeModels = (List<TreeModel<TitleDTO>>)resultData.getEntities().get("titleTreeModel");
        /** 判空 **/
        if(null != treeModels && treeModels.size() >0){
            AllBreak:
            for(TreeModel<TitleDTO> treeModel:treeModels){
                List<TitleDTO> titleDTOList = treeModel.getData().getChildren();
                /** 判空 **/
                if(null != titleDTOList && titleDTOList.size() > 0){
                    for(TitleDTO titleDTO:titleDTOList){
                        editorChapper = new StringBuffer();
                        /** 判空 **/
                        if((null != titleDTO.getChildForm()) && titleDTO.getChildForm().equals(formResultList.get(i).getFormId())){
                            if(null != titleDTO.getBindAttribute()){
                                //伪代码而已,不用太计较                                        
                                method3();
                            }else{
                                method4();
                            }
                            break AllBreak;
                        }
                    }
                }
            }
        }
    }
    return formResultList;
}

/**
 *方法3
 */
public void method3(){
    String bindEntityVariable =  titleDTO.getBindEntityVariable();
    Map<String, IDataObject> map = (Map<String, IDataObject>)resultData.getEntities().get("dataObjects");
    IDataObject iDataObject = map.get(bindEntityVariable);
    String text = iDataObject.getAttributes().get("name").toString();
    /** 拼凑完整章节 **/
    editorChapper.append(titleDTO.getTitleNumber()).append(" ").append(text);
    /** 设置章节名称 **/
    formResultList.get(i).setChapterName(editorChapper.toString());
    /** 设置章节Id**/
    formResultList.get(i).setTitleId(titleDTO.getId());
}

/**
 *方法4
 */
public void method4(){
    /** 拼凑完整章节 **/
    editorChapper.append(titleDTO.getTitleNumber());
    editorChapper.append(" ");
    editorChapper.append(titleDTO.getText());
    /** 设置章节名称 **/
    formResultList.get(i).setChapterName(editorChapper.toString());
    /** 设置章节Id**/
    formResultList.get(i).setTitleId(titleDTO.getId());
}

不清楚大家有没有留意一点

if(){
    ..业务代码1
}else{
    ..业务代码2
}

for(int i=0;i<100;i++){
    ..业务代码3
}

对此if,和for中的代码,假如是处理工科作代码,一般能够抽出单独的1个格局,改成

if(){
    method1();
}else{
    method2();
}

for(int i=0;i<100;i++){
    method3();
}   

method1(){
    //业务代码1
}


method2(){
    //业务代码2
}


method3(){
    //业务代码3
}

整个都印证了代码简洁之道的那句话!

再看上边包车型客车代码:

图片 2

代码

代码起头new三个PpProject对象,不过在底下的if逻辑中才使用上,若是if逻辑没进去的话,
那new出来的靶子就接纳不上,针对那种场所,就该把上边的代码移到if逻辑判断中,那样才是合情的

阅读感悟

源点《把日子作为朋友》

  • 心理健康的人不惟应当有力量看清真实的世界,还相应有丰富的能力感知真实的本人
  • 所谓耐心,就是甘于把时间投入到总结、枯燥可是最后会意义非同小可的再度当中去。
  • “实际上,我敢打赌,在您协调不喜欢的事宜上注意三个钟头,未经陶冶的您肯定做不到——因为从没任哪个人不经磨练就能够形成。
    您能够参见所谓的日子分割法。比如,你需求在那件事儿上上心1个钟头,即120 分钟。
    那您应有把当天的职责分解成6 块,而每一块用20 分钟实现。你把21分钟当作你放在心上的主导时间单位,而各种日子单位过后,
    休息6分钟,想方法犒劳一下和好——喝杯咖啡恐怕牛奶,不怕健康很是那就抽一支烟,
    要么给您的男友或女对象打个电话说个别肉麻的话……在属于休息时间的四分钟之内的末梢一分钟,
    双重振作,尝试着过来状态,之后进入下2个为主时间单位——另三个20
    分钟。于是,在您设计时间的时候,
    你应当通晓为了能够统统专注120 分钟,你说到底必要规划出1四二十分钟左右的时间支付。那个措施十一分不难,但非常实用。”
  • 难忘,一位的甜蜜程度,往往取决于他多大程度上能够脱离对表面世界的依附。”
  • 生活的驾驭就在于,集中精力改变那多少个能够改变的,而把这么些无法更改的权且忽略掉。
    潜心塑造本身,把团结营造成二个地道的人,3个有效的人,八个单身的人,比怎样都至关心重视要。
    ”那话的有个别部分好像在有些地点见过,似曾相识。
  • 当您把时光花在1人身上的时候,相当于在她的随身倾注了您生命的一段,
    不论是最终结果什么,反正,那个家伙、那件事都成了您生命的一有些——不管最后你是爱好依然不希罕。
  • 反复并不是有趣味才能做好,而是做好了才有趣味——别说没有趣味
  • 读书上的功成名就,都只靠两件事:策略和百折不挠,而持之以恒自作者正是最重大的方针。
    百折不挠,其实即是再次;而重复,说到底就是岁月的投入,笔者是说,大批量的时间投入。
    二 、与其不停地找更好的主意,还不比立即起始走动,省的蹉跎越多的时光。
    三 、真正具备耐心,甚至震惊的耐心,生活会从此发生石破天惊的转变。
    ④ 、前日全体的轻松惬意,都恐怕是前景的资金。
    伍 、真正最首要的职分永远唯有多个:这个诚然对您的指标落实有扶助的天职。
  • 荒废生命、虚度年华的人,有个一块的风味——他们努力想控制自身全然不能够说了算的,却在祥和真的能掌握控制的地点根本失控。
  • 要拉长本身的社交质量,最佳将时间和生命力越多的奔流在”把自身变得进一步可观”那件事情上——哪怕只在某一方面。
  • 我们总是对短时间受益期望过高,却对深入收益期望过低。
  • 当大家不停地鼓励全数人的时候,最大的收益者其实是大家休戚与共,因为最终大家会意识,
    友善起头进入一种旁人无法想像的气象,成为叁个不要求外人鼓励的人。
  • 许多时候,人们的视死若归来自于软弱,而她们的冷酷只但是来自于恐惧.
  • 你比旁人强一些常有没用,真正有效的是您比外人强很多居多。
  • 成人比成功更首要,而且,那才是人人都得以完结的事情,才是人们都值得追求的事体。而成长实际只有一条路——积累。
  • 学东西前不要定义一定要有用——别以为知识以后没用就不肯去学它
  • 相信积累的力量,本质上便是言听计从复利的能力。
  • 人是不可能管理时间的,时间也不坚守任什么人的管住,它只会自顾自一如既往地流逝。”管理时间”只可是是人们的一相情愿而已。

其他

若果有带给你一小点小欢乐,就让欢腾持续传递下去,欢迎转发,点赞,顶,欢迎留下宝贵的见地,多谢帮忙!

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图