欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    软件重构v2(精品).ppt

    • 资源ID:70941826       资源大小:1.74MB        全文页数:156页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    软件重构v2(精品).ppt

    1软件重构2报告人任甲林高级咨询师主要从事CMMI的培训、咨询和评估工作联系方式:Mobile:13301172719E-mail:Blog:http:/ Code 重复的代码Long Method 过长方法Large Class 过大类Long Parameter List 过长参数列表Divergent Change 发散式变化Shotgun Surgery 霰弹式修改Feature Envy 依恋情结Data Clumps 数据泥团Primitive Obsession 基本类型偏执Switch Statements Switch语句Parallel Inheritance Hierarchies 平行继承层次Lazy Class 多余的类Speculative Generality 不确定的一般性Temporary Field 临时字段Message Chains 消息链Middle Man 二传手Inappropriate Intimacy 过度亲密Alternative Classes with Different Interfaces 异曲同工的类Incomplete Library Class 不完整的库类Data Class 数据类Refused bequest被拒绝的馈赠Comments 过多的注释9重复的代码症状:容易形式:两个代码段看上去几乎相同困难形式:两个代码段都拥有几乎相同的作用措施:抽取方法抽取类替换算法说明:一次,仅仅一次原则10重复的代码 protected void queryBtn(object sender,EventArgs e)/如果项目编号不为空时 if(this.xmbhText.Text.ToString().Trim().Equals()=false)/对输入的查询条件项目编号是否合法进行校验 Byte MyBytes=System.Text.Encoding.Default.GetBytes(this.xmbhText.Text.ToString().Trim();if(MyBytes.Length 10)MessageBox.Alert(项目编号不能超过10个字节!);this.xmbhText.Focus();return;/如果项目名称不为空时if(this.xmmcText.Text.ToString().Trim().Equals()=false)/对输入的查询条件项目名称是否合法进行校验 Byte xmmccheck=System.Text.Encoding.Default.GetBytes(this.xmmcText.Text.ToString().Trim();if(xmmccheck.Length 40)MessageBox.Alert(项目名称不能超过40个字节!);this.xmmcText.Focus();return;/实现数据库绑定 GridView1_DataBind();11过长的方法症状:存在大量的代码行(只要看到超过N(如10行)代码的方法,立即检查是否可以重构之。长度是一个警告信号,并不表示一定有问题。)措施:绝大多数场合下,可以采取抽取方法的重构手法来把方法变小每当需要以注释来说明点什么时,我们就可以把需要说明的东西写进一个独立方法中以其用途(而非实现方法)命名。其他在现代的开发工具中,方法调用的增多不会影响性能。长方法难以理解。12过大类症状:存在大量实例变量存在大量方法存在大量代码行措施:抽取类抽取子类抽取接口13过长参数列表症状:方法的参数多于1个或2个后果:难以理解难以记忆容易造成前后不一致措施:将参数替换为方法保持对象完整性引入参数对象14发散式变化症状:有多种变化的原因导致类的改变措施:如果类既要找到对象,又要对其做某些处理,则令调用者查找对象,并将该对象传入,或者令类返回调用者所用的值采用抽取类,为不同决策抽取不同的类如果多个类共享相同类型的决策,则可以合并这些新类。至少这些类可以构成一层。15霰弹式修改症状:发生一次改变时,需要修改多个类的多个地方措施:找出一个应对这些修改负责类,这可能是一个现有的类,也可能需要通过抽取类来创建一个新类。使用移动字段(move field)和移动方法(move method)将功能置于所选的类中。如果未选中类足够简单,则可以使用内联类将该类除去。16魔法数症状:代码中出现了常量措施:对于特殊值,采用将魔法数替换为符号常量如果值是串,则可以将其置于某种映射功能方法中17依恋情结症状:一个方法似乎过于强调处理其他类的数据,而不是处理自己的数据。措施:使用移动方法将动作置于适当的类中(可能必须先采用抽取方法分离出位置不当的部分)18数据泥团症状:同样的两至三项数据频繁地一起出现在类和参数表中代码声明了某些字段,并声明了处理这些字段的方法,然后又声明了更多的字段和更多的方法,如此继续。各组字段名以类似的子串开头或结束措施:如果项是类中的字段,则使用抽取类将其取至一个新类中如果值共同出现在方法的签名中,则使用引入参数对象(introduce parameter object)以抽取新的对象查看由新对象传递这些项的调用,以确定是否可以代之以使用保持对象完整(preserve whole object)查看这些项的使用:通常可以利用移动方法等重构技术,从而将这些使用移至新的对象中。19基本类型偏执症状:使用了基本类型或近基本类型(int、float、string等等)存在表示小整数的常量或枚举存在表示字段名的串常量措施:将数据值替换为对象将类型码替换为类将类型码替换为子类将类型码替换为状态/策略将数组替换为对象其他说明:用类的眼光来看待一切20Switch语句症状:代码使用了一个switch语句,尤其是对一个类型字段代码在某一行上存在多个If语句,特别是对同一个值进行比较时代码使用了instanceof或其等价形式来确定所处理的是何类型措施:如果针对相同的一条switch语句在多处出现,它通常会使用一个类型码;将其代之以多态内置于对象中。要完成这种改变,需要采用一系列重构技术:1 抽取方法。抽出每个分支上的代码。2 移动方法。将相关代码移动到适当的类。3 将类型码替换为子类或将类型码替换为状态/策略。建立继承体系结构4 将条件式替换为多态。去除条件式。如果条件式出现在一个类中,可以通过将参数替换为显示方法或引入Null对象来取代条件逻辑21平行继承层次症状:在一个继承体系中建立了一个新的子类,缺发现还需要在另外一个继承体系中创建一个相关的类。可能发现两个继承体系中子类有相同的前缀(命令可以反映出协调继承体系的需求)措施:使用移动字段和移动方法类重新分配字段,从而可以去除某个继承体系。22多余的类症状类并没有做什么工作,似乎是由其父类、子类或者调用者完成了所有相关的工作,而在此类中却没有足够的行为,以至于对其是否继续存在会产生质疑。措施:如果一个类的父类或者子类更适合于完成该类的行为,则通过折叠继承体系将该类与其父类或子类合并。否则,通过内联类将其行为合并至其调用者。23不确定的一般性症状:存在未用的类、方法、字段、参数等。它们可能没有客户,或者仅有测试作为客户对于当前实现的需求,代码过于复杂措施:对于一个不必要的类,可以:折叠继承体系内联类对于一个不必要的方法,使用内联方法或移除方法对于一个不必要的字段,确保没有对它的任务引用,删除之对于一个不必要的参数,使用移除参数(remove parameter)说明:不要过度设计24临时字段症状:字段仅在某些时候得到设置,而在其余时间内为null(或未用)措施:抽取类,移除字段以及所有相关代码25消息链症状:可能看到如下的调用形式:a.b().c().d()措施:如果处理实际上属于目标对象(即消息链最末的对象),则使用抽取方法和移动方法将处理置于该对象中。使用隐藏委托使方法仅依赖于一个对象(因此,不采用a.b().c().d()的形式,而是将一个d()方法置于a对象中。这可能还需要为b()和c()对象增加一个d()方法)。26二传手症状:类的大多数方法都是在调用另一个对象的同一个(或类似的)方法:F()delegate.f();措施:可以通过令客户直接调用委托来移除中间人如果委托由中间人所有,或者是不可变的,而且中间人还有需要增加的行为,那么此中间人可以看作是委托的一个示例,如此则可以采用将委托替换为继承。27 过度亲密症状一个类访问了另一个类的内部(本应是私有的)部分。措施如果两个独立的类彼此“纠缠”。使用移动方法和移动字段,将适当的部分置于适当的类中。如果纠缠的部分看上去是一个被遗漏的类,则使用抽取类和隐藏委托引入此新类如果类互相指向对方,则采用将双向引用改为单向引用,使之成为一种单向依赖如果子类以一种非受控的方式访问其父类的字段,则使用自封装字段如果父类可以定义一个通用算法,而子类能够插入其中,则使用构建模板方法如果父类和子类需要进一步解耦合,则采用将继承替换为委托28异曲同工的类症状:两个类看上完成相同的工作,但却使用了不同的方法名措施:协调各个类,使之取得一致,从而可以删除某个类采用重命名方法,使方法名类似使用移动方法、增加参数和方法参数化,从而使方法的协议(方法签名和实现途径)相似如果2个类只是相似而非相同,那么一旦对他们进行了很好的协调,就可以使用抽取超类如果可能的话,删除多余的类29不完整的库类症状:你正在使用一个库类,而且希望在该类上有某个特性,但是却未能如愿。如果这是一个正常的类,就可以加以修改;但是,由于这是库的一部分,因此可能无法修改也不希望对它有所改变。措施:查看类或库的所有者是否考虑将来增加你所需的支持。如果仅仅是一两个方法,则可以对库类的客户应用引入外来方法(Introduce Foreign Method)如果存在多个方法需要增加,则要应用引入本地扩展(Introduce Local Extension)。再进一步使用这个新的扩展类。可能会决定引入一层来覆盖这个库30数据类症状:类仅有字段构成,或者只有简单的赋值方法和取值方法构成措施:采用封装字段阻止对字段直接访问(仅允许通过赋值方法和取值方法进行访问)对可能的方法尽量采用移除设置方法(remove setting methods)采用封装集合(encapsulate collection)去除对所有集合类型字段的直接访问。查看对象的各个客户,如果客户试图对数据做同样的工作,则对客户采用抽取方法,然后将方法移到该类中。在完成上述工作后,可能发现类中存在多出相似的方法,使用诸如重命名方法、抽取方法、增加参数或者移除参数等重构技术,以协调签名,并消除重复对字段的大多数访问都不再需要,因为所移动的方法涵盖了其实际应用。因此可以使用隐藏方法来消除对赋值方法和取值方法的访问。31拒收的馈赠症状subclass应该继承superclass的方法和字段,但是subclass只使用了superclass的部分方法和字段如果subclass复用了superclass的行为(实现),却又没有支持superclass的接口继承没有实际意义;子类并非父类的一个例子措施如果不会导致混淆,可以顺其自然如果找不出原因来共享某个关系,则采用将继承替换为委托如果父-子类确实有意义,则可以通过抽取子类、下移字段和下移方法来创建一个新的子类。令此类有非拒绝行为,并将父类的客户修改为该新类的客户,这样父类就不必再提及此特性了。还可以从原来的类以及其父类中去除这些被拒绝的方法。32过多的注释 Comments 症状:代码中出现注释符(/或/*)措施:抽取方法重命名方法引入断言其他说明:有些注释是有用的,不能一概删除指出为什么需要以某种方式完成某项工作引用了并非显而易见的算法33案例:多余的注释public class KnockOutServiceBean implements KnockOutService/*The exception message.*/private String message=;/*The ssn and age not exist exception message.*/private static final String SSNORINCOMENOTEXIST_EXCEPTION=ssnOrIncomeNotExistMessage;/*The ssn format error exception message.*/private static final String SSNFORMAT_EXCEPTION=ssnFormatErrorMessage;/*Read ruls file is wrong exception message.*/private static final String READRULES_EXCEPTION=read ruls file is wrong;34重新组织方法35抽取方法 Extract Method 当方法过长时、需要注释才能让人理解其用途时、存在重复代码时,就可以考虑采用抽取方法的重构手法了。只有当抽取出的新方法进行了很好的命名,才能充分新方法的作用以“做什么”来命名方法,而不是以“如何做”来命名方法不要恐惧小方法36案例抽取方法/重构前int main()int a=10;int b=20;int c=a;a=b;b=c;/重构后void swap(int&x,int&y)int nTmp=x;x=y;y=nTmp;int main()/其他代码 int a=10;int b=20;swap(a,b);/此处调用 /其他代码37案例:抽取方法void printOwing(double amount)void printOwing(double amount)printBanner();printBanner();/print details/print detailsSystem.out.println(name:+_name);System.out.println(name:+_name);System.out.println(amount+amount);System.out.println(amount+amount);void printOwing(double amount)void printOwing(double amount)printBanner();printBanner();printDetails(amount);printDetails(amount);void printDetails(double amount)void printDetails(double amount)System.out.println(name:+_name);System.out.println(name:+_name);System.out.println(amount+amount);System.out.println(amount+amount);38案例:抽取方法/原方法double getPrice()int basePrice=_quatity*_itemPrice;double discountFactor;if(basePrice 1000)discountFactor=0.95;else discountFactor=0.98;return basePrice*discountFactor;double getPrice()return basePrice()*discountFactor();int basePrice()return _quatity*_itemPrice;double discountFactor()if(basePrice()1000)return 0.95;/从上次替换中获得好处else return 0.98;39实战演练:抽取方法public class Matcher public Matcher()public boolean match(int expected,int actual,int clipLimit,int delta)/Clip too-large values for(int i=0;i clipLimit)actuali=clipLimit;/Check for length differences if(actual.length!=expected.length)return false;/Check that each entry within expected+/-delta for(int i=0;i delta)return false;return true;40方法内联化方法内联化 Inline MethodInline Method 一个小方法如果方法本体(method body)与其名称(method name)同样清楚易懂,则可考虑用方法本体替换掉对方法的调用。非必要的间接性可以去掉。间接层有其价值,但不是所有的间接层都有价值。用Inline可以找出那些是没有用的,同时去掉这些不必要的间接层。清晰简单是目标41案例:方法内联化案例:方法内联化int getRating()int getRating()return(moreThanFiveLateDeliveries()?2:1;return(moreThanFiveLateDeliveries()?2:1;boolean moreThanFiveLateDeliveries()boolean moreThanFiveLateDeliveries()return _numberOfLateDeliveries 5;return _numberOfLateDeliveries 5;int getRating()int getRating()return(_numberOfLateDeliveries 5)?2:1;return(_numberOfLateDeliveries 5)?2:1;42引入解释性变量引入解释性变量 Introduce Explaining VariableIntroduce Explaining Variable 如果表达式非常复杂而难以阅读,则考虑采用临时变量将表达式分解成比较容易管理的形式。在条件逻辑中,可以使用本重构方法将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。在较长的算法中可以运用临时变量来解释每一步运算的意义。Introduce Explaining Variable和Extract Method提炼方法 相比,后者应该首先被选用,只有当局部变量难以用Extract Method提炼方法 重构时,才使用前者。因为毕竟局部变量的生命周期只在所在的方法中才有意义,而方法则在对象的整个生命周期都有用。43案例:引入解释性变量案例:引入解释性变量/我们从一个简单的计算开始我们从一个简单的计算开始double price()/price is base Price-quantity Discount+shipping return _quantity*_itemPrice-Math.max(0,_quantity-500)*_itemPrice*0.05+Math.min(_quantity*_itemPrice*0.1,100.0);/通过Introduce Explaining Variable重构后的代码double price()final double basePrice=_quantity*_itemPrice;final double quantityDiscount=Math.max(0,_quantity-500)*_itemPrice*0.05;final double shipping=Math.min(basePrice*0.1,100.0);return basePrice-quantityDiscount+shipping;44案例:引入解释变量原来的code:People A,B;.if(A.isGirl()&B.isBoy()&!A.isMmarried()&!B.isMarried)getMarry();重构后代吗:People A,B;.final boolean canAandBGetMarry=A.isGirl()&B.isBoy()&!A.isMmarried()&!B.isMarried;if(canAandBGetMarry)getMarry();45以方法对象替换方法 Replace Method with Method ObjectReplace Method with Method Object 有一个大型的方法,其中对局部变量的使用,使你无法采用Extract Method提炼方法将这个方法放进一个单独的对象中,如此一来局部变量就成了对象内的字段。然后你可以在同一个对象中将这个大型的方法分解成数个小型方法。方法的体形越小越优美,只要将相对独立的代码从大型方法中提炼出来。就可以大大提高代码的可读性。46案例:以方法对象替换方法class Order.class Order.double price()double price()double primaryBasePrice;double primaryBasePrice;double secondaryBasePrice;double secondaryBasePrice;double tertiaryBasePrice;double tertiaryBasePrice;/long computation;/long computation;.47替换算法如果做一件事情可以有更清晰的方式,就应该以清晰的方式取代复杂的方式。当你发现有一个算法比原来的算法更加简单,就应该毫不犹豫的用它替换原来的算法。如果你使用程序库,而其中某些功能/特性和自己的代码重复,也需要改变原来的算法。逐步优化算法48案例:替换算法String foundPerson(String people)String foundPerson(String people)for(int i=0;i people.length;i+)for(int i=0;i people.length;i+)if(peoplei.equals(Don)if(peoplei.equals(Don)return Don;return Don;if(peoplei.equals(John)if(peoplei.equals(John)return John;return John;if(peoplei.equals(Kent)if(peoplei.equals(Kent)return Kent;return Kent;return;return;String foundPerson(String people)String foundPerson(String people)List candidates=Arrays.asList(new String Don,John,Kent);List candidates=Arrays.asList(new String Don,John,Kent);for(int i=0;ipeople.length;i+)for(int i=0;ipeople.length;i+)if(candidates.contains(peoplei)if(candidates.contains(peoplei)return peoplei;return peoplei;return;return;49实战演练:替换算法请优化下边的算法:/*create random data.*param sLen *Int datas lenth.*return temp String Getter for random data.*/private static String randomKey(final int sLen)String base;String temp;int i;int p;final int x=10;base=1234567890;temp=;for(i=1;i 1000)discountFactor=0.95;else discountFactor=0.98;return basePrice*discountFactor;/重构之后的主方法double getPrice()return basePrice()*discountFactor();/把临时变量赋值语句等号右边的表达式提炼成一个方法private int basePrice()return _quantity*_itemPrice;/有了basePrice()的基础很容易提炼出下面的方法private double discountFactor()if(basePrice()1000)return 0.95;else return 0.98;代码没有增加一行,反而减少了一行。但代码没有增加一行,反而减少了一行。但是结构更加清晰,而且容易复用。是结构更加清晰,而且容易复用。53分解临时变量分解临时变量Split Temporary VariableSplit Temporary Variable 你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不是一个集用临时变量(如i=i+j)。则针对每次赋值,创造一个独立的、对应的临时变量。临时变量有各种用途,其中会很自然的导致临时变量被多次赋值。循环变量和集用临时变量就是两个典型的例子。除了这两个例子外,还有很多临时变量保存着一段冗长的代码的运算结果,以便稍候使用。这种临时变量应该只被赋值一次,如果它们被赋值超过一次,就意味着应该被替换分解成多个临时变量,每个变量只承担一个责任。double temp=2*(_height+_width);System.out.println(temp);temp=_height*_width;System.out.println(temp);-final double perimeter=2*(_height+_width);System.out.println(perimeter);final double area=_height*_width;System.out.println(area);54移除对参数的赋值动作移除对参数的赋值动作 Remove Assignments to ParametersRemove Assignments to Parameters 如果在方法内对一个参数进行赋值动作,则以一个临时的变量取代该参数的位置不要混淆了传值和传址两种参数传递方式。如果你只在方法体内用参数表示被传递进来的东西,会使得代码更加清晰。55案例:nt discount(int inputVal,int quantity,int yearToDate)if(intputVal50)inputVal-=2;if(intputVal100)inputVal-=1;if(intputVal10000)inputVal-=4;-int discount(final final int inputVal,final final int quantity,final final int yearToDate)int result=inputVal;if(intputVal50)result-=2;if(intputVal100)result-=1;if(intputVal10000)result-=4;return result;56在对象之间移动特性57内联临时变量 inline temp如果一个临时变量只被一个简单表达式赋值一次,可以将对该变量的引用动作替换为对它赋值的那个表达式自身/*create date now.*return timestr String Getter for today date */private static String dateNow()Date currentTime=new Date();String timestr=;SimpleDateFormat formatter;formatter=new java.text.SimpleDateFormat(yyMMdd);timestr+=formatter.format(currentTime);return timestr;58移动字段 Move Field如果发现对于一个如果发现对于一个fieldfield字段,在其所驻字段,在其所驻classclass之外的另一个之外的另一个classclass中有更多方法使用了它,则可以考虑搬移这个中有更多方法使用了它,则可以考虑搬移这个fieldfield。也可能移动该字段的用户(方法),这取决于是否需要保持接口也可能移动该字段的用户(方法),这取决于是否需要保持接口的不受变化。的不受变化。使用使用Extract ClassExtract Class提炼类提炼类 的时候也应该先搬移字段,然后再的时候也应该先搬移字段,然后再搬移方法。搬移方法。59案例:Move Fieldclass Account.class Account.private AccountType _type;private AccountType _type;private double _interestRate;private double _interestRate;double interestForAmount_days(double amount,int days)double interestForAmount_days(double amount,int days)return _interestRate*amount*days/365;return _interestRate*amount*days/365;class AccountType.class AccountType.private double _interestRate;private double _interestRate;void setInterestRate(double arg)void setInterestRate(double arg)_interestRate=arg;_interestRate=arg;double getInterestRate()double getInterestRate()return _interestRate;return _interestRate;class Account.class Account.private AccountType _type;private AccountType _type;private double _interestRate;private double _interestRate;double interestForAmount_days(double amount,int days)double interestForAmount_days(double amount,int days)return return _type.getInterestRate()*amount*days/365;*amount*days/365;60移动方法 Move MethodMove Method 方法的搬移是重构理论的支柱。如果一个class有太多的行为,或者一个class和另一个class有太多的合作而形成高度耦合,就应马上搬移方法,从而使得class更简单,这些classes最终干净利落。从class 中找出这样的方法,使用另一个对象的次数比自己所驻的对象次数还多。如果发现有可能被移动的方法,就应该观察调用它的那一端,还有它调用的那一端,以及继承体系中它的任何一个重定义方法。然后根据这个方法和那个对象交流比较多,决定其移动的路径。如果不能确定,就先放下。61案例:Move MethodMove Method class Account.double overdraftCharge()/透支金额计费,它和其他class的关系比较密切。应该将它移到AccountType Class中。if(_type.isPremium()double result=10;if(_daysOverdrawn7)result+=(_daysOverdrawn-7)*0.85;return result;else return _daysOverdrawn*1.75;double bankCharge()double result=4.5;if(_daysOverdrawn0)result+=overdraftCharge();return result;private AccountType _type;private int _daysOverdrawn;62案例:Move MethodMove Methodclass Account.double overdraftCharge()/透支金额计费,它和其他class的关系比较密切。应该将它移到AccountType Class中。return _type.overdraftCharge(_daysOverdrawn);double bankCharge()double result=4.5;if(_daysOverdrawn0)result+=_type.overdraftCharge(_daysOverdrawn);return result;private AccountType _type;private int _daysOverdrawn;class AccountType.double overdraftCharge(int daysOverdrawn)if(isPremium()double result=10;if(daysOverdrawn7)result+=(daysOverdrawn-7)*0.85;return result;else return daysOverdrawn*1.75;63抽取类抽取类的时机:如果一个类的责任太多如果某些方法和某些数据总是一起出现如果某些数据经常同时变化并且彼此相依SRP原则:一个类只有一个促使它变化的原因64案例:抽取类-重构前using System;/Summary description for Employee./public class Employee private string firstName;private string lastName;private int age;private int sex;private int passport public Employee()/TODO:Add constructor logic here/public Employee(string first,string last)this.FirstName=first;this.LastName=last;public string FirstName getreturn firstName;setfirstName=value;public string LastName getreturn lastName;setlastName=value;public string GetFullName getreturn this.FirstName+this.LastName;/other functions 65案例:抽取类-重构后using System;/Summary description for Name.public class Name private string firstName;private stri

    注意事项

    本文(软件重构v2(精品).ppt)为本站会员(hyn****60)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开