優(yōu)雅編程之做1個“正常”的程序員(三)

開心一笑

他喜歡上一個在自習(xí)室一直坐在他前面的女孩贪惹。經(jīng)過無數(shù)次掙扎苏章,他遞給女孩一張字條:你好!我注意你很久了馍乙,
能和你做個朋友嗎布近?就又回去做題。女孩看完丝格,收拾了書本到他座位前問:我要走了撑瞧,你要不要和我一起走?
接下來显蝌,他說了一句可能是他一生中說過的最經(jīng)典的話:你先走吧预伺,我還有道題沒做……

提出問題

項目中碰到的幾個代碼優(yōu)化問題订咸??酬诀?

解決問題

感悟

先看看下面的代碼脏嚷,不知道給你的第一感覺是什么?

/**
 * 獲得設(shè)計件當(dāng)前編輯的章節(jié)名稱
 * @param deView
 * @return
 */
@Override
public List<FormResult> getEditChapter(DeView deView,List<FormResult> formResultList) throws Exception{
    /** 從后端查詢出來的數(shù)據(jù)瞒御,不用管是什么數(shù)據(jù) **/
    ResultData resultData = webFormService.getDesignSuitHis(deView.getVid(), deView.getProjectId(), deView.getRevision());
    for(int i=0;i<10;i++){
        ........
        //連接數(shù)據(jù)庫父叙,查詢數(shù)據(jù)代碼(只是偽代碼,不用太較真)
        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();
                                    /** 拼湊完整章節(jié) **/
                                    editorChapper.append(titleDTO.getTitleNumber()).append(" ").append(text);
                                    /** 設(shè)置章節(jié)名稱 **/
                                    formResultList.get(i).setChapterName(editorChapper.toString());
                                    /** 設(shè)置章節(jié)Id**/
                                    formResultList.get(i).setTitleId(titleDTO.getId());
                                }else{
                                    /** 拼湊完整章節(jié) **/
                                    editorChapper.append(titleDTO.getTitleNumber());
                                    editorChapper.append(" ");
                                    editorChapper.append(titleDTO.getText());
                                    /** 設(shè)置章節(jié)名稱 **/
                                    formResultList.get(i).setChapterName(editorChapper.toString());
                                    /** 設(shè)置章節(jié)Id**/
                                    formResultList.get(i).setTitleId(titleDTO.getId());
                                }
                                break AllBreak;
                            }
                        }
                    }
                }
            }
        }
    }

    return formResultList;
}

上面代碼有很多問題肴裙,我們一個一個解決:

1.for循環(huán)中查詢數(shù)據(jù)庫

既下面這段代碼趾唱,在for循環(huán)中,連接數(shù)據(jù)庫蜻懦,查詢數(shù)據(jù)甜癞。我們都知道,連接數(shù)據(jù)庫宛乃,本身就很耗性能
for(int i=0;i<10;i++){
........
//連接數(shù)據(jù)庫悠咱,查詢數(shù)據(jù)代碼(只是偽代碼,不用太較真)
webForm = webFormService.findId(id);
........
}

解決:

  • 根據(jù)業(yè)務(wù)場景征炼,把for循環(huán)中的多次連接數(shù)據(jù)庫查詢析既,寫到sql中去查詢,既一次性查詢出來
  • 根據(jù)業(yè)務(wù)場景柒室,看是否可以利用緩存渡贾,提高查詢效率

2.代碼層級太深的問題
**
解決:
針對待修改(2)**,我們要學(xué)會用逆向思維的方法雄右,修改如下:

/**
 * 獲得設(shè)計件當(dāng)前編輯的章節(jié)名稱
 * @param deView
 * @return
 */
@Override
public List<FormResult> getEditChapter(DeView deView,List<FormResult> formResultList) throws Exception{
    /** 從后端查詢出來的數(shù)據(jù)空骚,不用管是什么數(shù)據(jù) **/
    ResultData resultData = webFormService.getDesignSuitHis(deView.getVid(), deView.getProjectId(), deView.getRevision());
    /** 判空 待修改(1) ,現(xiàn)在用逆向思維的方法擂仍,修改如下**/
    if(null == formResultList || formResultList.size() == 0) return囤屹;
        
    for(int i=0;i<formResultList.size();i++){
         ......
         省略代碼
         ......   
    }

    return formResultList;
}

3.方法過長

代碼整潔之道,對于函數(shù)有這么一句話:函數(shù)只應(yīng)該做一件事情逢渔,把一件事情做好肋坚,而且只由它來做這一件事情

所有上面的代碼其實可以抽出很多方法出來:

既:

/**
 * 獲得設(shè)計件當(dāng)前編輯的章節(jié)名稱
 * @param deView
 * @return
 */
@Override
public List<FormResult> getEditChapter(DeView deView,List<FormResult> formResultList) throws Exception{
    /** 從后端查詢出來的數(shù)據(jù),不用管是什么數(shù)據(jù) **/
    ResultData resultData = webFormService.getDesignSuitHis(deView.getVid(), deView.getProjectId(), deView.getRevision());
    for(int i=0;i<10;i++){
        ........
        //連接數(shù)據(jù)庫肃廓,查詢數(shù)據(jù)代碼(只是偽代碼智厌,不用太較真)
        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();
    /** 拼湊完整章節(jié) **/
    editorChapper.append(titleDTO.getTitleNumber()).append(" ").append(text);
    /** 設(shè)置章節(jié)名稱 **/
    formResultList.get(i).setChapterName(editorChapper.toString());
    /** 設(shè)置章節(jié)Id**/
    formResultList.get(i).setTitleId(titleDTO.getId());
}

/**
 *方法4
 */
public void method4(){
    /** 拼湊完整章節(jié) **/
    editorChapper.append(titleDTO.getTitleNumber());
    editorChapper.append(" ");
    editorChapper.append(titleDTO.getText());
    /** 設(shè)置章節(jié)名稱 **/
    formResultList.get(i).setChapterName(editorChapper.toString());
    /** 設(shè)置章節(jié)Id**/
    formResultList.get(i).setTitleId(titleDTO.getId());
}

不知道大家有沒有注意一點

if(){
    ..業(yè)務(wù)代碼1
}else{
    ..業(yè)務(wù)代碼2
}

for(int i=0;i<100;i++){
    ..業(yè)務(wù)代碼3
}

對于if哀蘑,和for中的代碼诚卸,如果是處理業(yè)務(wù)代碼葵第,一般可以抽出單獨的一個方法,改成

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

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

method1(){
    //業(yè)務(wù)代碼1
}


method2(){
    //業(yè)務(wù)代碼2
}


method3(){
    //業(yè)務(wù)代碼3
}

一切都驗證了代碼簡潔之道的那句話!

再看下面的代碼:

代碼

代碼開始new一個PpProject對象,但是在下面的if邏輯中才使用上合溺,假如if邏輯沒進(jìn)入的話卒密,
那new出來的對象就使用不上,針對這種情況棠赛,就該把上面的代碼移到if邏輯判斷中哮奇,這樣才是合理的

讀書感悟

來自《把時間當(dāng)作朋友》

  • 心理健康的人不僅應(yīng)該有能力看清真實的世界,還應(yīng)該有足夠的能力感知真實的自我
  • 所謂耐心恭朗,就是甘于把時間投入到簡單屏镊、枯燥但是最終會意義非凡的重復(fù)當(dāng)中去依疼。
  • “實際上痰腮,我敢打賭,在你自己不喜歡的事兒上專注2 個小時律罢,未經(jīng)訓(xùn)練的你肯定做不到——因為沒有任何人不經(jīng)訓(xùn)練就可以做到膀值。
    你可以參照所謂的時間分割法。比如误辑,你需要在這件事兒上專注2 個小時沧踏,即120 分鐘。
    那你應(yīng)該把當(dāng)天的任務(wù)分解成6 塊巾钉,而每一塊用20 分鐘完成翘狱。你把20 分鐘當(dāng)作你專注的基本時間單位,而每個時間單位過后砰苍,
    休息5 分鐘潦匈,想辦法犒勞一下自己——喝杯咖啡或者牛奶,不怕健康有問題那就抽一支煙赚导,
    或者給你的男朋友或女朋友打個電話說點兒肉麻的話……在屬于休息時間的5 分鐘之內(nèi)的最后一分鐘茬缩,
    重新振作,嘗試著恢復(fù)狀態(tài)吼旧,之后進(jìn)入下一個基本時間單位——另一個20 分鐘凰锡。于是,在你規(guī)劃時間的時候圈暗,
    你應(yīng)該明白為了能夠完全專注120 分鐘掂为,你最終需要規(guī)劃出150 分鐘左右的時間開銷。這個方法非常簡單员串,但非常有效勇哗。”
  • 記住,一個人的幸福程度,往往取決于他多大程度上可以脫離對外部世界的依附佳遣×拊停”
  • 生活的智慧就在于荒典,集中精力改變那些能夠改變的尝蠕,而把那些不能改變的暫時忽略掉礁击。
    專心打造自己庄萎,把自己打造成一個優(yōu)秀的人迹恐,一個有用的人挣惰,一個獨立的人,比什么都重要殴边。
    ”這話的某些部分好像在某個地方見過憎茂,似曾相識。
  • 當(dāng)你把時間花在一個人身上的時候锤岸,相當(dāng)于在他的身上傾注了你生命的一段竖幔,
    不管最終結(jié)果如何,反正是偷,那個人拳氢、那件事都成了你生命的一部分——不管最后你是喜歡還是不喜歡。
  • 往往并不是有興趣才能做好蛋铆,而是做好了才有興趣——別說沒有興趣
  • 學(xué)習(xí)上的成功馋评,都只靠兩件事:策略和堅持,而堅持本身就是最重要的策略刺啦。
    堅持,其實就是重復(fù);而重復(fù),說到底就是時間的投入留特,我是說,大量的時間投入玛瘸。
    2蜕青、與其不停地找更好的方法,還不如馬上開始行動捧韵,省的虛度更多的時間市咆。
    3、真正擁有耐心再来,甚至驚人的耐心蒙兰,生活會從此發(fā)生翻天覆地的變化。
    4芒篷、今天所有的輕松安逸搜变,都可能是未來的成本。
    5针炉、真正最重要的任務(wù)永遠(yuǎn)只有一個:那個真正對你的目標(biāo)實現(xiàn)有幫助的任務(wù)挠他。
  • 浪費生命、虛度年華的人篡帕,有個共同的特征——他們拼命想控制自己完全不能控制的殖侵,卻在自己真正能掌控的地方徹底失控贸呢。
  • 要提高自己的社交質(zhì)量,最好將時間和精力更多的傾注在"把自己變得更加優(yōu)秀"這件事情上——哪怕只在某一方面拢军。
  • 我們總是對短期收益期望過高楞陷,卻對長期收益期望過低。
  • 當(dāng)我們不停地鼓勵所有人的時候茉唉,最大的受益者其實是我們自己固蛾,因為最終我們會發(fā)現(xiàn),
    自己開始進(jìn)入一種他人無法想象的狀態(tài)度陆,成為一個不需要他人鼓勵的人艾凯。
  • 很多時候,人們的善良來自于軟弱,而他們的殘暴只不過來自于恐懼.
  • 你比別人強(qiáng)一點根本沒用,真正有用的是你比別人強(qiáng)很多很多懂傀。
  • 成長比成功更重要趾诗,而且,這才是人人都可以做到的事情鸿竖,才是人人都值得追求的事情沧竟。而成長其實只有一條路——積累。
  • 學(xué)東西前不用定義一定要有用——別覺得知識現(xiàn)在沒用就拒絕去學(xué)它
  • 相信積累的力量缚忧,本質(zhì)上就是相信復(fù)利的力量。
  • 人是沒辦法管理時間的杈笔,時間也不聽從任何人的管理闪水,它只會自顧自一如既往地流逝。"管理時間"只不過是人們的一廂情愿而已蒙具。

其他

如果有帶給你一絲絲小快樂球榆,就讓快樂繼續(xù)傳遞下去,歡迎轉(zhuǎn)載禁筏,點贊持钉,頂,歡迎留下寶貴的意見篱昔,多謝支持每强!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市州刽,隨后出現(xiàn)的幾起案子空执,更是在濱河造成了極大的恐慌,老刑警劉巖穗椅,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辨绊,死亡現(xiàn)場離奇詭異,居然都是意外死亡匹表,警方通過查閱死者的電腦和手機(jī)门坷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門宣鄙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人默蚌,你說我怎么就攤上這事框冀。” “怎么了敏簿?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵明也,是天一觀的道長。 經(jīng)常有香客問我惯裕,道長温数,這世上最難降的妖魔是什么蜻势? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任撑刺,我火速辦了婚禮,結(jié)果婚禮上握玛,老公的妹妹穿的比我還像新娘够傍。我一直安慰自己,他們只是感情好挠铲,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布冕屯。 她就那樣靜靜地躺著,像睡著了一般拂苹。 火紅的嫁衣襯著肌膚如雪安聘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天瓢棒,我揣著相機(jī)與錄音浴韭,去河邊找鬼。 笑死脯宿,一個胖子當(dāng)著我的面吹牛念颈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播连霉,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼榴芳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窘面?” 一聲冷哼從身側(cè)響起翠语,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎财边,沒想到半個月后肌括,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年谍夭,在試婚紗的時候發(fā)現(xiàn)自己被綠了黑滴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡紧索,死狀恐怖袁辈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情珠漂,我是刑警寧澤晚缩,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站媳危,受9級特大地震影響荞彼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜待笑,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一鸣皂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暮蹂,春花似錦寞缝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至我纪,卻和暖如春慎宾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浅悉。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留券犁,地道東北人术健。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像粘衬,于是被迫代替她去往敵國和親荞估。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容