优雅编程之做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中的代码,如果是处理业务代码,一般可以抽出单独的一个方法,改成

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

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

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


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


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

一切都验证了代码简洁之道的那句话!

再看下面的代码:

代码

代码开始new一个PpProject对象,但是在下面的if逻辑中才使用上,假如if逻辑没进入的话,
那new出来的对象就使用不上,针对这种情况,就该把上面的代码移到if逻辑判断中,这样才是合理的

读书感悟

来自《把时间当作朋友》

  • 心理健康的人不仅应该有能力看清真实的世界,还应该有足够的能力感知真实的自我
  • 所谓耐心,就是甘于把时间投入到简单、枯燥但是最终会意义非凡的重复当中去。
  • “实际上,我敢打赌,在你自己不喜欢的事儿上专注2 个小时,未经训练的你肯定做不到——因为没有任何人不经训练就可以做到。
    你可以参照所谓的时间分割法。比如,你需要在这件事儿上专注2 个小时,即120 分钟。
    那你应该把当天的任务分解成6 块,而每一块用20 分钟完成。你把20 分钟当作你专注的基本时间单位,而每个时间单位过后,
    休息5 分钟,想办法犒劳一下自己——喝杯咖啡或者牛奶,不怕健康有问题那就抽一支烟,
    或者给你的男朋友或女朋友打个电话说点儿肉麻的话……在属于休息时间的5 分钟之内的最后一分钟,
    重新振作,尝试着恢复状态,之后进入下一个基本时间单位——另一个20 分钟。于是,在你规划时间的时候,
    你应该明白为了能够完全专注120 分钟,你最终需要规划出150 分钟左右的时间开销。这个方法非常简单,但非常有效。”
  • 记住,一个人的幸福程度,往往取决于他多大程度上可以脱离对外部世界的依附。”
  • 生活的智慧就在于,集中精力改变那些能够改变的,而把那些不能改变的暂时忽略掉。
    专心打造自己,把自己打造成一个优秀的人,一个有用的人,一个独立的人,比什么都重要。
    ”这话的某些部分好像在某个地方见过,似曾相识。
  • 当你把时间花在一个人身上的时候,相当于在他的身上倾注了你生命的一段,
    不管最终结果如何,反正,那个人、那件事都成了你生命的一部分——不管最后你是喜欢还是不喜欢。
  • 往往并不是有兴趣才能做好,而是做好了才有兴趣——别说没有兴趣
  • 学习上的成功,都只靠两件事:策略和坚持,而坚持本身就是最重要的策略。
    坚持,其实就是重复;而重复,说到底就是时间的投入,我是说,大量的时间投入。
    2、与其不停地找更好的方法,还不如马上开始行动,省的虚度更多的时间。
    3、真正拥有耐心,甚至惊人的耐心,生活会从此发生翻天覆地的变化。
    4、今天所有的轻松安逸,都可能是未来的成本。
    5、真正最重要的任务永远只有一个:那个真正对你的目标实现有帮助的任务。
  • 浪费生命、虚度年华的人,有个共同的特征——他们拼命想控制自己完全不能控制的,却在自己真正能掌控的地方彻底失控。
  • 要提高自己的社交质量,最好将时间和精力更多的倾注在"把自己变得更加优秀"这件事情上——哪怕只在某一方面。
  • 我们总是对短期收益期望过高,却对长期收益期望过低。
  • 当我们不停地鼓励所有人的时候,最大的受益者其实是我们自己,因为最终我们会发现,
    自己开始进入一种他人无法想象的状态,成为一个不需要他人鼓励的人。
  • 很多时候,人们的善良来自于软弱,而他们的残暴只不过来自于恐惧.
  • 你比别人强一点根本没用,真正有用的是你比别人强很多很多。
  • 成长比成功更重要,而且,这才是人人都可以做到的事情,才是人人都值得追求的事情。而成长其实只有一条路——积累。
  • 学东西前不用定义一定要有用——别觉得知识现在没用就拒绝去学它
  • 相信积累的力量,本质上就是相信复利的力量。
  • 人是没办法管理时间的,时间也不听从任何人的管理,它只会自顾自一如既往地流逝。"管理时间"只不过是人们的一厢情愿而已。

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容