微软程序开发制胜策略微软程序员13条制胜法则_第1页
微软程序开发制胜策略微软程序员13条制胜法则_第2页
微软程序开发制胜策略微软程序员13条制胜法则_第3页
微软程序开发制胜策略微软程序员13条制胜法则_第4页
微软程序开发制胜策略微软程序员13条制胜法则_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微软开发制胜策略

——微软程序员13条制胜法则黄雪斌微软全球技术中心2022/12/281微软高级开发管理峰会主要内容微软开发过程概述微软程序员13条制胜法则编写优质代码——四大法则测试代码,安身立命之本——四大法则千锤百炼,不败金身——五大法则Q&A2022/12/282微软高级开发管理峰会编写优质代码统一代码风格避免冗长代码降低代码间耦合减少冗余代码2022/12/283微软高级开发管理峰会法则1:统一代码风格确定统一的编码风格添加注释起个好名字让一切井井有条2022/12/284微软高级开发管理峰会代码风格一致(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];2022/12/285微软高级开发管理峰会代码风格一致(续)代码易读,易理解每个开发人员可以读懂其他人的代码产品中所有的代码需遵循统一的标准指定统一编码风格文档重要的在于让每个开发人员都遵守将不符合规范的代码当作错误处理参考:/library/default.asp?url=/library/en-us/cpgenref/html/cpconnetframeworkdesignguidelines.asp/team/vb/VBSampleGuidelines.htmhttp:///TechNotes/SharpDevelopCodingStyle.pdf2022/12/286微软高级开发管理峰会添加注释//根据bugID获取Bug//在bugHashTable中,Bug作为Object存储,需要进行类型转换BugcurrentBug=(Bug)bugHashTable[bugID];//如果该Bug处于Active状态,并且Bug的激活时间达到Old的时//间,则将该Bug的Priority设置为URGENT。//参见FunctionSpec第34页第二段的规则5if(currentBug.isActive()&¤tBug.age>BugAge.Old){

currentBug.setPriority(BugPriority.URGENT);}2022/12/287微软高级开发管理峰会添加注释(续)添加注释的目的使代码易读、易写、易维护如何添加注释代码、数据、算法的解释做标记(时间、所做的改动等)标识代码的功能和目的代码如何调用避免对显而易见的内容进行注释添加大段注释注释的拼写错误例子VS.NET中自带的Duwamish的例子2022/12/288微软高级开发管理峰会起个好名字if(b1.grd()<ba.gt()){ bl_sys.rem(b1);}else{ bl_sys.rad(b1);}2022/12/289微软高级开发管理峰会起个好名字(续)if(bug1.getReactivateDate()<BugAge.getToday()){ bugAlertSystem.removeBug(bug1);}else{ bugAlertSystem.resetActivateDate(bug1);}2022/12/2810微软高级开发管理峰会起个好名字(续)//根据FunctionSpec的规则,如果Bug被重新激活,需要发送一份alert//email.重置BugAlertSystem中今天重新激活的Bug的激活日期,以便//统一发送alertemail.if(bug1.getReactivateDate()<BugAge.getToday()){ //Bug不是今天重新激活的,将该Bug从AlertSystem中移走 bugAlertSystem.removeBug(bug1);}else{ //Bug今天重新被激活,重置bug1在AlertSystem中的激活日期 bugAlertSystem.resetActivateDate(bug1);}2022/12/2811微软高级开发管理峰会起个好名字(续)大小写问题PascalCase:BackColorCamelCase:backColorUpperCase:System.Web.UI避免混淆int

myNumber;int

MyNumber;使用缩写准则GetWindowvs.GetWin首字母缩写避免使用不被广泛接受的首字母缩写IOvs.InputOut;OLAPvs.On-lineAnalyticalProcessing词语的选择2022/12/2812微软高级开发管理峰会起个好名字(续)名字空间、类、接口、方法、参数的命名名字空间:CompanyName.TechnologyName[.Feature][.Design]类:使用名词、不要使用前缀、不要使用“_”

FileStream、ApplicationException接口:使用名词或形容词、加前缀“I”、不要使用“_”

IServiceProvider、IFormatable

方法:使用动词

RemoveAll()、GetCharArray()

参数:camelCase、“见文知义” TypeGetType(string

typeName)http:///library/default.asp?url=/library/en-us/cpgenref/html/cpconnamingguidelines.asp2022/12/2813微软高级开发管理峰会让一切井井有条类中各个方法的次序根据public,protected,private分组每组中再根据各方法直接关系细分openConnection()sendMessage()closeConnection()其他以首字母为序VS.NET中使用#region/#endregion进行分组2022/12/2814微软高级开发管理峰会让一切井井有条(续)提醒自己未完成的任务publicclassTransmitter{ stringmyDestination; publicTransmitter(string

aDestination) {

myDestination=aDestination; } publicvoidtransmit(string

aMessage) {

openConnection();

sendMessage(aMessage);

closeConnection(); }

privatevoidopenConnection() { //ToDo

实现openConnection() } privatevoidsendMessage(string

aMessage) { //ToDo

实现openConnection() }

privatevoidcloseConnection() { //ToDo

实现closeConnection() }

}2022/12/2815微软高级开发管理峰会法则2:避免冗长代码一个method多长合适?曾经看过1400行的一个method1986年对IBMOS/360的统计结果:绝大多数的错误出在大于500行的函数中1991年对148,000行代码的统计结果,在大于143行的函数中修复一个Bug需要多花费2.4倍的代价专家的建议不要超过一屏MethodCohension2022/12/2816微软高级开发管理峰会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…"); } }}2022/12/2817微软高级开发管理峰会MethodCohesion(续)privatestringreverseCharacters(stringforward){ stringreverse=""; for(intj=forward.Length;j>0;j--){ reverse+=forward.Substring(j-1,1); } returnreverse;}privatebool

isCodingGuru(string[]names){

bool

IsGuru=false; if(names.Length==2){ if(names[0].ToLower().Equals(“coding")&&names[1].ToLower().Equals(“guru")){

Console.WriteLine(“Admire…"); } }}2022/12/2818微软高级开发管理峰会MethodCohesion(续)publicvoidprocess(string[]words){ for(inti=0;i<words.Length;i++){

Console.WriteLine(reverseCharacters(words[i])); } if(isCodingGuru(words)){

Console.WriteLine(“Admire…"); }}2022/12/2819微软高级开发管理峰会法则3:降低代码间耦合耦合无处不在整体系统的构成依靠耦合松耦合和紧耦合避免紧耦合修改一处代码不会引起更多的变动便于代码重用、维护和扩充类之间的耦合Identity耦合,Representational耦合2022/12/2820微软高级开发管理峰会法则3:降低代码间耦合publicclassBookShelf

{ //We'lluseanArrayListtostoreourBooks

ArrayList

myBookList=newArrayList(); //MethodtoaddaBooktotheinternalArrayList publicvoidaddBook(Book

aBook) {

myBookList.Add(aBook); } //MethodtoreturnaniteratorofalltheBooksheld publicIEnumerator

getBooks() { returnmyBookList.GetEnumerator(); }}2022/12/2821微软高级开发管理峰会法则3:降低代码间耦合(续)publicclassBook{ //RepresentsthebehaviourBookisdesignedtodeliver publicvoidBookyBehavior() {

Console.WriteLine("JustbeingaBook..."); } //Book,responsibleforitself,knowshowtostoreitself publicvoidstoreSelf(BookShelf

wc) {

wc.addBook(this); }}2022/12/2822微软高级开发管理峰会法则3:降低代码间耦合(续)publicclassBookClient{ publicstaticvoidmain(String[]args) { //MaketheShelf

BookShelf

myBookShelf=newBookShelf(); //Loop10times

for(inti=0;i<10;i++) { //MakeanewBook,andhaveitstoreitselfintheShelf newBook().storeSelf(myBookShelf); } }}2022/12/2823微软高级开发管理峰会法则3:降低代码间耦合(续)耦合关系表ClassCoupletoTypeBookBookShelf

Identity,RepresentationalBookShelf

BookIdentityBookClient

BookIdentity,RepresentationalBookClient

BookShelf

Identity2022/12/2824微软高级开发管理峰会法则3:降低代码间耦合(续)publicclassBookShelf

{ //We'lluseanArrayListtostoreourBooks

ArrayList

myBookList=newArrayList(); //MethodtoaddaBooktotheinternalArrayList publicvoidaddBook(Book

aBook) {

myBookList.Add(aBook); } //MethodtoreturnaniteratorofalltheBooksheld publicIEnumerator

getBooks() { returnmyBookList.GetEnumerator(); }}2022/12/2825微软高级开发管理峰会法则3:降低代码间耦合(续)publicclassBook{ publicvoidBookyBehavior() {

Console.WriteLine("JustbeingaBook..."); }}publicclassBookClient{ publicstaticvoidmain(String[]args) {

BookShelf

myBookShelf=newBookShelf();

for(inti=0;i<10;i++) {

myBookShelf.addBook(newBook()); } }}2022/12/2826微软高级开发管理峰会法则3:降低代码间耦合(续)耦合关系表ClassCoupletoTypeBookBookShelf

NoneBookShelf

BookIdentityBookClient

BookIdentityBookClient

BookShelf

Identity,Representational2022/12/2827微软高级开发管理峰会法则4:减少冗余代码千年虫问题简单问题不简单如何减少冗余避免HardCoding使用Config文件使用常量、枚举类型使用抽象类重构重用代码2022/12/2828微软高级开发管理峰会小结:编写优质代码统一代码风格避免冗长代码降低代码间耦合减少冗余代码2022/12/2829微软高级开发管理峰会测试代码,安家立命之本Debugvs.Trace活用断言(Assert)异常处理编写UnitTest2022/12/2830微软高级开发管理峰会法则5:Debugvs.TraceDebugvs.ReleaseDebugvs.TraceSystem.Diagnostics名字空间包含了Debug类和Trace类建议使用Debug.Assert和Trace.Write在.NET中使用Trace.ListenerDemo在.NET中使用Trace.SwitchDemo2022/12/2831微软高级开发管理峰会法则6:活用断言(Assert)不要有任何假设DefensiveProgramming大多数错误出在代码之间的调用上使用断言调用参数的检验返回值的检验数据有效性检验算法有效性检验2022/12/2832微软高级开发管理峰会调用参数的验证publicbool

FindCustomer(int

customerID){

Debug.Assert(customerID>0,"FindCustomer出错","customerID应该大于0"); //Morecode... returntrue;}2022/12/2833微软高级开发管理峰会返回值的验证if(SetCustomerValid(customerID)){Debug.Assert(CustomerIsValid(customerID));UserCustomer(customerID);}else{Debug.Assert(!CustomerIsValid(customerID));ReleaseCustomer(customerID);}2022/12/2834微软高级开发管理峰会数据有效性验证[Conditional("DEBUG")]privatevoidBugValidate(Bug

currentBug){

Debug.Assert(currentBug.BugID>0,“测试Bug有效性”,“BugID应该大于0");

Debug.Assert(currentBug.Status!=null,“测试Bug有效性”,“Bug状态不能为空");

Debug.Assert(currentBug.Owner!=null,“测试Bug有效性”,“Bug负责人不能为空"); //Morehere.}publicbool

BugOperation(BugcurrentBug){ //Morecode…

BugValidate(currentBug);

ResolveBug(currentBug);

BugValidate(currentBug); //Morecode... returntrue;}2022/12/2835微软高级开发管理峰会算法验证使用Debug代码来验证代码的正确性方法对初始状态、中间状态和最终结果使用断言使用更简单的算法对程序结果进行确认举例排序算法中,排序结果的每一个值都大于等于前一个值压缩算法中,压缩文件解压缩后和原文件匹配加密算法中,密文解密的结果应该等于原文Demo2022/12/2836微软高级开发管理峰会法则7:异常处理异常处理和Debug代码的关系异常处理和返回值的关系编写稳定的应用程序的关键增强了程序的可扩展性AB扩展到AIB错误的处理更加灵活AIJKB(A可以灵活的处理由B引起的错误)异常不容易被忽视2022/12/2837微软高级开发管理峰会异常处理(续)使用返回值判断publicboolMethod(){Booleanresult=false;

if(!OpenFile(…)){

gotoEnd;}

if(!ReadFile(…)){

gotoEnd;}

if(!CloseFile()){

gotoEnd;}result=true;End:returnresult;}使用异常处理publicvoidMethod(){try{

OpenFile(…);

ReadBytes(…);

CloseFile();}catch(FileIOException){//handlefailure}}2022/12/2838微软高级开发管理峰会抛出异常根据method的功能,在需要的地方抛出异常所有的自定义异常类以Exception结尾自定义异常继承System.ApplicationException,不要继承System.ExceptionpublicclassFileNotFoundException:ApplicationException{}

提供详细的异常信息(ExceptionMessage)不要在异常信息中提供敏感的安全内容抛出最为合适的异常2022/12/2839微软高级开发管理峰会抛出异常(续)使用ExceptionBuilder方法classFile{ stringfileName; publicbyte[]Read(intbytes){ if(!ReadFile(handle,bytes)) { throwNewFileIOException(…); } }

FileException

NewFileException(…){

stringdescription=//buildlocalizedstring returnnewFileException(description); }}2022/12/2840微软高级开发管理峰会处理异常捕获特定的异常不要把异常“吃掉”publicvoidMethod(){ try{

File.Open(…);

}

catch(Exceptione){//所有的异常都被“吃掉”了… }}使用finally释放资源publicvoidUpdateSet(){

FileStreamstream=null; try{ stream=newFileStream(“SomeFile.dat”,FileMode.Open); }finally{

if(stream!=null)stream.Close(); }}2022/12/2841微软高级开发管理峰会处理异常(续)恢复原来的状态publicvoidDoSomething(FileStream

fs){ Int64pos=fs.Position; try{ //dosomereadingwithfs

} catch{

fs.Position=pos;//unwindonthefailure throw; //rethrow }}添加更加详细的信息publicInt32GetInt(Int32[]array,Int32index){ try{ returnarray[index]; }catch(IndexOutOfRangeExceptione){ thrownewArgumentOutOfRangeException( “Parameterindexisoutofrange.”); }}2022/12/2842微软高级开发管理峰会法则8:编写UnitTest提倡先写UnitTest后写代码测试先行保证程序员在开发前理解Spec确保UnitTest不会因为进度压力而取消先定功能,再定细节不是强制准则如何写UnitTest微软内部工具:TTest其他的.NETUniteTest工具:NUnit,dotNetUnit,HarnessIt,csUnitDemo2022/12/2843微软高级开发管理峰会小结:测试代码,安家立命之本Debugvs.Trace活用断言(Assert)异常处理编写UnitTest2022/12/2844微软高级开发管理峰会千锤百炼,不败金身Verifier,一个都不放过安全至上性能与功能并进代码审核(CodeReview)及时修复Bug2022/12/2845微软高级开发管理峰会法则9:使用Verifier工具——一个都不放过将警告等级设置为最高使用PC-lint来检查C/C++代码的潜在错误一个VS.NET的Verifier工具:FXCop获得微软内部“BestPractice”大奖按照.NETFrameworkDesignGuideline对.NETAssembly进行检查包括安全、命名、性能等170多条Rulehttp:///team/libraries/F

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论