開心一笑
他喜歡上一個在自習(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)載禁筏,點贊持钉,頂,歡迎留下寶貴的意見篱昔,多謝支持每强!