思维导图
点击下图,查看大图。
介绍
条件逻辑有可能十分复杂,因此本章提供一些重构的手法,专门用来简化它们。
全文简述(你可直接跳过下面的内容)
核心重构:Decompose Conditional——分离”转辙逻辑“(switching logic)和”操作细节“(details)分离。
多处测试有相同结果:Consolidate Conditional Expresssion
条件代码中去掉重复成分:Consolidate Duplicate
标识特殊情况:Replace Nested Conditional with Guard Clauses
去除讨厌的控制标记:Remove Control Flag
专业术语
decompose:分解,分离
consolidate:合并
eligible:合适的,合格的
fragment:碎片,片段
nest:嵌套
guard:保卫
clause:从句
polymorphism:多态
assertion:断言
unchecked exception:不可控异常
Decompose Conditional
状况:你有一个复杂的条件(if-else if-else)语句,那么从if、else if、else三个段落中分别提炼出函数。
Consolidate Conditional Expression
状况:你有一些条件测试,都得到相同的结果,那么将这些测试合并为一个条件式,并将这个条件提炼称为一个独立的函数。
动机: 1、合并后的条件代码会告诉你“实际上只有一次条件检查,只不过有数个并列条件需要检查而已“,——使检查的用意更清晰。
2、为Extract Method做好准备。——将检查条件提炼成一个独立函数,对于理清代码意义非常有用。它把描述“做什么”的语句换成了“为什么这样做”。
条件语句的“合并理由”也同时指出了“不要合并”的理由:如果你认为你的这些检查的确彼此独立,的确不应该被视为同一次检查,那么就不要使用本项重构。因为在这种情况下,你的代码已经清楚表达出自己的意义。
Consolidate Duplicate Conditional Fragments
状况:在条件式的每个分支上有着相同的一段代码,那么将这段重复代码搬移到条件之外。
Remove Control Flag
状况:在一系列布尔表达式中,某个变量带有“控制标记”的作用,那么以break语句或return语句取代控制标记。
Replace Nested Conditional with Guard Clauses
状况:函数中的条件逻辑使人很难看清正常的执行路径,那么使用卫语句(Guard Clauses)表现所有特殊情况。
条件式的两种形式:
1、所有分支都属于正常行为:使用[if ... else..]
2、条件式极其罕见:应该单独检查该条件,并在该条件为真时,立刻从函数中返回。——这样的单独检查常常被称为”卫语句“
Replace Nested Conditional with Guard Clauses精髓:给某一分支以特别重视。
Replace Conditional with Polymorphism
状况:你手上有个表达式,它根据对象型别的不同而选择不同的行为,那么将这个条件式的每个分支放进一个subclass内的覆写函数中,然后将原始函数声明为抽象函数。
此代码的坏味道:
1、它太长,当视频有新类型的时候,它会变得更长。
2、它明显做了不止一件事。
3、它违反了单一权责原则,因为它有好几个修改它的理由。
4、它违反了开放闭合原则,因为每当添加新类型时,必须修改它。不过最麻烦的可能是到处皆有类似结构(_get类型名Rank())的函数。
Introduce Assertion
状况:某一段代码需要对程序状态(state)做出某种假设,那么以断言(assertion)明确表现这种假设。
运行结果:
采点:
1、常常会有这样的代码,只有当某个条件为真时,该段代码才能正常运行。——实际上程序最后成品往往将assertion统统删除。
2、这样的假设通常并没有在代码中明确表现出来,你必须阅读整个算法才能看出。——有时候程序员会以注释写出这样的假设,而assetion是一种更好的技术。
3、assertion是一个条件式,应该总是为真。如果失败,表示程序员犯了错误。
4. アサーションは、通信とデバッグのアシスタントとして使用できます。 ——コミュニケーション: プログラマーがコードによって行われる前提を読んで理解するのに役立ちます。デバッグ: プログラマーがバグを見つけ、最も近い場所でバグを捕捉できるように支援します。
5. アサーションはプログラムの動作を変更しません。
6. アサーション値: コードを正しく動作させるために必要な条件をプログラマーが理解できるようにします。
7. おそらく条件式の目的をより明確に説明するために、複数の場所で繰り返されるコードを同じ関数に抽出するために、アサーションの条件式に Extract メソッドを使用することをお勧めします。
まとめ
私はこの章の「入れ子になった条件をガード句に置き換える」という方法を好みます。私はこの方法を日常のコードでよく使用します。この方法を「ガード句」と呼ぶ人もいます。
もう 1 つは、PHP 開発でよく使用するデバッグ メソッドは var_dump() または print_r() ですが、PHP に Assert メソッドがあることを初めて知りました。これは良いことです。
学習と実践の過程で、私は多くの良い方法も学びました。しかし、チーム開発では「全体の状況が最も重要である」場合もあると思います。チームの慣習的な方法に従ってコーディングするか、チームとコミュニケーションを取り、全員の承認を得た後、ここで説明した方法を使用して、全員ができるようにすることもできます。お互いにデバッグする お互いのコードを読み合うときに便利です。
http://www.bkjia.com/PHPjc/325364.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/325364.html技術記事マインドマップ 下の画像をクリックすると大きな画像が表示されます。 はじめに 条件付きロジックは非常に複雑になる可能性があるため、この章では、条件付きロジックを簡素化するために設計されたいくつかのリファクタリング テクニックを提供します。 全文の簡単な説明 (直接...
)