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

下載本文檔

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

文檔簡介

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論