还剩58页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《复习课件语句重构题解析》欢迎来到语句重构题解析的复习课件!本课程旨在帮助大家掌握代码重构的核心概念、技巧和实践方法通过系统学习和练习,你将能够编写出更清晰、更易于维护的高质量代码让我们一起开始这段精彩的重构之旅吧!课程概述重构的定义和意义本课程的学习目标12我们将深入探讨代码重构的定明确本课程的学习目标,了解义,理解其在软件开发中的重通过本课程你将掌握哪些重构要性,以及如何通过重构提升技能,以及如何将这些技能应代码质量和可维护性用到实际项目中课程内容安排3概述课程的内容安排,让大家对整个课程的结构有一个清晰的了解,为后续的学习做好准备什么是代码重构?改善既有代码的设计不改变外部行为提高代码质量和可维护性代码重构的核心在于改善现有代码的设重构的关键是不改变代码的外部行为,通过重构,我们可以提高代码的可读性计,使其结构更清晰、模块更独立,从即保证重构后的代码与重构前的代码具、可理解性和可维护性,降低代码的维而提升代码的整体质量有相同的功能和输出护成本为什么需要重构?改善代码设计提高代码可读性帮助发现bug重构可以帮助我们改善代通过重构,我们可以提高在重构过程中,我们可以码的设计,使其更符合软代码的可读性,使代码更更深入地理解代码,从而件设计的原则,提高代码易于理解和维护,降低代更容易发现潜在的,bug的灵活性和可扩展性码的维护成本提高代码的健壮性提高编程速度高质量的代码可以提高编程速度,因为易于理解和修改的代码可以减少开发人员的时间和精力重构的时机添加新功能时在添加新功能之前,对现有代码进行重构可以使其更易于扩展,从而降低添加新功能的难度修复时bug在修复时,对相关代码进行重构可以帮助我们更深入地理bug解的原因,并防止类似再次出现bug bug代码审查时在代码审查时,我们可以对代码进行重构,以提高代码的质量和可维护性,并促进团队成员之间的知识共享重构的基本步骤确保有可靠的测试1在进行重构之前,务必确保有可靠的测试,以验证重构后的代码与重构前的代码具有相同的功能和输出小步骤进行2重构应该以小步骤进行,每次只进行一个小的更改,并立即进行测试,以降低重构的风险频繁提交更改3频繁提交更改可以帮助我们更好地管理重构过程,并及时发现和解决问题最好每次重构提交后都进行测试常见的代码坏味道重复代码过长函数过大的类重复代码是指在不同的地方出现相同过长函数是指函数包含过多的代码行过大的类是指类包含过多的成员变量的代码片段重复代码会增加代码的过长函数难以理解和维护,应该将和方法过大的类难以理解和维护,维护成本,并降低代码的可读性要其分解为更小的函数应该将其分解为更小的类杜绝的陋习copypaste过长参数列表发散式变化过长参数列表是指函数的参数过多过长参数列表难以理解发散式变化是指当修改一个类时,需要同时修改多个不相关和使用,应该将其封装为对象的类应该使用单一职责原则修改代码重构技巧提炼函数定义适用场景操作步骤提炼函数是指将一个长函数中的一段代当一个函数过长,或者函数中的一段代首先,确定要提取的代码片段然后,码提取出来,创建一个新的函数这样码可以独立出来时,可以使用提炼函数创建一个新的函数,并将代码片段复制做可以提高代码的可读性、可维护性和也可以将重复代码提取出来到新函数中最后,将代码片段替换为可重用性对新函数的调用提炼函数示例//重构前void printOwingdoubleamount{printBanner;System.out.printlnname:+name;System.out.printlnamount:+amount;}//重构后void printOwingdoubleamount{printBanner;printDetailsamount;}void printDetailsdoubleamount{System.out.printlnname:+name;System.out.printlnamount:+amount;}重构技巧内联函数定义适用场景操作步骤内联函数是指将一个函数的代码复制到当一个函数过于简单,或者函数只被调首先,找到要内联的函数然后,将函调用该函数的地方这样做可以减少函用一次时,可以使用内联函数如果代数的代码复制到调用该函数的地方最数调用的开销,提高代码的执行效率码容易理解,函数命名没有意义,可以后,删除原函数使用内联函数内联函数示例//重构前int getRating{return moreThanFiveLateDeliveries2:1;}boolean moreThanFiveLateDeliveries{return numberOfLateDeliveries5;}//重构后int getRating{return numberOfLateDeliveries52:1;}重构技巧提炼变量定义适用场景操作步骤提炼变量是指将一个表达式的结果存储当一个表达式过于复杂,或者表达式的首先,确定要提取的表达式然后,创在一个变量中这样做可以提高代码的结果被多次使用时,可以使用提炼变量建一个新的变量,并将表达式的结果存可读性和可维护性相当于为表达式赋增加可读性,便于理解储在该变量中最后,将表达式替换为予一个有意义的名字对该变量的引用提炼变量示例//重构前return order.quantity*order.itemPrice-Math.max0,order.quantity-500*order.itemPrice*
0.05+Math.minorder.quantity*order.itemPrice*
0.1,100;//重构后final double basePrice=order.quantity*order.itemPrice;final doublequantityDiscount=Math.max0,order.quantity-500*order.itemPrice*
0.05;final doubleshipping=Math.minbasePrice*
0.1,100;return basePrice-quantityDiscount+shipping;重构技巧内联变量定义适用场景操作步骤内联变量是指将一个变量的值直接替换当一个变量过于简单,或者变量只被使首先,找到要内联的变量然后,将变到使用该变量的地方这样做可以减少用一次时,可以使用内联变量减少不量的值替换到使用该变量的地方最后变量的开销,提高代码的执行效率必要的代码量,删除原变量内联变量示例//重构前double basePrice=anOrder.basePrice;return basePrice1000//重构后return anOrder.basePrice1000重构技巧改变函数声明定义适用场景操作步骤改变函数声明是指修改函数的名称、参当一个函数的名称不够清晰,或者函数首先,确定要修改的函数然后,修改数列表或返回值类型这样做可以使函的参数列表不合理时,可以使用改变函函数的名称、参数列表或返回值类型数更易于理解和使用改善设计数声明更方便调用最后,修改所有调用该函数的地方API改变函数声明示例//重构前String getPersonName{...}//重构后String personName{...}//重构前setTitleString newTitle{...}//重构后setTitleString title{...}重构技巧封装变量定义适用场景操作步骤封装变量是指将一个变量设置为私有,当一个变量需要被保护,或者需要控制首先,将变量设置为私有然后,提供并提供和方法来访问该变量对该变量的访问时,可以使用封装变量方法来获取变量的值最后,提供getter settergetter这样做可以保护变量的状态,并提高提供统一的访问接口方法来设置变量的值setter代码的可维护性封装变量示例//重构前public Stringname;//重构后private Stringname;public StringgetName{return name;}public voidsetNameString name{this.name=name;}重构技巧变量改名定义适用场景操作步骤变量改名是指修改变量的名称,使其更当一个变量的名称不够清晰,或者变量首先,确定要修改的变量然后,修改清晰地表达变量的含义这样做可以提的名称与变量的含义不符时,可以使用变量的名称最后,修改所有使用该变高代码的可读性和可维护性使用有意变量改名方便理解和维护量的地方义的变量名变量改名示例//重构前int a;//重构后int age;//重构前List l;//重构后List customers;重构技巧提炼类定义适用场景操作步骤提炼类是指将一个复杂的类分解为多个当一个类过于复杂,或者类中的一部分首先,确定要提取的代码片段然后,更小的类这样做可以提高代码的可读代码可以独立出来时,可以使用提炼类创建一个新的类,并将代码片段移动到性、可维护性和可重用性使用单一职符合面向对象设计原则新类中最后,修改原类,使其与新类责原则进行交互提炼类示例//重构前class Person{private Stringname;private StringofficeAreaCode;private StringofficeNumber;...}//重构后class Person{private Stringname;private TelephoneNumberofficeTelephone=new TelephoneNumber;...}class TelephoneNumber{private StringareaCode;private Stringnumber;...}重构技巧内联类定义适用场景操作步骤内联类是指将一个简单的类的代码复制当一个类过于简单,或者类只被使用一首先,找到要内联的类然后,将类的到使用该类的地方这样做可以减少类次时,可以使用内联类减少不必要的代码复制到使用该类的地方最后,删的开销,提高代码的执行效率代码量,简化设计除原类内联类示例//重构前class Order{private Customercustomer;...}class Customer{private Stringname;...}//重构后class Order{private StringcustomerName;...}重构技巧隐藏委托关系定义适用场景操作步骤隐藏委托关系是指将一个类对另一个类当一个类需要访问另一个类的内部状态首先,创建一个新的方法,该方法封装的依赖隐藏起来这样做可以降低类之时,可以使用隐藏委托关系避免直接了对另一个类的访问然后,将所有对间的耦合度,提高代码的可维护性使访问内部属性另一个类的直接访问替换为对新方法的用门面模式调用隐藏委托关系示例//重构前manager=aPerson.getDepartment.getManager;//重构后manager=aPerson.getManager;重构技巧移除中间人定义适用场景操作步骤移除中间人是指将一个类对另一个类的当一个类只是简单地将请求委托给另一首先,找到所有对中间人的调用然后委托关系移除这样做可以减少类的数个类时,可以使用移除中间人简化调,将对中间人的调用替换为对被委托类量,简化代码的结构与隐藏委托关系用链,减少代码复杂度的直接调用最后,删除中间人类相反移除中间人示例//重构前client.getDepartment.getManager;//重构后client.getManager;重构技巧替换算法定义适用场景操作步骤替换算法是指用一种新的算法替换旧的当一个算法的效率不高,或者算法难以首先,找到要替换的算法然后,用新算法这样做可以提高代码的效率或可理解时,可以使用替换算法优化代码的算法替换旧的算法最后,测试代码读性选择更优的算法性能,提高可读性,确保新算法的正确性替换算法示例//重构前String foundPersonString[]people{for inti=0;ipeople.length;i++{if people[i].equals Don{return Don;}if people[i].equals Kent{return Kent;}if people[i].equals John{return John;}}return;}//重构后String foundPersonString[]people{List candidates=Arrays.asListnew String[]{Don,Kent,John};for inti=0;ipeople.length;i++{if candidates.containspeople[i]{return people[i];}}return;}条件语句重构分解条件表达式定义适用场景操作步骤分解条件表达式是指将一个复杂的条件当一个条件表达式过于复杂,或者条件首先,确定要分解的条件表达式然后表达式分解为多个更简单的条件表达式表达式中的一部分可以独立出来时,可,将条件表达式分解为多个更简单的条这样做可以提高代码的可读性和可维以使用分解条件表达式方便阅读理解件表达式最后,使用逻辑运算符将这护性将复杂的条件判断拆解为更小的些简单的条件表达式连接起来单元分解条件表达式示例//重构前if date.before SUMMER_START||date.afterSUMMER_ENDcharge=quantity*winterRate+winterServiceCharge;elsecharge=quantity*summerRate;//重构后if notSummerdatecharge=winterChargequantity;elsecharge=summerChargequantity;条件语句重构合并条件表达式定义适用场景操作步骤合并条件表达式是指将多个简单的条件当多个条件表达式执行相同的操作时,首先,确定要合并的条件表达式然后表达式合并为一个更复杂的条件表达式可以使用合并条件表达式减少代码重,使用逻辑运算符将这些条件表达式连这样做可以减少代码的冗余,提高代复,提高效率接起来最后,将合并后的条件表达式码的效率将多个相关的条件判断合并替换为原来的多个条件表达式为一个整体合并条件表达式示例//重构前if seniority2return0;if monthsDisabled12return0;if isPartTimereturn0;//重构后if isNotEligibleForDisabilityreturn0;private booleanisNotEligibleForDisability{return seniority2||monthsDisabled12||isPartTime;}条件语句重构以卫语句取代嵌套条件表达式定义适用场景操作步骤以卫语句取代嵌套条件表达式是指使用当一个条件表达式嵌套过深时,可以使首先,找到嵌套的条件表达式然后,卫语句来简化嵌套的条件表达式这样用以卫语句取代嵌套条件表达式简化使用卫语句来提前返回最后,删除嵌做可以提高代码的可读性和可维护性逻辑,提高可读性套的条件表达式提前返回,避免嵌套以卫语句取代嵌套条件表达式示例//重构前public doublegetPayAmount{double result;if_isDeadresult=deadAmount;else{if_isSeparatedresult=separatedAmount;else{if_isRetiredresult=retiredAmount;elseresult=normalPayAmount;};}return result;}//重构后public doublegetPayAmount{if_isDead returndeadAmount;if_isSeparated returnseparatedAmount;if_isRetired returnretiredAmount;return normalPayAmount;}条件语句重构多态取代条件表达式定义适用场景操作步骤多态取代条件表达式是指使用多态来替当一个条件表达式根据对象的类型执行首先,创建一个抽象类或接口然后,换条件表达式这样做可以提高代码的不同的操作时,可以使用多态取代条件为每种类型的对象创建一个子类最后可扩展性和可维护性将条件判断逻辑表达式符合开闭原则,将条件表达式中的操作移动到相应的分散到不同的子类中子类中多态取代条件表达式示例//重构前double getSpeed{switch_type{case EUROPEAN:return getBaseSpeed;case AFRICAN:return getBaseSpeed-getLoadFactor*_numberOfCoconuts;case NORWEGIAN_BLUE:return_isNailed0:getBaseSpeed*getVoltage;}throw newRuntimeException Shouldbe unreachable;}//重构后abstract classBird{abstract double getSpeed;}class Europeanextends Bird{double getSpeed{return getBaseSpeed;}}class Africanextends Bird{double getSpeed{return getBaseSpeed-getLoadFactor*_numberOfCoconuts;}}class NorwegianBlueextends Bird{doublegetSpeed{return_isNailed0:getBaseSpeed*getVoltage;}}条件语句重构引入特例定义适用场景操作步骤引入特例是指创建一个特殊的类或对象当一个条件表达式用于处理某种特殊情首先,创建一个特殊的类或对象然后,用于处理某种特殊情况这样做可以况时,可以使用引入特例分离特殊情,将条件表达式中的特殊情况处理逻辑简化条件表达式,提高代码的可读性况的处理逻辑移动到该类或对象中最后,使用该类将特殊情况的处理逻辑封装到一个独立或对象来替换条件表达式的类中引入特例示例//重构前if customer==null{name=occupant;}else{name=customer.getName;}//重构后name=customer.isUnknownoccupant:customer.getName;class UnknownCustomer{public booleanisUnknown{return true;}}重构循环以管道取代循环定义适用场景操作步骤以管道取代循环是指使用管道操作来替当一个循环用于对集合进行操作时,可首先,将循环转换为管道操作然后,换循环这样做可以提高代码的可读性以使用以管道取代循环简化代码,提使用管道操作来替换循环最后,测试和可维护性使用函数式编程的思想高可读性代码,确保管道操作的正确性以管道取代循环示例//重构前List highRatedPhoneNumbers=new ArrayList;for StringphoneNumber:phoneNumbers{if ratephoneNumber5{highRatedPhoneNumbers.addphoneNumber;}}//重构后List highRatedPhoneNumbers=phoneNumbers.stream.filterphoneNumber-ratephoneNumber
5.collectCollectors.toList;重构循环移除死代码定义适用场景操作步骤移除死代码是指将循环中永远不会被执当一个循环中包含永远不会被执行的代首先,确定循环中永远不会被执行的代行的代码移除这样做可以提高代码的码时,可以使用移除死代码提高代码码然后,将这些代码移除最后,测可读性和可维护性删除无用的代码质量,减少冗余试代码,确保移除代码后代码的正确性移除死代码示例//重构前for inti=0;i10;i++{System.out.printlni;break;//循环只会执行一次}//重构后System.out.println0;数据组织的重构拆分变量定义适用场景操作步骤拆分变量是指将一个变量拆分为多个更当一个变量用于存储多个值时,可以使首先,确定要拆分的变量然后,创建小的变量这样做可以提高代码的可读用拆分变量方便理解和维护,提高代多个新的变量,用于存储拆分后的值性和可维护性将一个含义复杂的变量码质量最后,使用这些新的变量来替换原变量拆解为多个含义单一的变量拆分变量示例//重构前String personInfo=John,Doe,30;String[]parts=personInfo.split,;String firstName=parts
[0];String lastName=parts
[1];String age=parts
[2];//重构后String firstName=John;String lastName=Doe;String age=30;数据组织的重构字段改名定义适用场景操作步骤字段改名是指修改类的字段的名称,使当一个字段的名称不够清晰,或者字段首先,确定要修改的字段然后,修改其更清晰地表达字段的含义这样做可的名称与字段的含义不符时,可以使用字段的名称最后,修改所有使用该字以提高代码的可读性和可维护性使用字段改名方便理解和维护段的地方有意义的字段名字段改名示例//重构前class Order{private StringcName;...}//重构后class Order{private StringcustomerName;...}数据组织的重构以查询取代临时变量定义适用场景操作步骤以查询取代临时变量是指使用查询方法当一个临时变量的值可以通过调用查询首先,创建一个查询方法,用于获取临来替换临时变量这样做可以提高代码方法来获取时,可以使用以查询取代临时变量的值然后,将所有使用临时变的可读性和可维护性避免重复计算,时变量简化代码,提高可读性量的地方替换为对查询方法的调用最提高代码效率后,删除临时变量以查询取代临时变量示例//重构前double basePrice=_quantity*_itemPrice;if basePrice1000return basePrice*
0.95;elsereturn basePrice*
0.98;//重构后if basePrice1000return basePrice*
0.95;elsereturn basePrice*
0.98;double basePrice{return_quantity*_itemPrice;}数据组织的重构引入参数对象定义适用场景操作步骤引入参数对象是指创建一个新的类,用当一个函数的参数过多,或者函数的参首先,创建一个新的类,用于封装函数于封装函数的参数这样做可以提高代数之间存在关联时,可以使用引入参数的参数然后,将函数的参数替换为对码的可读性和可维护性将多个相关的对象方便调用和维护,提高代码质量该类的对象最后,修改所有调用该函参数封装到一个对象中数的地方引入参数对象示例//重构前double amountInvoicedDate startDate,Date endDate{...}double amountReceivedDatestartDate,Date endDate{...}double amountOverdueDatestartDate,Date endDate{...}//重构后double amountInvoicedDateRangedateRange{...}double amountReceivedDateRangedateRange{...}double amountOverdueDateRangedateRange{...}class DateRange{private finalDatestart;private finalDate end;}数据组织的重构复合函数调用定义适用场景操作步骤复合函数调用是指将多个函数调用合并当多个函数调用用于执行相同的操作时首先,创建一个新的函数,该函数封装为一个函数调用这样做可以提高代码,可以使用复合函数调用简化代码,了多个函数调用然后,将所有对多个的可读性和可维护性将多个相关的函提高可读性函数调用的地方替换为对新函数的调用数调用封装到一个新的函数中最后,删除原来的多个函数调用复合函数调用示例//重构前doublebase=_readings[index].getValue;return base-quantity*Math.min1,_readings[index].getValue/5;//重构后return adjustedCapital_readings[index].getValue;double adjustedCapitaldoublecapital{return capital-quantity*Math.min1,capital/5;}重构的注意事项保持小步骤频繁测试12重构应该以小步骤进行,每次每次重构后都应该进行测试,只进行一个小的更改,并立即以确保重构后的代码与重构前进行测试,以降低重构的风险的代码具有相同的功能和输出便于追踪和恢复保证代码质量版本控制的重要性3使用版本控制系统可以帮助我们更好地管理重构过程,并及时发现和解决问题方便回滚和协作重构工具介绍内置重构工具第三方重构工具IDE许多都内置了重构工具,例如、等这除了内置的重构工具外,还有一些第三方的重构工具,例如IDE EclipseIntelliJ IDEAIDE些工具可以帮助我们更方便地进行重构自动化重构,提高效率、等这些工具可以提供更强大的重构功JRefactory RefactorIt能更专业的重构工具重构实践练习案例分析通过分析实际的案例,我们可以更深入地理解重构的原理和技巧学习优秀的代码重构实践重构步骤演示通过演示重构的步骤,我们可以更直观地了解重构的过程和方法掌握重构的具体操作课程总结重要概念回顾1回顾本课程中讲解的重要概念,例如重构的定义、意义、时机、步骤等巩固知识,加深理解重构技巧汇总2汇总本课程中讲解的重构技巧,例如提炼函数、内联函数、提炼变量、内联变量等方便查阅和使用问答环节欢迎大家提出问题,我们将尽力解答通过问答环节,可以加深对重构的理解,解决实际遇到的问题,并促进交流和学习。
个人认证
优秀文档
获得点赞 0