版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
微軟開發(fā)制勝策略
——微軟程序員13條制勝法則黃雪斌微軟全球技術(shù)中心2023/7/261微軟高級開發(fā)管理峰會主要內(nèi)容微軟開發(fā)過程概述微軟程序員13條制勝法則編寫優(yōu)質(zhì)代碼——四大法則測試代碼,安身立命之本——四大法則千錘百煉,不敗金身——五大法則Q&A2023/7/262微軟高級開發(fā)管理峰會編寫優(yōu)質(zhì)代碼統(tǒng)一代碼風(fēng)格避免冗長代碼降低代碼間耦合減少冗余代碼2023/7/263微軟高級開發(fā)管理峰會法則1:統(tǒng)一代碼風(fēng)格確定統(tǒng)一的編碼風(fēng)格添加注釋起個好名字讓一切井井有條2023/7/264微軟高級開發(fā)管理峰會代碼風(fēng)格一致(CodeStyle)========publicclassBugSystem{ //更多的代碼}========for(inti=0;i<array.length;i++){ if(array[i]<0) { array[i]=-array[i]; }//endif}//endfor========publicclassBugSystem{ //更多的代碼}========for(inti=0;i<array.length;i++) if(array[i]<0) array[i]=-array[i];2023/7/265微軟高級開發(fā)管理峰會代碼風(fēng)格一致(續(xù))代碼易讀,易理解每個開發(fā)人員可以讀懂其他人的代碼產(chǎn)品中所有的代碼需遵循統(tǒng)一的標(biāo)準(zhǔn)指定統(tǒng)一編碼風(fēng)格文檔重要的在于讓每個開發(fā)人員都遵守將不符合規(guī)范的代碼當(dāng)作錯誤處理參考:msdn.microsoft/library/default.asp?url=/library/en-us/cpgenref/html/cpconnetframeworkdesignguidelines.aspgotdotnet/team/vb/VBSampleGuidelines.htmicsharpcode/TechNotes/SharpDevelopCodingStyle.pdf2023/7/266微軟高級開發(fā)管理峰會添加注釋//根據(jù)bugID獲取Bug//在bugHashTable中,Bug作為Object存儲,需要進(jìn)行類型轉(zhuǎn)換BugcurrentBug=(Bug)bugHashTable[bugID];//如果該Bug處于Active狀態(tài),并且Bug的激活時間達(dá)到Old的時//間,則將該Bug的Priority設(shè)置為URGENT。//參見FunctionSpec第34頁第二段的規(guī)則5if(currentBug.isActive()&¤tBug.age>BugAge.Old){ currentBug.setPriority(BugPriority.URGENT);}2023/7/267微軟高級開發(fā)管理峰會添加注釋(續(xù))添加注釋的目的使代碼易讀、易寫、易維護(hù)如何添加注釋代碼、數(shù)據(jù)、算法的解釋做標(biāo)記(時間、所做的改動等)標(biāo)識代碼的功能和目的代碼如何調(diào)用避免對顯而易見的內(nèi)容進(jìn)行注釋添加大段注釋注釋的拼寫錯誤例子VS.NET中自帶的Duwamish的例子2023/7/268微軟高級開發(fā)管理峰會起個好名字if(b1.grd()<ba.gt()){ bl_sys.rem(b1);}else{ bl_sys.rad(b1);}2023/7/269微軟高級開發(fā)管理峰會起個好名字(續(xù))if(bug1.getReactivateDate()<BugAge.getToday()){ bugAlertSystem.removeBug(bug1);}else{ bugAlertSystem.resetActivateDate(bug1);}2023/7/2610微軟高級開發(fā)管理峰會起個好名字(續(xù))//根據(jù)FunctionSpec的規(guī)則,如果Bug被重新激活,需要發(fā)送一份alert//email.重置BugAlertSystem中今天重新激活的Bug的激活日期,以便//統(tǒng)一發(fā)送alertemail.if(bug1.getReactivateDate()<BugAge.getToday()){ //Bug不是今天重新激活的,將該Bug從AlertSystem中移走 bugAlertSystem.removeBug(bug1);}else{ //Bug今天重新被激活,重置bug1在AlertSystem中的激活日期 bugAlertSystem.resetActivateDate(bug1);}2023/7/2611微軟高級開發(fā)管理峰會起個好名字(續(xù))大小寫問題PascalCase:BackColorCamelCase:backColorUpperCase:System.Web.UI避免混淆intmyNumber;intMyNumber;使用縮寫準(zhǔn)則GetWindowvs.GetWin首字母縮寫避免使用不被廣泛接受的首字母縮寫IOvs.InputOut;OLAPvs.On-lineAnalyticalProcessing詞語的選擇2023/7/2612微軟高級開發(fā)管理峰會起個好名字(續(xù))名字空間、類、接口、方法、參數(shù)的命名名字空間:CompanyName.TechnologyName[.Feature][.Design]類:使用名詞、不要使用前綴、不要使用“_” FileStream、ApplicationException接口:使用名詞或形容詞、加前綴“I”、不要使用“_” IServiceProvider、IFormatable方法:使用動詞 RemoveAll()、GetCharArray()
參數(shù):camelCase、“見文知義” TypeGetType(stringtypeName)/library/default.asp?url=/library/en-us/cpgenref/html/cpconnamingguidelines.asp=/library/en-us/cpgenref/html/cpconnamingguidelines.asp2023/7/2613微軟高級開發(fā)管理峰會讓一切井井有條類中各個方法的次序根據(jù)public,protected,private分組每組中再根據(jù)各方法直接關(guān)系細(xì)分openConnection()sendMessage()closeConnection()其他以首字母為序VS.NET中使用#region/#endregion進(jìn)行分組2023/7/2614微軟高級開發(fā)管理峰會讓一切井井有條(續(xù))提醒自己未完成的任務(wù)publicclassTransmitter{ stringmyDestination; publicTransmitter(stringaDestination) { myDestination=aDestination; } publicvoidtransmit(stringaMessage) { openConnection(); sendMessage(aMessage); closeConnection(); }
privatevoidopenConnection() { //ToDo實(shí)現(xiàn)openConnection() } privatevoidsendMessage(stringaMessage) { //ToDo實(shí)現(xiàn)openConnection() }
privatevoidcloseConnection() { //ToDo實(shí)現(xiàn)closeConnection() }
}2023/7/2615微軟高級開發(fā)管理峰會法則2:避免冗長代碼一個method多長合適?曾經(jīng)看過1400行的一個method1986年對IBMOS/360的統(tǒng)計(jì)結(jié)果:絕大多數(shù)的錯誤出在大于500行的函數(shù)中1991年對148,000行代碼的統(tǒng)計(jì)結(jié)果,在大于143行的函數(shù)中修復(fù)一個Bug需要多花費(fèi)2.4倍的代價(jià)專家的建議不要超過一屏MethodCohension2023/7/2616微軟高級開發(fā)管理峰會MethodCohesionpublicvoidprocess(string[]words){ //Loopthroughthearrayofstrings for(inti=0;i<words.Length;i++){ stringargument=""; //Reversethecharactersineachstring for(intj=words[i].Length;j>0;j--){ argument+=words[i].Substring(j-1,1); } Console.WriteLine(argument); } //Testfortwoparticularstrings if(words.Length==2){ if(words[0].ToLower().Equals(“coding")&&words[1].ToLower().Equals(“guru")){ Console.WriteLine(“Admire…"); } }}2023/7/2617微軟高級開發(fā)管理峰會MethodCohesion(續(xù))privatestringreverseCharacters(stringforward){ stringreverse=""; for(intj=forward.Length;j>0;j--){ reverse+=forward.Substring(j-1,1); } returnreverse;}privateboolisCodingGuru(string[]names){ boolIsGuru=false; if(names.Length==2){ if(names[0].ToLower().Equals(“coding")&&names[1].ToLower().Equals(“guru")){ Console.WriteLine(“Admire…"); } }}2023/7/2618微軟高級開發(fā)管理峰會MethodCohesion(續(xù))publicvoidprocess(string[]words){ for(inti=0;i<words.Length;i++){ Console.WriteLine(reverseCharacters(words[i])); } if(isCodingGuru(words)){ Console.WriteLine(“Admire…"); }}2023/7/2619微軟高級開發(fā)管理峰會法則3:降低代碼間耦合耦合無處不在整體系統(tǒng)的構(gòu)成依靠耦合松耦合和緊耦合避免緊耦合修改一處代碼不會引起更多的變動便于代碼重用、維護(hù)和擴(kuò)充類之間的耦合Identity耦合,Representational耦合2023/7/2620微軟高級開發(fā)管理峰會法則3:降低代碼間耦合publicclassBookShelf{ //We'lluseanArrayListtostoreourBooks ArrayListmyBookList=newArrayList(); //MethodtoaddaBooktotheinternalArrayList publicvoidaddBook(BookaBook) { myBookList.Add(aBook); } //MethodtoreturnaniteratorofalltheBooksheld publicIEnumeratorgetBooks() { returnmyBookList.GetEnumerator(); }}2023/7/2621微軟高級開發(fā)管理峰會法則3:降低代碼間耦合(續(xù))publicclassBook{ //RepresentsthebehaviourBookisdesignedtodeliver publicvoidBookyBehavior() { Console.WriteLine("JustbeingaBook..."); } //Book,responsibleforitself,knowshowtostoreitself publicvoidstoreSelf(BookShelfwc) { wc.addBook(this); }}2023/7/2622微軟高級開發(fā)管理峰會法則3:降低代碼間耦合(續(xù))publicclassBookClient{ publicstaticvoidmain(String[]args) { //MaketheShelf BookShelfmyBookShelf=newBookShelf(); //Loop10times for(inti=0;i<10;i++) { //MakeanewBook,andhaveitstoreitselfintheShelf newBook().storeSelf(myBookShelf); } }}2023/7/2623微軟高級開發(fā)管理峰會法則3:降低代碼間耦合(續(xù))耦合關(guān)系表ClassCoupletoTypeBookBookShelfIdentity,RepresentationalBookShelfBookIdentityBookClientBookIdentity,RepresentationalBookClientBookShelfIdentity2023/7/2624微軟高級開發(fā)管理峰會法則3:降低代碼間耦合(續(xù))publicclassBookShelf{ //We'lluseanArrayListtostoreourBooks ArrayListmyBookList=newArrayList(); //MethodtoaddaBooktotheinternalArrayList publicvoidaddBook(BookaBook) { myBookList.Add(aBook); } //MethodtoreturnaniteratorofalltheBooksheld publicIEnumeratorgetBooks() { returnmyBookList.GetEnumerator(); }}2023/7/2625微軟高級開發(fā)管理峰會法則3:降低代碼間耦合(續(xù))publicclassBook{ publicvoidBookyBehavior() { Console.WriteLine("JustbeingaBook..."); }}publicclassBookClient{ publicstaticvoidmain(String[]args) { BookShelfmyBookShelf=newBookShelf(); for(inti=0;i<10;i++) { myBookShelf.addBook(newBook()); } }}2023/7/2626微軟高級開發(fā)管理峰會法則3:降低代碼間耦合(續(xù))耦合關(guān)系表ClassCoupletoTypeBookBookShelfNoneBookShelfBookIdentityBookClientBookIdentityBookClientBookShelfIdentity,Representational2023/7/2627微軟高級開發(fā)管理峰會法則4:減少冗余代碼千年蟲問題簡單問題不簡單如何減少冗余避免HardCoding使用Config文件使用常量、枚舉類型使用抽象類重構(gòu)重用代碼2023/7/2628微軟高級開發(fā)管理峰會小結(jié):編寫優(yōu)質(zhì)代碼統(tǒng)一代碼風(fēng)格避免冗長代碼降低代碼間耦合減少冗余代碼2023/7/2629微軟高級開發(fā)管理峰會測試代碼,安家立命之本Debugvs.Trace活用斷言(Assert)異常處理編寫UnitTest2023/7/2630微軟高級開發(fā)管理峰會法則5:Debugvs.TraceDebugvs.ReleaseDebugvs.TraceSystem.Diagnostics名字空間包含了Debug類和Trace類建議使用Debug.Assert和Trace.Write在.NET中使用Trace.ListenerDemo在.NET中使用Trace.SwitchDemo2023/7/2631微軟高級開發(fā)管理峰會法則6:活用斷言(Assert)不要有任何假設(shè)DefensiveProgramming大多數(shù)錯誤出在代碼之間的調(diào)用上使用斷言調(diào)用參數(shù)的檢驗(yàn)返回值的檢驗(yàn)數(shù)據(jù)有效性檢驗(yàn)算法有效性檢驗(yàn)2023/7/2632微軟高級開發(fā)管理峰會調(diào)用參數(shù)的驗(yàn)證publicboolFindCustomer(intcustomerID){ Debug.Assert(customerID>0,"FindCustomer出錯","customerID應(yīng)該大于0"); //Morecode... returntrue;}2023/7/2633微軟高級開發(fā)管理峰會返回值的驗(yàn)證if(SetCustomerValid(customerID)){Debug.Assert(CustomerIsValid(customerID));UserCustomer(customerID);}else{Debug.Assert(!CustomerIsValid(customerID));ReleaseCustomer(customerID);}2023/7/2634微軟高級開發(fā)管理峰會數(shù)據(jù)有效性驗(yàn)證[Conditional("DEBUG")]privatevoidBugValidate(BugcurrentBug){ Debug.Assert(currentBug.BugID>0,“測試Bug有效性”,“BugID應(yīng)該大于0"); Debug.Assert(currentBug.Status!=null,“測試Bug有效性”,“Bug狀態(tài)不能為空"); Debug.Assert(currentBug.Owner!=null,“測試Bug有效性”,“Bug負(fù)責(zé)人不能為空"); //Morehere.}publicboolBugOperation(BugcurrentBug){ //Morecode… BugValidate(currentBug); ResolveBug(currentBug); BugValidate(currentBug); //Morecode... returntrue;}2023/7/2635微軟高級開發(fā)管理峰會算法驗(yàn)證使用Debug代碼來驗(yàn)證代碼的正確性方法對初始狀態(tài)、中間狀態(tài)和最終結(jié)果使用斷言使用更簡單的算法對程序結(jié)果進(jìn)行確認(rèn)舉例排序算法中,排序結(jié)果的每一個值都大于等于前一個值壓縮算法中,壓縮文件解壓縮后和原文件匹配加密算法中,密文解密的結(jié)果應(yīng)該等于原文Demo2023/7/2636微軟高級開發(fā)管理峰會法則7:異常處理異常處理和Debug代碼的關(guān)系異常處理和返回值的關(guān)系編寫穩(wěn)定的應(yīng)用程序的關(guān)鍵增強(qiáng)了程序的可擴(kuò)展性AB擴(kuò)展到AIB錯誤的處理更加靈活A(yù)IJKB(A可以靈活的處理由B引起的錯誤)異常不容易被忽視2023/7/2637微軟高級開發(fā)管理峰會異常處理(續(xù))使用返回值判斷publicboolMethod(){Booleanresult=false;if(!OpenFile(…)){gotoEnd;}if(!ReadFile(…)){gotoEnd;}if(!CloseFile()){gotoEnd;}result=true;End:returnresult;}使用異常處理publicvoidMethod(){try{OpenFile(…);ReadBytes(…);CloseFile();}catch(FileIOException){//handlefailure}}2023/7/2638微軟高級開發(fā)管理峰會拋出異常根據(jù)method的功能,在需要的地方拋出異常所有的自定義異常類以Exception結(jié)尾自定義異常繼承System.ApplicationException,不要繼承System.ExceptionpublicclassFileNotFoundException:ApplicationException{}
提供詳細(xì)的異常信息(ExceptionMessage)不要在異常信息中提供敏感的安全內(nèi)容拋出最為合適的異常2023/7/2639微軟高級開發(fā)管理峰會拋出異常(續(xù))使用ExceptionBuilder方法classFile{ stringfileName; publicbyte[]Read(intbytes){ if(!ReadFile(handle,bytes)) { throwNewFileIOException(…); } } FileExceptionNewFileException(…){
stringdescription=//buildlocalizedstring returnnewFileException(description); }}2023/7/2640微軟高級開發(fā)管理峰會處理異常捕獲特定的異常不要把異?!俺缘簟眕ublicvoidMethod(){ try{ File.Open(…);
} catch(Exceptione){//所有的異常都被“吃掉”了… }}使用finally釋放資源publicvoidUpdateSet(){ FileStreamstream=null; try{ stream=newFileStream(“SomeFile.dat”,FileMode.Open); }finally{ if(stream!=null)stream.Close(); }}2023/7/2641微軟高級開發(fā)管理峰會處理異常(續(xù))恢復(fù)原來的狀態(tài)publicvoidDoSomething(FileStreamfs){ Int64pos=fs.Position; try{ //dosomereadingwithfs
} catch{ fs.Position=pos;//unwindonthefailure throw; //rethrow }}添加更加詳細(xì)的信息publicInt32GetInt(Int32[]array,Int32index){ try{ returnarray[index]; }catch(IndexOutOfRangeExceptione){ thrownewArgumentOutOfRangeException( “Parameterindexisoutofrange.”); }}2023/7/2642微軟高級開發(fā)管理峰會法則8:編寫UnitTest提倡先寫UnitTest后寫代碼測試先行保證程序員在開發(fā)前理解Spec確保UnitTest不會因?yàn)檫M(jìn)度壓力而取消先定功能,再定細(xì)節(jié)不是強(qiáng)制準(zhǔn)則如何寫UnitTest微軟內(nèi)部工具:TTest其他的.NETUniteTest工具:NUnit,dotNetUnit,HarnessIt,csUnitDemo2023/7/2643微軟高級開發(fā)管理峰會小結(jié):測試代碼,安家立命之本Debugvs.Trace活用斷言(Assert)異常處理編寫UnitTest2023/7/2644微軟高級開發(fā)管理峰會千錘百煉,不敗金身Verifier,一個都不放過安全至上性能與功能并進(jìn)代碼審核(CodeReview)及時修復(fù)Bug2023/7/2645微軟高級開發(fā)管理峰會法則9:使用Verifier工具——一個都不放過將警告等級設(shè)置為最高使用PC-lint來檢查C/C++代碼的潛在錯誤一個VS.NET的Verifier工具:FXCop獲得微軟內(nèi)部“BestPractice”大獎按照.NETFrameworkDesignGuideline對.NETAssembly進(jìn)行檢查包括安全、命名、性能等170多條Rulegotdotnet/team/libraries/FxCopInstall.EXEDemo2023/7/2646微軟高級開發(fā)管理峰會法則10:安全至上了解黑客如何攻擊產(chǎn)品安全性是微軟產(chǎn)品的最大挑戰(zhàn)讓你的產(chǎn)品防御攻擊將安全性看作需要實(shí)現(xiàn)的功能之一使
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度車險(xiǎn)人傷調(diào)解與保險(xiǎn)理賠效率提升協(xié)議
- 二零二五年度房地產(chǎn)合伙退出協(xié)議書
- 2025年度銷售人員年度考核合同范本
- 二零二五年度跨境電商平臺貨款結(jié)算與支付結(jié)算安全合同
- 二零二五年度籃球用品店場地租賃服務(wù)協(xié)議
- 中山酒店綠化景觀施工方案
- 紹興可移動民宿施工方案
- 二零二五版煤炭行業(yè)環(huán)保治理與污染修復(fù)合同4篇
- 巫山木紋格柵吊頂施工方案
- 建設(shè)工程清包合同范本
- 藝術(shù)哲學(xué):美是如何誕生的學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 北京海淀區(qū)2025屆高三下第一次模擬語文試題含解析
- 量子醫(yī)學(xué)治療學(xué)行業(yè)投資機(jī)會分析與策略研究報(bào)告
- 碳纖維增強(qiáng)復(fù)合材料在海洋工程中的應(yīng)用情況
- 多重耐藥菌病人的管理-(1)課件
- (高清版)TDT 1056-2019 縣級國土資源調(diào)查生產(chǎn)成本定額
- 環(huán)境監(jiān)測對環(huán)境保護(hù)的意義
- 2023年數(shù)學(xué)競賽AMC8試卷(含答案)
- 神經(jīng)外科課件:神經(jīng)外科急重癥
- 2023年十天突破公務(wù)員面試
- 《瘋狂動物城》中英文對照(全本臺詞)
評論
0/150
提交評論