ホームページ > php教程 > php手册 > PHP トーク「リファクタリング - 既存コードの設計改善」第 4 回 条件式の簡素化

PHP トーク「リファクタリング - 既存コードの設計改善」第 4 回 条件式の簡素化

WBOY
リリース: 2016-06-13 12:00:45
オリジナル
1142 人が閲覧しました

思维导图
点击下图,查看大图。


 介绍
 
 条件逻辑有可能十分复杂,因此本章提供一些重构的手法,专门用来简化它们。
 
全文简述(你可直接跳过下面的内容)
  核心重构: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精髓:给某一分支以特别重视。

 
条件をポリモーフィズムに置き換えます
状況: さまざまなオブジェクト タイプに応じてさまざまな動作を選択する式を手に入れ、この条件式の各分岐をサブクラスに配置します。関数をオーバーライドして元の関数を宣言します。抽象関数としての関数。

このコードの悪臭:

1. 長すぎます。新しい種類のビデオが追加されると、長くなります。

2. 明らかに複数のことを行います。

3. 修正する理由はいくつかあるため、単一の権限と責任の原則に違反します。

4. 新しいタイプが追加されるたびに変更する必要があるため、オープンクローズの原則に違反します。しかし、最も厄介なのは、構造体 (_get 型名 Rank()) に似た関数があちこちに存在することかもしれません。

アサーションの導入
状況: コードの特定の部分では、プログラムの状態についていくつかの仮定を行う必要があります。その後、 この仮定をアサーションで明確に表現します。

実行結果:

実行結果:

選び方のポイント:

1. このようなコードは、特定の条件が true の場合にのみ正常に実行されることがよくあります。 ——実際、プログラムの最終製品ではすべてのアサーションが削除されることがよくあります。
2. このような仮定は、通常、コード内で明示的に表現されていません。それを確認するには、アルゴリズム全体を読む必要があります。 - プログラマーがそのような仮定をコメントとして書くことがありますが、アサーションの方がより良い手法です。
3. アサーションは条件式であり、常に true である必要があります。失敗した場合は、プログラマーが間違いを犯したことを意味します。
4. アサーションは、 通信とデバッグ の補助として使用できます。 ——コミュニケーション: プログラマーがコードによって行われる前提を読んで理解するのに役立ちます。デバッグ: プログラマーがバグを見つけ、最も近い場所でバグを捕捉できるように支援します。
5. アサーションはプログラムの動作を変更しません。
6. アサーション値: プログラマがコードを正しく動作させるために必要な条件を理解するのに役立ちます。
7. アサーションの条件式には Extract メソッドを使用することをお勧めします。これは、条件式の目的をより明確に説明するためなど、複数の場所で繰り返されるコードを同じ関数に抽出するためです。
概要
私はこの章の「入れ子になった条件をガード句で置き換える」という方法を好みます。私はこの方法を日常のコードでよく使用します。この方法を「ガード句」と呼ぶ人もいます。
もう 1 つは、PHP 開発でよく使用するデバッグは var_dump() または print_r() ですが、PHP に Assert メソッドがあることを初めて知りました。これは良いことです。
学習と実践の過程で、私は多くの良い方法も学びました。しかし、チーム開発では「全体の状況が最も重要である」場合もあると思います。チームの慣習的な方法に従ってコーディングするか、チームとコミュニケーションを取り、全員の承認を得た後、ここで説明した方法を使用して、全員ができるようにすることもできます。お互いにデバッグする お互いのコードを読み合うときに便利です。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート