思维导图
点击下图,查看大图。
核心重构:Decompose Conditional——分离”转辙逻辑“(switching logic)和”操作细节“(details)分离。
多处测试有相同结果:Consolidate Conditional Expresssion
条件代码中去掉重复成分:Consolidate Duplicate
标识特殊情况:Replace Nested Conditional with Guard Clauses
去除讨厌的控制标记:Remove Control Flag
2、为Extract Method做好准备。——将检查条件提炼成一个独立函数,对于理清代码意义非常有用。它把描述“做什么”的语句换成了“为什么这样做”。
条件语句的“合并理由”也同时指出了“不要合并”的理由:如果你认为你的这些检查的确彼此独立,的确不应该被视为同一次检查,那么就不要使用本项重构。因为在这种情况下,你的代码已经清楚表达出自己的意义。
条件式的两种形式:
1、所有分支都属于正常行为:使用[if ... else..]
2、条件式极其罕见:应该单独检查该条件,并在该条件为真时,立刻从函数中返回。——这样的单独检查常常被称为”卫语句“
此代码的坏味道:
1、它太长,当视频有新类型的时候,它会变得更长。
2、它明显做了不止一件事。
3、它违反了单一权责原则,因为它有好几个修改它的理由。
4、它违反了开放闭合原则,因为每当添加新类型时,必须修改它。不过最麻烦的可能是到处皆有类似结构(_get类型名Rank())的函数。
运行结果:
运行结果:
1、常常会有这样的代码,只有当某个条件为真时,该段代码才能正常运行。——实际上程序最后成品往往将assertion统统删除。
2、这样的假设通常并没有在代码中明确表现出来,你必须阅读整个算法才能看出。——有时候程序员会以注释写出这样的假设,而assetion是一种更好的技术。
3、assertion是一个条件式,应该总是为真。如果失败,表示程序员犯了错误。
4、assertion可以作为交流与调试的辅助。——交流:可以帮助程序员阅读理解代码所做的假设。调试:帮助程序员找到bug,可以在距离最近的地方抓住bug。
5、assertion并不改变程序的任何行为。
6、assertion价值:帮助程序员理解代码正确运行的必要条件。
7、建议最好把assertion的条件式使用Extract Method,为了将若干地方的重复码提炼到同一个函数中,也许只是为了更清楚说明条件式的用途。
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@