微軟程序開發(fā)制勝策略微軟程序員13條制勝法則_第1頁
微軟程序開發(fā)制勝策略微軟程序員13條制勝法則_第2頁
微軟程序開發(fā)制勝策略微軟程序員13條制勝法則_第3頁
微軟程序開發(fā)制勝策略微軟程序員13條制勝法則_第4頁
微軟程序開發(fā)制勝策略微軟程序員13條制勝法則_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

微軟開發(fā)制勝戰(zhàn)略

——微軟程序員13條制勝法那么黃雪斌微軟全球技術(shù)中心主要內(nèi)容微軟開發(fā)過程概述微軟程序員13條制勝法那么編寫優(yōu)質(zhì)代碼——四大法那么測試代碼,安身立命之本——四大法那么千錘百煉,不敗金身——五大法那么Q&A2024/1/262微軟高級開發(fā)管理峰會編寫優(yōu)質(zhì)代碼一致代碼風格防止冗長代碼降低代碼間耦合減少冗余代碼2024/1/263微軟高級開發(fā)管理峰會法那么1:一致代碼風格確定一致的編碼風格添加注釋起個好名字讓一切井井有條2024/1/264微軟高級開發(fā)管理峰會代碼風格一致〔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];2024/1/265微軟高級開發(fā)管理峰會代碼風格一致〔續(xù)〕代碼易讀,易了解每個開發(fā)人員可以讀懂其他人的代碼產(chǎn)品中一切的代碼需遵照一致的規(guī)范指定一致編碼風格文檔重要的在于讓每個開發(fā)人員都遵守將不符合規(guī)范的代碼當作錯誤處置參考:msdn.microsoft/library/default.asp?url=/library/en-us/cpgenref/html/cpconnetframeworkdesignguidelines.aspgotdotnet/team/vb/VBSampleGuidelines.htm/TechNotes/SharpDevelopCodingStyle.pdf2024/1/266微軟高級開發(fā)管理峰會添加注釋//根據(jù)bugID獲取Bug//在bugHashTable中,Bug作為Object存儲,需求進展類型轉(zhuǎn)換BugcurrentBug=(Bug)bugHashTable[bugID];//假設(shè)該Bug處于Active形狀,并且Bug的激活時間到達Old的時//間,那么將該Bug的Priority設(shè)置為URGENT。//參見FunctionSpec第34頁第二段的規(guī)那么5if(currentBug.isActive()&¤tBug.age>BugAge.Old){ currentBug.setPriority(BugPriority.URGENT);}2024/1/267微軟高級開發(fā)管理峰會添加注釋〔續(xù)〕添加注釋的目的使代碼易讀、易寫、易維護如何添加注釋代碼、數(shù)據(jù)、算法的解釋做標志〔時間、所做的改動等〕標識代碼的功能和目的代碼如何調(diào)用防止對顯而易見的內(nèi)容進展注釋添加大段注釋注釋的拼寫錯誤例子VS.NET中自帶的Duwamish的例子2024/1/268微軟高級開發(fā)管理峰會起個好名字if(b1.grd()<ba.gt()){ bl_sys.rem(b1);}else{ bl_sys.rad(b1);}2024/1/269微軟高級開發(fā)管理峰會起個好名字〔續(xù)〕if(bug1.getReactivateDate()<BugAge.getToday()){ bugAlertSystem.removeBug(bug1);}else{ bugAlertSystem.resetActivateDate(bug1);}2024/1/2610微軟高級開發(fā)管理峰會起個好名字〔續(xù)〕//根據(jù)FunctionSpec的規(guī)那么,假設(shè)Bug被重新激活,需求發(fā)送一份alert//.重置BugAlertSystem中今天重新激活的Bug的激活日期,以便//一致發(fā)送alert.if(bug1.getReactivateDate()<BugAge.getToday()){ //Bug不是今天重新激活的,將該Bug從AlertSystem中移走 bugAlertSystem.removeBug(bug1);}else{ //Bug今天重新被激活,重置bug1在AlertSystem中的激活日期 bugAlertSystem.resetActivateDate(bug1);}2024/1/2611微軟高級開發(fā)管理峰會起個好名字〔續(xù)〕大小寫問題PascalCase:BackColorCamelCase:backColorUpperCase:System.Web.UI防止混淆intmyNumber;intMyNumber;運用縮寫準那么GetWindowvs.GetWin首字母縮寫防止運用不被廣泛接受的首字母縮寫IOvs.InputOut;OLAPvs.On-lineAnalyticalProcessing詞語的選擇2024/1/2612微軟高級開發(fā)管理峰會起個好名字〔續(xù)〕名字空間、類、接口、方法、參數(shù)的命名名字空間:CompanyName.TechnologyName[.Feature][.Design]類:運用名詞、不要運用前綴、不要運用“_〞 FileStream、ApplicationException接口:運用名詞或描畫詞、加前綴“I〞、不要運用“_〞 IServiceProvider、IFormatable方法:運用動詞 RemoveAll()、GetCharArray()參數(shù):camelCase、“見文知義〞 TypeGetType(stringtypeName)msdn.microsoft/library/default.asp?url=/library/en-us/cpgenref/html/cpconnamingguidelines.asp2024/1/2613微軟高級開發(fā)管理峰會讓一切井井有條類中各個方法的次序根據(jù)public,protected,private分組每組中再根據(jù)各方法直接關(guān)系細分openConnection()sendMessage()closeConnection()其他以首字母為序VS.NET中運用#region/#endregion進展分組2024/1/2614微軟高級開發(fā)管理峰會讓一切井井有條〔續(xù)〕提示本人未完成的義務(wù)publicclassTransmitter{ stringmyDestination; publicTransmitter(stringaDestination) { myDestination=aDestination; } publicvoidtransmit(stringaMessage) { openConnection(); sendMessage(aMessage); closeConnection(); }

privatevoidopenConnection() { //ToDo實現(xiàn)openConnection() } privatevoidsendMessage(stringaMessage) { //ToDo實現(xiàn)openConnection() }

privatevoidcloseConnection() { //ToDo實現(xiàn)closeConnection() }

}2024/1/2615微軟高級開發(fā)管理峰會法那么2:防止冗長代碼一個method多長適宜?曾經(jīng)看過1400行的一個method1986年對IBMOS/360的統(tǒng)計結(jié)果:絕大多數(shù)的錯誤出在大于500行的函數(shù)中1991年對148,000行代碼的統(tǒng)計結(jié)果,在大于143行的函數(shù)中修復(fù)一個Bug需求多破費2.4倍的代價專家的建議不要超越一屏MethodCohension2024/1/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…"); } }}2024/1/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…"); } }}2024/1/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…"); }}2024/1/2619微軟高級開發(fā)管理峰會法那么3:降低代碼間耦合耦合無處不在整體系統(tǒng)的構(gòu)成依托耦合松耦合和緊耦合防止緊耦合修正一處代碼不會引起更多的變動便于代碼重用、維護和擴展類之間的耦合Identity耦合,Representational耦合2024/1/2620微軟高級開發(fā)管理峰會法那么3:降低代碼間耦合publicclassBookShelf{ //We'lluseanArrayListtostoreourBooks ArrayListmyBookList=newArrayList(); //MethodtoaddaBooktotheinternalArrayList publicvoidaddBook(BookaBook) { myBookList.Add(aBook); } //MethodtoreturnaniteratorofalltheBooksheld publicIEnumeratorgetBooks() { returnmyBookList.GetEnumerator(); }}2024/1/2621微軟高級開發(fā)管理峰會法那么3:降低代碼間耦合〔續(xù)〕publicclassBook{ //RepresentsthebehaviourBookisdesignedtodeliver publicvoidBookyBehavior() { Console.WriteLine("JustbeingaBook..."); } //Book,responsibleforitself,knowshowtostoreitself publicvoidstoreSelf(BookShelfwc) { wc.addBook(this); }}2024/1/2622微軟高級開發(fā)管理峰會法那么3:降低代碼間耦合〔續(xù)〕publicclassBookClient{ publicstaticvoidmain(String[]args) { //MaketheShelf BookShelfmyBookShelf=newBookShelf(); //Loop10times for(inti=0;i<10;i++) { //MakeanewBook,andhaveitstoreitselfintheShelf newBook().storeSelf(myBookShelf); } }}2024/1/2623微軟高級開發(fā)管理峰會法那么3:降低代碼間耦合〔續(xù)〕耦合關(guān)系表ClassCoupletoTypeBookBookShelfIdentity,RepresentationalBookShelfBookIdentityBookClientBookIdentity,RepresentationalBookClientBookShelfIdentity2024/1/2624微軟高級開發(fā)管理峰會法那么3:降低代碼間耦合〔續(xù)〕publicclassBookShelf{ //We'lluseanArrayListtostoreourBooks ArrayListmyBookList=newArrayList(); //MethodtoaddaBooktotheinternalArrayList publicvoidaddBook(BookaBook) { myBookList.Add(aBook); } //MethodtoreturnaniteratorofalltheBooksheld publicIEnumeratorgetBooks() { returnmyBookList.GetEnumerator(); }}2024/1/2625微軟高級開發(fā)管理峰會法那么3:降低代碼間耦合〔續(xù)〕publicclassBook{ publicvoidBookyBehavior() { Console.WriteLine("JustbeingaBook..."); }}publicclassBookClient{ publicstaticvoidmain(String[]args) { BookShelfmyBookShelf=newBookShelf(); for(inti=0;i<10;i++) { myBookShelf.addBook(newBook()); } }}2024/1/2626微軟高級開發(fā)管理峰會法那么3:降低代碼間耦合〔續(xù)〕耦合關(guān)系表ClassCoupletoTypeBookBookShelfNoneBookShelfBookIdentityBookClientBookIdentityBookClientBookShelfIdentity,Representational2024/1/2627微軟高級開發(fā)管理峰會法那么4:減少冗余代碼千年蟲問題簡單問題不簡單如何減少冗余防止HardCoding運用Config文件運用常量、枚舉類型運用籠統(tǒng)類重構(gòu)重用代碼2024/1/2628微軟高級開發(fā)管理峰會小結(jié):編寫優(yōu)質(zhì)代碼一致代碼風格防止冗長代碼降低代碼間耦合減少冗余代碼2024/1/2629微軟高級開發(fā)管理峰會測試代碼,安家立命之本Debugvs.Trace活用斷言〔Assert〕異常處置編寫UnitTest2024/1/2630微軟高級開發(fā)管理峰會法那么5:Debugvs.TraceDebugvs.ReleaseDebugvs.TraceSystem.Diagnostics名字空間包含了Debug類和Trace類建議運用Debug.Assert和Trace.Write在.NET中運用Trace.ListenerDemo在.NET中運用Trace.SwitchDemo2024/1/2631微軟高級開發(fā)管理峰會法那么6:活用斷言〔Assert〕不要有任何假設(shè)DefensiveProgramming大多數(shù)錯誤出在代碼之間的調(diào)用上運用斷言調(diào)用參數(shù)的檢驗前往值的檢驗數(shù)據(jù)有效性檢驗算法有效性檢驗2024/1/2632微軟高級開發(fā)管理峰會調(diào)用參數(shù)的驗證publicboolFindCustomer(intcustomerID){ Debug.Assert(customerID>0,"FindCustomer出錯","customerID應(yīng)該大于0"); //Morecode... returntrue;}2024/1/2633微軟高級開發(fā)管理峰會前往值的驗證if(SetCustomerValid(customerID)){Debug.Assert(CustomerIsValid(customerID));UserCustomer(customerID);}else{Debug.Assert(!CustomerIsValid(customerID));ReleaseCustomer(customerID);}2024/1/2634微軟高級開發(fā)管理峰會數(shù)據(jù)有效性驗證[Conditional("DEBUG")]privatevoidBugValidate(BugcurrentBug){ Debug.Assert(currentBug.BugID>0,“測試Bug有效性〞,“BugID應(yīng)該大于0"); Debug.Assert(currentBug.Status!=null,“測試Bug有效性〞,“Bug形狀不能為空"); Debug.Assert(currentBug.Owner!=null,“測試Bug有效性〞,“Bug擔任人不能為空"); //Morehere.}publicboolBugOperation(BugcurrentBug){ //Morecode… BugValidate(currentBug); ResolveBug(currentBug); BugValidate(currentBug); //Morecode... returntrue;}2024/1/2635微軟高級開發(fā)管理峰會算法驗證運用Debug代碼來驗證代碼的正確性方法對初始形狀、中間形狀和最終結(jié)果運用斷言運用更簡單的算法對程序結(jié)果進展確認舉例排序算法中,排序結(jié)果的每一個值都大于等于前一個值緊縮算法中,緊縮文件解緊縮后和原文件匹配加密算法中,密文解密的結(jié)果應(yīng)該等于原文Demo2024/1/2636微軟高級開發(fā)管理峰會法那么7:異常處置異常處置和Debug代碼的關(guān)系異常處置和前往值的關(guān)系編寫穩(wěn)定的運用程序的關(guān)鍵加強了程序的可擴展性AB擴展到AIB錯誤的處置更加靈敏AIJKB〔A可以靈敏的處置由B引起的錯誤〕異常不容易被忽視2024/1/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}}2024/1/2638微軟高級開發(fā)管理峰會拋出異常根據(jù)method的功能,在需求的地方拋出異常一切的自定義異常類以Exception結(jié)尾自定義異常承繼System.ApplicationException,不要承繼System.ExceptionpublicclassFileNotFoundException:ApplicationException{} 提供詳細的異常信息〔ExceptionMessage〕不要在異常信息中提供敏感的平安內(nèi)容拋出最為適宜的異常2024/1/2639微軟高級開發(fā)管理峰會拋出異?!怖m(xù)〕運用ExceptionBuilder方法classFile{ stringfileName; publicbyte[]Read(intbytes){ if(!ReadFile(handle,bytes)) { throwNewFileIOException(…); } } FileExceptionNewFileException(…){ stringdescription=//buildlocalizedstring returnnewFileException(description); }}2024/1/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(); }}2024/1/2641微軟高級開發(fā)管理峰會處置異?!怖m(xù)〕恢復(fù)原來的形狀publicvoidDoSomething(FileStreamfs){ Int64pos=fs.Position; try{ //dosomereadingwithfs } catch{ fs.Position=pos;//unwindonthefailure throw; //rethrow }}添加更加詳細的信息publicInt32GetInt(Int32[]array,Int32index){ try{ returnarray[index]; }catch(IndexOutOfRangeExceptione){ thrownewArgumentOutOfRangeException( “Parameterindexisoutofrange.〞); }}2024/1/2642微軟高級開發(fā)管理峰會法那么8:編寫UnitTest提倡先寫UnitTest后寫代碼測試先行保證程序員在開發(fā)前了解Spec確保UnitTest不會由于進度壓力而取消先定功能,再定細節(jié)不是強迫準那么如何寫UnitTest微軟內(nèi)部工具:TTest其他的.NETUniteTest工具:NUnit,dotNetUnit,HarnessIt,csUnitDemo2024/1/2643微軟高級開發(fā)管理峰會小結(jié):測試代碼,安家立命之本Debugvs.Trace活用斷言〔Assert〕異常處置編寫UnitTest2024/1/2644微軟高級開發(fā)管理峰會千錘百煉,不敗金身Verifier,一個都不放過平安至上性能與功能并進代碼審核〔CodeReview)及時修復(fù)Bug2024/1/2645微軟高級開發(fā)管理峰會法那么9:運用Verifier工具——一個都不放過將警告等級設(shè)置為最高運用PC-lint來檢查C/C++代碼的潛在錯誤一個VS.NET的Verifier工具:FXCop獲得微軟內(nèi)部“BestPractice〞大獎按照.NETFrameworkDesignGuideline對.NETAssembly進展檢查包括平安、命名、性能等170多條Rulegotdotnet/team/libraries/FxCopInstall.EXEDemo2024/1/2646微軟高級開

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論