芸術の復興

著作権:転載気軽に!https://blog.csdn.net/qq_41723615/article/details/90240009

復興とは何か:

ソフトウェアの内部構造を調整する方法は、ソフトウェア・オブジェクトは、そのコストを低減するように変更、そのわかりやすさを向上させる、同じ条件観察動作の下で提供されます。

 

なぜ復興:

、読みにくく困難なプログラムを使用すると、既存のコードを新しいプログラムを追加するときの動作を変更するために、変更することは困難、プログラムのロジックを複製、修正するために、条件付きロジックの繰り返し手順を変更することは困難で変更することは困難です。


復興することができます

    1、ソフトウェアの設計を変更します

    2、読み、理解するためにソフトウェアを容易にするために、

    3は、バグを見つけやすくするために、すべてのロジックは、新たな危機が既存の動作を変更しませんが、1つの場所だけで指定されています

    図4は、プログラミング速度を改善するために、単純な論理条件として発現しました

 

とき再建:Shibuguosan、3つの再建。

    1.復興機能を追加しながら、

    2.再構築エラーを修正

    コードレビューの3.復興

 

間接復興:

間接:このプログラムは、サブ機能またはサブオブジェクト共有ロジックを可能にする関数オブジェクトまたはサブ複数の機能、複数に分割され、別々に実装意図達成することができます。

時々別のリスクなしサブクラスおよび修正は、各サブクラスは鮮鋭度を増加させる、条件付きロジックパッケージ、可撓性関節条件付きロジック、メッセージフォームに条件ロジック、コードの重複を減らすことができますそして、柔軟性を向上させます。

 

問題の再構築:

データベース:

一緒にデータベースプログラムとの密結合のため、あなたはシステムの成層をしたい、だけでなく、必然的に退屈なプロセスである、データを移行するとき。

非オブジェクト・データベースでは、スペーサ層は、オブジェクト・モデルとデータベースモデル、二つのモデルの変化の単離の間に挿入されてもよいです。

インターフェイスを変更します。

公開されたインタフェース - あなたは、インターフェイスを変更するために必要なもの「を見つけることができないか、変更を見つけることができない」コードを使用している場合、インターフェイスを変更することは解決すべき問題になるだろうです。

すべてのユーザーが、この変化に反応する時間を持ってまで、この時点では、新旧両方のインターフェイスは維持しなければなりません。古いインタフェースが新しいインタフェースを呼び出すようにしよう、そう古いインターフェースを残しておく必要があります。

または保守作業を軽減、インターフェイスを公開しないようにしてください。

デザイン:

デザインは、セキュリティのニーズを考慮していない、と再構成されたシステムを改造すると、適切なセキュリティシステムを持っていたときに検討する前に、これはトレードオフを行うために要する難しさと強さに応じて可能な限り、選択のジレンマです。

 

ないときは復興へ:

既存のコードは難しく、あまりにも複雑なロジックを理解するために、それを再構築すべきでないとき、コードが実行されない場合には、いくつかの書き換えが速いだろう。コードは、ほとんどの場合、正常に機能することができなければならないことを前提に再建。そこ推定プロジェクトの締め切りがあり、誰も再構築したいと考えていません。

 

警告の復興:

重複コードは、関数が大きすぎるクラスのパラメータリストが長すぎる、長すぎる、発散の変更は、変更が重いタイプ、複雑な添付ファイル/依存、泥のパイデータ、基本的な妄想型ショットガン、ホラーが並列継承システムが登場切り替え冗長クラス、レトリックの未来、クラスに似混乱一時的なフィールド、ニュースチェーンの過度のカップリング、仲介、近すぎるクラスは、ライブラリは、完璧な子供のようなデータのクラスではありません、サブクラスはスーパークラスは、注釈付き拒否され継承しますそしてより多くの。

 

どのように再構築するために:

 

まず、関数が長すぎます

長すぎるための精製機能

第二に、インライン関数

関数本体の名称と理解するように簡単。

ボディ関数呼び出しポイント機能を挿入し、機能を除去します。

第三に、インライン一時変数

そこ単純な式で一度だけ割り当てられている一時的な変数があるが、それは、他の再構成技術を防止します。

この時点で、我々はすべての変数は、アクションを参照する必要があり、その課題の表現に置き換えます。

第四に、一時的な変数のクエリを置き換えるために、

一時変数に計算式の結果を維持するためのプログラム。

この式は、別の関数を抽出します。すべてこの一時変数の基準点は、新しい関数の呼び出しに置き換えられます。それ以来、新しい機能は、他の関数呼び出しすることができます。

第五に、説明変数の導入

複雑な式があります。

式(またはその一部)の結果は、変数名の使用を説明するために一時的な変数式に配置されます。

第六に、分解一時変数

一時変数は、それがループ変数でもない、複数回割り当てられているプログラムは、結果を収集するために使用されていないしています。

各課題について、対応する独立し、一時変数を作成します。

七、パラメータの割り当てを削除します

コードのパラメータの割り当て。

一時変数置換パラメータの位置で。

八、オブジェクト関数の機能を交換します

ローカル変数の使用は、あなたがメソッドの抽出(110)を使用することができないように大規模な機能は、あります。

1つのオブジェクトにこの関数は、この方法は、それは、フィールドオブジェクトの複数の局所変数であろう。これは、同じオブジェクト内のこの関数の小さな主要な機能を複数に分解することができます。

九、置換アルゴリズム

募集アルゴリズムは、他のより明確なアルゴリズムに置き換えられます。

アルゴリズム機能は、別体に置き換えられます。

テン、移動機能

授業くらいの相互作用の外、別のクラスのプロシージャおよびファンクションがあります。後者の呼び出しや時間、後者を呼び出します。

新機能の確立が最も頻繁に引用されたカテゴリの機能で同様の現象があります。古い機能は、単なるデリゲート関数となる、または完全に古い機能を削除します。

XI、フィールドを移動

フィールドでのプログラムは、そのカテゴリ内の別のクラスを使用する以上のものです。

彼らは新しいフィールドを使用するように、新しいターゲットクラスフィールドでは、すべてのユーザーのためのソースフィールドを変更します。

十二、精錬クラス

このクラスは、ものの2種のを作りました。

新しいクラスを作成するには、関連するフィールドおよび機能は、新しいクラスカテゴリに古いから移動。

XIII、インラインのクラス

あまりにも多くのことをしなかったクラスがあります。

このクラスのすべてのプロパティは、別のクラスに移動し、その後、ソースクラスを削除します。

XIVは、隠された関係を委託しました

別のオブジェクトのデリゲートを呼び出すために、顧客のクラスを向上させます。

すべての機能は、信頼関係を隠すために、顧客サービスカテゴリに構築するために必要な。

第五に、仲介を削除

あまり信頼アクションを行うための単純なクラス。

顧客が直接受託クラスを呼び出すことができます。

シックスティーン、追加機能の導入

私たちは、サービスのクラスを提供するための機能を追加する必要がありますが、このクラスを変更することはできません。

クライアントの機能、およびサービスクラスの最初のインスタンスに渡された形状パラメータを確立します。

XVIIは、地元の拡張を導入しました

私たちは、サービスクラスのためのいくつかの追加機能を提供する必要がありますが、このクラスを変更することはできません。

それはこれらの追加機能が含まれるように、新しいクラスを作成しますので、この伸長産物は、ソースサブクラスまたはラッパークラスになります。

十八、包装分野から

直接フィールドへのアクセスが、フィールド間の結合と、徐々にでは手に負えなくなります。

このフィールドの値が設定/機能を確立し、アクセスフィールドのタイプのみの関数です。

代わりに、オブジェクト内のデータ値の十九、

データ項目は、使用は、他のデータと動作に連動して理にかなって、あります。

データ項目が対象となります。

XX、オブジェクト参照オブジェクトの値を変更

各他の多くのインスタンスに等しいクラスから派生し、同じオブジェクトに置き換えることが望ましいです。

この値は、オブジェクト参照オブジェクトになります。

XXIは、オブジェクト値オブジェクトを参照するように変更されます

オブジェクトへの参照があり、それは小さく、定数と管理が困難です。

値オブジェクトにそれを回します。

XXII、オブジェクトの配列を交換します

その要素が各配列オブジェクトを置き換えるために異なるものを表す配列があります。

図フィールドにアレイ内の各要素のために。

XXIII、監視対象のデータをコピーします

GUIコントロール、機能や領域にあるデータの一部の領域がデータにアクセスする必要があります。

フィールドオブジェクトにデータをコピーします。観察者は、GUIオブジェクトのフィールド内で繰り返される同期用パターンとデータ・オブジェクトを確立します。

XXIVは一方向の関連双方向関連に変更されます

どちらのクラスではなく、一方向のみの接続時に、他の機能を使用する必要があります。

、逆ポインタを追加変更し、二つの機能を同時に接続することができます更新します。

XXV、協会は一方向双方向の関連を変更しました

双方向2クラス間の関連が、今日別のクラスへのクラスの特性を持っている必要はありません。

不要な関連付けを削除します。

XXVI、リテラルマジックナンバーを交換します

特別な意味を持つリテラル値は、あります。

それに名前を付けて、この定数の上記のリテラル値を置き換えるために、その重要性に応じて、定数を作成します。

XXVII、包装分野

パブリッククラスフィールドがあります。

プライベートとしてそれを宣言し、アクセス機能を提供します。

XXVIII、パッケージセット

コレクションを返す関数があります。

この関数は、コレクションの読み取り専用コピーを返しましょう、そしてこのクラスの要素の機能セットを削除/追加します。

置換のXXIXデータレコードクラス

私たちは、伝統的なプログラミング環境のレコード構造に直面する必要があります。

レコードのダミーデータオブジェクトを作成します。

クラスコードの種類を交換する三十

クラスは型コード値を持っていますが、それはクラスの動作には影響を与えません。

型コード値の新しいクラスを交換します。

XXXI、サブクラスに置換された種別コード

不変の型コードがあり、それはクラスの動作に影響を与えます。

コードのこのタイプのサブクラスで置換されています。

XXXII、州/戦略置換パターンコード付き

型コードがあり、それはクラスの動作に影響を与えますが、継承は、それを排除する手段を提供することはできません。

オブジェクトタイプコード置換基の状態で。

33またはサブクラスのフィールドを交換します

各サブクラスの唯一の違いは、本体のみの機能「一定のデータを返します」。

彼らは(新)フィールドのスーパークラスに戻るように、これらの機能を変更して、サブクラスを破壊します。

三十 - 4、分解条件式

複雑な条件文(IF-THEN-ELSE)があります。

もしからは、その後、他の各機能独立して3つの段落を抽出しました。

XXXV合併条件式

一部の列は、同じ結果を得る、条件テストがあります。

これらのテストは、条件式に結合され、この条件式は、別の関数に精製します。

XXXVIは、重複断片条件をマージ

これは、条件式の各ブランチ上のコードの同じセクションがあります。

このコードは、条件式の外に移動することが繰り返されます。

三十七、制御マークを削除

ブール式のシリーズでは、「制御フラグ」(制御フラグ)の役割を持つ変数です。

文を返すか、文の置換制御フラグを破ります。

ネストされた条件式の代替としてXXXVIIIガード声明

条件付きロジックは、通常の実行パスを参照する機能を困難にしています。

全ての特別な事情のパフォーマンスを使用して魏文。

39個の多型性置換条件式

それは、オブジェクトの種類に応じて異なる動作を選択することで、条件式を持っています。

サブクラス内の上書き機能への条件式の各支店、および元の関数は、抽象関数を宣言されています。

四十導入ヌルオブジェクト

あなたは、オブジェクトがnullであるかどうかをダブルチェックする必要があります。

null値はnullオブジェクトに置き換えられます。

XLIはアサーションを導入しました

コードの一部は、プログラムの状態に関するいくつかの仮定をする必要があります。

この仮説の明確な兆候を主張します。

四十二、機能の名前が変更されました

これは、関数を使用する関数の名前を明らかに失敗しました。

関数名を変更します。

43人の、パラメータを追加

この関数は、呼び出し側からより多くの情報を必要とします。

この機能のためのオブジェクトパラメータ、関数にオブジェクトを作るために必要な情報を追加します。

44人、パラメータを削除

もはや、身体機能のパラメータを必要としません。

除去パラメータ。

四十五、機能から分離機能を照会および変更

関数は、オブジェクトの状態値を返し、オブジェクトの状態を変更しないだけ。

修正のために他を照会する責任があるそのうちの一つ2つの異なる機能を、作成します。

46個のパラメータで関数が実行するように、

いくつかは同様の職務を行うが、体内で機能が、異なる値が含まれています。

単一機能の作成、それらの異なる値を表現するパラメータ。

四十七関数のパラメータを置き換える明確にします

パラメータの値に完全に依存して異なる挙動を示す機能は、あります。

パラメータの各々の可能な値、独立した機能の確立。

四十八そのままオブジェクトを保持

それらは、関数呼び出しのパラメータとして使用されている場合、一部の値は、オブジェクトから取り出しました。

代わりに、オブジェクト全体を渡します。

関数のパラメータを置き換えるために、四十 - 9

関数オブジェクトへの呼び出し、その結果を別の関数にパラメータとして渡され、関数自体の前に受信されたパラメータが関数呼び出しであることができます。

前にこのパラメータ、およびダイレクトコール機能を削除するために受信機パラメータをしてみましょう。

五導入パラメータオブジェクト

いくつかのパラメータは、常に自然に同時に発生しています。

これらのパラメータは、オブジェクトに代入されています。

第51、セッターを削除

フィールド値のクラスは、オブジェクトが作成されたときに設定してから変更することはありませんする必要があります。

機能のすべての属性の設定値を削除します。

第52、隠れた機能

他のカテゴリで使用されていない機能があります。

この関数は、プライベートに変更されます。

植物のコンストラクタ関数を置き換えるために、第53、

私たちは、あなたがオブジェクトを作成するときに、アクションの簡単な構造を入力する必要はありません。

コンストラクタ関数は、工場で置き換えます。

第54、包装ダウンキャスト

関数によって返されるオブジェクトは、関数の呼び出し側でダウンキャストを実行する必要があります。

アクションは意気消沈機能に移動しました。

55人の異常なエラーコードを交換します

いくつかのエラー状態を示すために特定のコードを返す関数。

例外を使用してください。

五十-6の異常なテストを交換します

呼び出し側が事前条件チェックに直面する可能性があり、それが例外をスローします。

発信者を変更するので、彼は関数を呼び出す前に、最初のチェックを行います。

57人、フィールドを移動します

2つのサブクラスは、同じフィールドを持っています。

フィールドは、スーパークラスに移動されます。

58個、シフト機能

いくつかの関数は、各サブクラスで同じ結果を生成します。

スーパークラスを移動するための機能。

159は、コンストラクタ本体をシフトしています

いくつかのコンストラクタは、その身体とほぼ同じそれぞれのサブクラスを持っています。

スーパークラスにコンストラクタを作成し、サブクラスのコンストラクタでそれを呼び出します。

六十ダウン機能

唯一のいくつかの(すべてではない)の関連するサブクラスを持つ関数のスーパークラス。

この関数は、これらのサブクラスに関連して移動します。

六十1、ダウンフィールド

フィールドのスーパークラスは、部分的に(すべてではない)のサブクラスを用いています。

このフィールドは、これらのサブクラスに移動する必要があります。

62種類、精錬サブクラス

クラスのいくつかの特徴が使用される唯一のいくつかの(すべてではない)のインスタンスです。

新しいサブクラスのサブクラスを移動する上記特性の一部。

63個、精錬スーパー

どちらのクラスは、同様の特性を持っています。

両方のクラスは、スーパークラスを作成するには、スーパークラスが同じ特性に移動します。

64個、精錬インタフェース

いくつかの顧客は、クラスインターフェース、インターフェース、または同じセクションの両方の同じサブセットを使用します。

別のインタフェースの同じサブセットを抽出します。

六十五、反復継承システム

スーパークラスとサブクラスの間には大きな違いがありません

1にそれらを組み合わせます。

66個、テンプレート関数を作成します

そこに特定の機能の対応する配列は、同様の動作を行う、請求いくつかのサブクラスがあるが、詳細は操作ごとに異なるであろう。

これらの操作は、独立した関数に入れ、それらを同じシグネチャを維持し、それが元の関数と同じになり、その後、スーパークラスの本来の機能に移動されます。

67の継承を置き換えるために委託

唯一のサブクラスはスーパークラスのインターフェイスの一部のみを使用して、または継承されたデータを必要としません。

新しいサブクラスフィールドでスーパークラスを保持する;サブクラス調整機能を、それがスーパークラスを委任することがあるので、2つの間の継承関係を削除します。

六十八手数料を置き換える継承します

二つのクラス間の信頼関係を使用し、多くの場合、全体のインターフェイスのために多くの単純な関数を書くことを依頼しました。

委譲クラスは、受託者クラスを継承してみましょう。

69人、ソートや分散継承システム

システムを継承し、2つの責任を前提とします。

2人の後継体制を確立し、別の呼び出しによって委託することが可能な関係をみましょう。

デザインオブジェクトのプロセスに七十デザイン

我々はいくつかの伝統的な手続き型スタイルのコードを持っています。

データを記録するオブジェクト、小さな正方形にチャンクの挙動となり、関連するオブジェクトの挙動に押し込みます。

七ワン技術と表現/表示分離

美術の授業の一部の中でGUIロジックが含まれています。

芸術の論理的な分離は、その別のドメインクラスを確立することです。

72個の精製継承システム

あまりにも多くの仕事、条件式を完了するために多くの作業の一部を行うためのクラスがあります。

下位クラスに継承システムを確立する特殊なケースを表します。

 

 

おすすめ

転載: blog.csdn.net/qq_41723615/article/details/90240009