代碼大全2內(nèi)容簡介.ppt
《代碼大全2內(nèi)容簡介.ppt》由會員分享,可在線閱讀,更多相關(guān)《代碼大全2內(nèi)容簡介.ppt(38頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、1、歡迎進入軟件的世界,這章闡述了軟件構(gòu)建的重要性,軟件構(gòu)建大體上就是說具體程序員做的工作,而不是需求收集、產(chǎn)品設(shè)計、業(yè)務(wù)分析、測試、運維人員等做的工作,雖然這些人的工作在整個軟件開發(fā)生命周期中也非常的重要,但是一個軟件開發(fā)的最主要的部分卻是具體程序員做的那部分事情。一般的軟件公司里具體程序員的數(shù)量應(yīng)該占很大的比重,大多數(shù)的程序員也是具體程序員,只有很少的程序員經(jīng)過多年的工作學(xué)習(xí)能成為項目經(jīng)理,業(yè)務(wù)分析人員,架構(gòu)師等高級軟件從業(yè)人員。 具體程序員做什么工作呢?理解架構(gòu)師做出的架構(gòu)設(shè)計,做你負(fù)責(zé)的模塊的詳細(xì)設(shè)計,做出自己的負(fù)責(zé)模塊的開發(fā)計劃,編碼,測試,解決測試人員提出的BUG,以及網(wǎng)站上線后排
2、查線上的問題等等。如果你做的是這些工作,那你就是具體程序員,你做的大多事情就是軟件構(gòu)建的事情。 只要你是個程序員,就應(yīng)該系統(tǒng)的,好好的學(xué)習(xí)下軟件構(gòu)建的技能和知識,這比你學(xué)很多種語言,嘗試很多種花哨的新技術(shù)要值很多,至少我看了這本書的其中幾章有這個體會,第一次認(rèn)真考慮軟件構(gòu)建中的一些基礎(chǔ)的,細(xì)節(jié)的,基本的,通用的思維方式,編碼技巧和規(guī)范。,2、用隱喻來更充分的理解軟件開發(fā),這章總的來說可讀可不讀,比較理論。 我們平時把軟件編碼叫做寫代碼,讓外行人聽起來像是在寫文章,就是把你心里的想法一點一點的有條理的寫出來,在這一點上,編碼和寫文章確實有相似之處,但寫文章一般是你自己寫,編碼則需要和別人合作。
3、還有在軟件設(shè)計的時候,我們經(jīng)常拿蓋房子來比喻,蓋房子之前要先畫好藍(lán)圖,整體結(jié)構(gòu),考慮好水、電的布局等,蓋一個小狗窩和蓋一棟大樓的過程也是不一樣的,做一個小軟件和一個超大型的軟件的過程也是不一樣的。如果你能很好把軟件的開發(fā)過程想象成某些生活中具體的例子,找到他們的相似之處和不同之處,你就能更好的理解軟件開發(fā),以及利用這些隱喻來與人更好的溝通。你腦子里如果有很多這樣的隱喻,在你做軟件設(shè)計時就會不經(jīng)意的想起來,成為你思考和權(quán)衡不同方案的工具。,3、三思而后行:前期準(zhǔn)備,做任何事情都需要前期準(zhǔn)備,在軟件開發(fā)中更是如此,盡管如此,還是有很多程序員接到任務(wù)后就是想著盡快編碼。要想保證一個軟件的質(zhì)量,在前期
4、準(zhǔn)備,需求分析,架構(gòu)設(shè)計,編碼,測試,維護等每一個環(huán)節(jié)都要重視質(zhì)量。具體程序員接到任務(wù)的時候要檢查一下在你之前的那些軟件活動有沒有準(zhǔn)備好,如果需求中有好多沒有說明的地方,架構(gòu)設(shè)計也不明確,你不知道需要和其它模塊之間如何通信,基礎(chǔ)組件啥也沒有,這種情況下進行詳細(xì)設(shè)計和編碼會很受罪。和老板同事達(dá)成前期準(zhǔn)備重要性的共識之后,就是如何做前期準(zhǔn)備以及如何判斷前期準(zhǔn)備已經(jīng)做好的技巧,這些是更實用的地方。如何做前期準(zhǔn)備基本上是需求分析人員,產(chǎn)品經(jīng)理和架構(gòu)師的關(guān)心的問題,而判斷前期準(zhǔn)備是否已準(zhǔn)備好則是具體程序員也需要具備的能力。 所以我們在開發(fā)之前要要先通讀特性文檔的內(nèi)容,看看設(shè)計上是不是有疑難的地方、有不明
5、確的地方、有不理解的地方等,及時溝通解決問題。 前期準(zhǔn)備所花費的時間是不容易把握的,也沒有個固定的衡量標(biāo)準(zhǔn),但前期準(zhǔn)備是必須要做的,前期準(zhǔn)備的根本目的是降低風(fēng)險,提高項目質(zhì)量。,4、防錯編程,4.1 對錯誤輸入的保護 4.2 錯誤處理技術(shù) 4.3 異常,防御式編程,這一概念來自 防御式駕駛,在防御式駕駛中要建立這樣一種思維,那就是你永遠(yuǎn)也不能確定另一位司機將要做什么。這樣才能保證 在其他人做出危險動作時你也不會受到傷害。防御式編程主要思想:子程序應(yīng)該不因傳入錯誤數(shù)據(jù)而被破壞,哪怕是有其他子程序產(chǎn)生的錯誤數(shù)據(jù)。,4.1 對錯誤輸入的保護,檢查所有外部進來的數(shù)據(jù) 如文件、用戶、網(wǎng)絡(luò)或其他外部接口獲
6、取數(shù)據(jù)時,應(yīng)檢查獲得數(shù)據(jù),確保他在允許的范圍內(nèi)。對應(yīng)數(shù)值要要確保在允許的范圍內(nèi),對于字符串要確保其不超長等。 檢查所有輸入?yún)?shù)的值 決定如何處理錯誤的輸入數(shù)據(jù) 要根據(jù)具體的使用情況,后面會講,4.2錯誤處理技術(shù),主要有以下幾種方法 1、返回中立值 有時候錯誤處理的最佳方法就是繼續(xù)執(zhí)行操作并返回一個沒有危害的數(shù)值,比如數(shù)值計算可以返回0,字符串可以返回空字符串,好像我們的SPF類,再比如一個繪圖的功能,如果接收到一個錯誤的顏色可以使用默認(rèn)顏色繼續(xù)繪制,當(dāng)然如果是癌癥病人的X光片的繪圖程序,還是不要現(xiàn)實某個“中立值”,人家會找你拼命的,這時候關(guān)閉程序會比限時錯誤的病人數(shù)據(jù)要好。 2. 換用下一個正
7、確的數(shù)據(jù) 在處理數(shù)據(jù)流的時候返回下一個正確的數(shù)據(jù)即可。如果你在讀取數(shù)據(jù)庫時候發(fā)現(xiàn)一條數(shù)據(jù)已經(jīng)損壞,可以繼續(xù)讀下去找到正確的記錄位置。比如你以每秒100次的速度讀取體溫計的數(shù)據(jù),那么如果某一次的數(shù)據(jù)讀取錯誤,你只需要等待1/100然后繼續(xù)讀取即可。 3、返回和上次相同的數(shù)據(jù) 比如某些情況下你沒有讀取到數(shù)據(jù),那么可以簡單的返回前一次的結(jié)果。當(dāng)然如果你在管理ATM機上操作,你可能就不希望返回上一個結(jié)果了,因為那可能是前一個用戶的銀行帳號。,4.2錯誤處理技術(shù),4、換用最接近的合法值 比如體溫計的數(shù)據(jù)定義在1-100之前,如果你獲得數(shù)據(jù)小于0,你可以把他替換為0就是最接近的合法值,同樣大于100就替換
8、為100,生活中的例子就是倒車,倒車時速度表無法負(fù)的速度,所以直接顯示0。 5. 把警告信息記錄到日志文件中 在檢測到錯誤的時候你可以在日志文件中增加一條警告信息,然后繼續(xù)執(zhí)行,方便查詢總結(jié),比如系統(tǒng)日志。 6、返回一個錯誤代碼 7、調(diào)用錯誤處理函數(shù)/對象 優(yōu)點是:集中處理,調(diào)用更簡單 缺點是耦合性太強,不容移植,如果出現(xiàn)安全問題容易被攻擊。 8、錯誤發(fā)生時顯示出錯誤 不要破壞界面的一致性,攻擊者可能會利用這個找到漏洞,所以我們要求不能顯示.net的黃頁一樣。,4.2錯誤處理技術(shù),9、用最妥當(dāng)?shù)姆绞皆诰植刻幚?7、關(guān)閉/停止程序 有些系統(tǒng)一旦檢查到錯誤就會關(guān)閉,這通常是遇到比較嚴(yán)重或者安全攸關(guān)
9、的功能上,比如windows的安全日志即使?jié)M了,也會正常工作,但你可以配置windows,讓它在日志滿的時候停止服務(wù),在安全信息攸關(guān)的環(huán)境下中這樣做是明智的。,4.3異常處理,異常是把代碼中的錯誤或者異常事件傳遞給調(diào)用方的特殊手段。如果在程序中遇到了意料之外的情況就可以拋出異常。 異常要審慎明智的使用,下面給出一些異常上的建議。 拋出異常,讓其他部分去解決問題 只有在真正的異常才使用,不能到處try-catch 不能用異常來推卸責(zé)任,盡量局部處理 不要在構(gòu)造和析構(gòu)函數(shù)中使用異常。 5、正確的抽象級上使用異常 6、異常信息應(yīng)該包含詳細(xì)的異常數(shù)據(jù),便于解讀。 7、不要使try-catch為空,一定
10、要進行處理,也不能讓try為空。 所以說盡量建立集中的異常處理報告,規(guī)范化異常使用,甚至考慮不用異常,使用其他方法替換。,5、使用條件語句,簡單的 if-else 格式 使用 if-else 雖然很簡答,但是有很多細(xì)節(jié)應(yīng)該注意: 1.先寫很正常很普通的分支,再寫不尋常的分支 好處:這樣可以突出判斷的主體部分,不至于讓次要的部分混淆程序執(zhí)行的過程,使程序易讀。 2.在分支中要特別注意相等的條件,確保其正確性 使用 =來的清晰,這樣可能會犯在數(shù)組中類似的越界錯誤,5.1、if 語句,3.把正常情況下執(zhí)行的代碼放在if后面,而不是防在else后面 把想要在正常情況下執(zhí)行的代碼放在前面,這樣可以使程
11、序的功 清晰易讀,清楚地了解到程序究竟是做什么功能的。,5.1、if 語句,5.1、if 語句,5.1、if 語句,4.If 后面的子句要有一個有意義的意思??梢允∪lse子句 bad: if(SomeTest) good: if(!SomeTest) : elseDoSomething() DoSomething() ,5.1、if 語句,5.考慮 else 子句 else子句盡量不要省略,以免發(fā)生沒有考慮到的錯誤,除非在顯而易見的情況下才可以省略。 6.檢查 else 子句的正確性 檢查的重點應(yīng)該是程序的主要部分,即if部分,有可能的話,也 要檢查else部分 7
12、.檢查是不是把if 和 else 里的處理頁反了 這是個常見的錯誤,一定要注意小心避免,5.1、if 語句,If else if else 鏈?zhǔn)讲僮?下面給出關(guān)于if- else if -else操作的一些建議 1.用返回布爾值的函數(shù)來代替復(fù)雜的邏輯表達(dá)式 如果判斷的條件是復(fù)雜的表達(dá)式的話,程序既不易讀,也不易修改。,1、if 語句,2.把最常見的情況放在最前面 最常見的情況放在前面可以增加程序的可讀性,使人閱讀程序時提高效率。 3.確保所有的路徑都被覆蓋 在程序的最后再加上一個 else ,并且在這個判斷里面使用 斷言或者給程序員顯示警告。這里,出錯的信息是給程序員看的,方便開發(fā)期間的
13、調(diào)試工作。 4.如果程序語言支持的話,使用別的機制來代替if else if-else結(jié)構(gòu) 可以使用case來代替。,5.2、Case 語句,Case 語句是很常用的,在Java C# 語言里,使用switch case 機制。 下面給出使用Case需要注意的一些地方 使用效率最高的 Case 的組合的順序 如果Case的分支不是很多,安排他們的順序就無關(guān)緊要,若分支太多的話,就很重要了。,5.2、Case 語句,1.以數(shù)字或者字母的順序來安排 如果這些分支的重要性差不多的話,就使用字母序或數(shù)字來標(biāo)記他們, 這樣一可以易讀,二可以很方便的找到該分支 2.正常情況下的分支要放在最前面 這樣可
14、以指示那些分支是正常的,哪些是不正常的。 3.把訪問頻率高的分支放在前面,低的放在后面 這樣一可以增加可讀性,使讀者清楚看到哪個分支最為常用, 同時,也提高了執(zhí)行效率,加快索引。,5.2、Case 語句,使用 Case 語句的一些建議 1.每一個 Case 里的操作都應(yīng)該簡單 好處:短的代碼清晰易讀,增加可讀性,如果代碼很長的話,就把它們單獨放在一個模塊里。 2.不要使用容易出錯的變量來作為條件 作為判斷的變量應(yīng)該簡單,下面一個例子是以用戶輸入?yún)?shù)的第一個字母作為標(biāo)志的,(switch后面只能跟整型和字符型)這樣很容易出錯,如果非要那樣做的話,就不應(yīng)該使用if-else if-else ,然后
15、把判斷的語句寫全。,5.2、Case 語句,5.2、Case 語句,2、Case 語句,3.盡量不要使用默認(rèn)的分支來檢查合法的分支 如果沒有使用default子句,而僅僅是在case里面做一些處理的話,這樣可能會使程序以后維護起來比較麻煩,修改case 語句很不方便。盡量不要使用default來做檢查,而是采用多寫case的方法。 4.使用 default 子句來檢查錯誤 如果在程序中必須要有一個case 后面的部分不會被執(zhí)行,那么default里面就寫上顯示出錯的代碼。 5.在每一case的最后別忘了寫上break 類似于C的語言都必須要寫上break 以便能跳得出來,如果不寫的話就會跳到下
16、一個case 里面去。 6.如果非要在程序中執(zhí)行兩個以上的case的內(nèi)容(case嵌套if)的時候,一定要注釋清楚,個人建議還是不要這樣嵌套,還不如使用if-else if-else。,5.2、使用前的提示,在使用條件判斷語句的時候,一定要檢查是不是符合下面的要求 If-else 語句: 1.主體部分是不是在 if 語句中清晰的表達(dá)了? 2.在檢查等號條件是不是正確的?會不會發(fā)生越界錯誤? 3.是不是缺少else子句? 4.Else子句是不是正確的使用了? 5.If 和 else中分別需要做的工作又沒有混淆? 6.正常情況下的處理應(yīng)該由if 來完成,是不是弄到else 里了。,5.3、使用前的
17、提示,If-else if-else 結(jié)構(gòu)需要注意的地方 1.復(fù)雜的邏輯表達(dá)式是不是封裝在單獨的函數(shù)中?通過函數(shù)調(diào)用的方式來實現(xiàn)判斷而不是直接寫在if里面? 2.是不是最常見的操作放在最前面? 3.是不是所有的路徑都覆蓋了? 4.是不是整個結(jié)構(gòu)都按照合理的方式來執(zhí)行?,5.3、使用前的提示,Switch Case 語句 1.是不是所有的case都按照有意義的順序排列? 2.是不是每個case里的操作都很簡單,通過函數(shù)調(diào)用來實現(xiàn)? 3.是不是合法的使用了default語句? 4.Default語句后面是不是有處理錯誤和報告錯誤的代碼? 5.在c c# java里是不是在每個case 后面跟上br
18、eak?,6、控制循環(huán),選擇循環(huán)類型 循環(huán)控制 寫循環(huán)簡單的方法從內(nèi)到外,6.1 選擇循環(huán)類型,循環(huán)類型:大多數(shù)語言中你只能用到少數(shù)的幾種循環(huán) 計數(shù)循環(huán),執(zhí)行的次數(shù)是固定的 條件循環(huán),預(yù)先不知道會運行多少次,他會在每次迭代時檢查。 死循環(huán),一旦啟動就一直執(zhí)行下去,知道死亡,你可能在心臟起搏器等嵌入式系統(tǒng)能找到。 迭代循環(huán),對容器類里的每個元素都執(zhí)行一次操作比如foreach 。,6.1 選擇循環(huán)類型,什么時候用while循環(huán) 如果你不知道循環(huán)的次數(shù),那么用while While也可以loop-with-exit循環(huán)(帶退出的的循環(huán)) while(true) a++; if (符合退出條件) b
19、reak; ,6.1 選擇循環(huán)類型,什么時候用for循環(huán) 循環(huán)確切次數(shù) 若是有中間中斷的情況,或是靠條件退出,用while替代 什么時候用foreach循環(huán) Foreach循環(huán)適用于對數(shù)組或者其他容器的各項元素進行操作,比如我們會使用foreach循環(huán)list中的數(shù)據(jù) Foreach(對象 in list對象) ,2 循環(huán)控制,循環(huán)易犯的錯誤:忽略了與循環(huán)有關(guān)的變量或累加器初始化、不正確的嵌套、不正確的循環(huán)中斷、忘記給循環(huán)變量一個增量或給錯了增量、用不正確的循環(huán)指標(biāo)訪問數(shù)組元素。 while ( !inputFile.EndOfFile() !inputFile.EndOfFile();r
20、ecordCount++ ) inputFile.GetRecord(); recordCount++并不是控制循環(huán)的,控制循環(huán)結(jié)束的是inputFile.GetRecord();,6.2 循環(huán)控制,正確的使用方法 recordCount = 0; for ( inputFile.MoveToStart(); !inputFile.EndOfFile(); inputFile.GetRecord() ) recordCount++; inputFile.MoveToStart();對循環(huán)進行初始化, inputFile.EndOfFile(); 檢測循環(huán)是否已經(jīng)終止, inputFile.Ge
21、tRecord() 則是把循環(huán)推向終止,while做更清晰 inputFile.MoveToStart(); recordCount = 0; while ( !inputFile.EndOfFile() ) inputFile.GetRecord(); recordCount++; ,6.2 循環(huán)控制,處理循環(huán)體的注意 用 括起循環(huán); 將循環(huán)管理(如i++)放在循環(huán)頭或尾部 每個循環(huán)只做一件事 避免空循環(huán); while ( ( inputChar = cin.get() ) != n ) ; 這里例子產(chǎn)生空循環(huán)的原因是因為while表達(dá)式包含了兩項操作,循環(huán)工作和判斷是否終止的操作,下面的重
22、寫更加清晰 do inputChar = cin.get(); while ( inputChar != n );,6.2 循環(huán)控制,退出循環(huán)的注意 確保循環(huán)能結(jié)束,這是基本要求可以模擬設(shè)想一下。 讓循環(huán)的終止條件看起來更明顯,大概是說不要多出設(shè)置循環(huán)的退出條件。 不要隨意改變for的循環(huán)計數(shù)器,使其提前終止,6.2 循環(huán)控制,提前退出循環(huán)小心使用break和continue 考慮用break,而不用boolean flag 不要使過多的break過于分散在循環(huán)中 用continue在循環(huán)頭部測試,一種好的方法是,在循環(huán)開始初做完條件判斷后讓代碼越過剩下的循環(huán)體繼續(xù)運行。,如果在循環(huán)中要閱讀記錄并且要忽略掉一種記錄,那么可以這么判斷,6.2 循環(huán)控制,循環(huán)要多長? 最好短的一下能看完 限制在3層嵌套 把循環(huán)內(nèi)過長的部分封裝在函數(shù)內(nèi) 長的循環(huán)一定要寫注釋 寫循環(huán)簡單的方法從內(nèi)到外 從最本質(zhì)的工作寫起,然后加上外面的控制條件,,Thats all! Thank you!,
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Storytime (2)
- 【四清導(dǎo)航】秋八年級數(shù)學(xué)上冊 3.3 一元一次不等式(第3課時)課件 (新版)浙教版
- 海淀區(qū)域P4P實操診斷課件
- 三年級記事作文指導(dǎo)
- 醫(yī)院內(nèi)感染的預(yù)防和控制
- 機械設(shè)計第十章習(xí)題
- 華泰汽車“全心服務(wù)_貼心關(guān)懷”管理知識分析方案
- Unit 11 Lesson 2 What's the matter 課件 1
- 創(chuàng)業(yè)大賽設(shè)計中財務(wù)分析方法與技巧
- 從現(xiàn)在開始課件 (4)(精品)
- 蛋白質(zhì)促降解與氨基酸代謝
- (精品)電視原理第1章1
- 術(shù)中病情觀察小講課
- 日系汽車研發(fā)質(zhì)量管控
- 6Sigma的管理理論(ppt 30頁)