技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

リファクタリング

明示的なメソッド群によるパラメータの置き換え【リファクタリング】

状況 パラメータの値によって、異なる処理を実行するメソッドがある 対処 異なるメソッドに分割する ただし、設計後にパラメータの値が変更される可能性が高いのであれば、このリファクタリングが適用されるべきではありません。 メリット メソッドの責務が…

ヌルオブジェクトの導入【リファクタリング】

状況 null値のチェックが繰り返されている 対処 ヌルオブジェクトを作り、null値チェックと置き換える メリット コードがシンプルになり、どこをポリモーフィックにすべきかがわかりやすくなる ヌルオブジェクトは、「特殊ケース」とも捉えることができ、こ…

case: 長すぎるパラメータリスト【リファクタリング】

パラメータが多すぎる状態は、記述するのが面倒なだけでなく、それぞれのパラメータの役割をわかりづらくします。 一番の問題は、変更に対応するための作業が煩わしくなることです。パラメータを一つ追加すると呼び出し側の修正が必要になります。 パラメー…

case: 巨大なクラス【リファクタリング】

1つのクラスがあまりに多くの仕事をこなしている場合は、大抵、インスタンス変数の持ちすぎになっています。 インスタンス変数が多すぎると、重複したコードが生まれやすくもなります。 まず「クラスの抽出」を適用して、いくつかの変数をまとめます。ポイン…

インターフェースの抽出【リファクタリング】

状況 複数のクライアントが、あるクラスの一部の機能を使っている 対処 共通部分をインターフェースとして抽出する メリット 各クライアント(関数など)がどの機能を必要としているのかが明確になる 別の機能を持たせた異なる種類のクライアントを作成する…

フィールドの引き下げ【リファクタリング】

状況 フィールドがいくつかのサブクラスだけで使われている 対処 対象のフィールドを、サブクラスに移動する メリット クラスの責務が明確になる 手順 対象のフィールドをスーパークラスの全てのサブクラスで宣言する スーパークラスからそのフィールドを削…

メソッドの引き下げ【リファクタリング】

状況 スーパークラスの振る舞いが、いくつかのサブクラスだけに関係している 対処 対象のメソッドをサブクラスに移動する メリット クラスの責務が明確になる 手順 スーパークラスの全てのサブクラスで当該のメソッドを宣言し、そこにメソッドをコピーする …

サブクラスの抽出【リファクタリング】

状況 あるクラスの特定のインスタンスだけに必要な特性がある 対処 その一部の特性を持つサブクラスを作成する メリット クラス内の記述量が減り、可読性が上がる 「クラスの抽出」と比較して容易ではありますが、制約があります。 オブジェクトが生成された…

クラスの抽出【リファクタリング】

状況 クラスの責務が明確であるとは言い難く、複数のクラスに分けてなされるべき作業を一つのクラスで行なっている 例えば、Personというクラスに電話番号に関するフィールドやメソッドが存在する場合です。 対処 クラスを新たに作成し、適切なフィールドと…

case: 長すぎるメソッド【リファクタリング】

処理記述が長いメソッドは、可読性を下げ、適切に部品が共通化されていないことから、 プログラム全体でコードの重複も生まれやすくなります。 「メソッドの抽出」は一番単純で効果のあるアプローチです。 パラメータや一時変数もメソッドを長くする原因です…

ガード節による入れ子条件記述の置き換え【リファクタリング】

状況 メソッド内に、正常ルートが不明確な入れ子の条件付き振る舞いがある double getPayAmount() { double result; if (_isDead) result = deadAmount(); else { if (_isSeparated) result = separatedAmount(); else { if (_isRetired) result = retireAmo…

条件記述の分解【リファクタリング】

状況 if-then-elseによる複雑な条件記述がある 対処 条件記述部とthen部およびelse部から、メソッドを抽出する メリット コードが読みやすくなり、分岐の理由がわかりやすくなる 短い条件記述部は、一見して特にメソッド化する必要がないと思われるかもしれ…

メソッドオブジェクトによるメソッドの置き換え【リファクタリング】

状況 長いメソッドであり、「メソッドの抽出」を適用できないようなローカル変数の使い方がされている 対処 メソッド自身をオブジェクトとし、元のメソッドで定義されていたローカル変数を、そのオブジェクトのフィールドとする メリット 「メソッドの抽出」…

オブジェクトそのものの受け渡し【リファクタリング】

状況 あるオブジェクトから複数の値を取得し、それらの値をメソッド呼び出しのパラメータとして使用している 対処 メソッドのパラメータにはオブジェクトそのものを渡すよう変更する 結果として、ほとんどのパラメータがあるオブジェクトに依存する場合には…

パラメータの追加【リファクタリング】

状況 あるメソッドが、呼び出し元からより多くの情報を必要としている 対処 引数を追加する メリット 新たな情報を受け取ることができる ただし、無闇にパラメータを追加することはコードの可読性、保守性を悪くします。 本当に追加する必要があるのか、新た…

パラメータオブジェクトの導入【リファクタリング】

状況 本来まとめて扱うべきひとまとまりのパラメータがある。 例えば、いくつかのメソッドに対して「開始日」と「終了日」をセットで渡している場合です。 対処 まとめられるパラメータをオブジェクトに置き換える 例えば、「開始日」と「終了日」は「日付の…

case: コードの重複【リファクタリング】

同一クラス内の複数メソッドでの重複 「メソッドの抽出」を適用し、各メソッドの内部で抽出したメソッドを呼ぶようにします。 メソッドの抽出【リファクタリング】 - 技術向上 兄弟クラス間の複数メソッドでの重複 両方のクラスで「メソッドの抽出」を行い、…

Template Methodの形成【リファクタリング】

状況 異なるサブクラスの二つのメソッドが、類似の処理を同じ順序で実行しているが、各処理の内容は異なっている 例えば、処理順序や算出対象は同じでも、掛け合わせるレートが異なるなどです。 対処 同じメソッドをオーバーライドできるよう、各処理を同じ…

メソッドの引き上げ【リファクタリング】

状況 同じ結果をもたらすメソッドが複数のサブクラスに存在する。 対処 メソッドをスーパークラスに移動する メリット メソッドの修正もれリスクを下げる事ができる 手順 対象とする複数メソッドの内容が同じである事を確認する メソッド間でシグニチャ(引…

ポリモーフィズムによる条件記述の置き換え【リファクタリング】

状況 オブジェクトのタイプによって異なる振る舞いを選択する条件記述がある タイプコードに対して必要な継承構造が用意されていることが前提。つまり「サブクラスによるタイプコードの置き換え」もしくは「Stateによるタイプコードの置き換え」が適用されて…

Stateによるタイプコードの置き換え【リファクタリング】

状況 クラスの振る舞いに影響するタイプコードがあるが、サブクラス化はできない if文やcase文を削減する「ポリモーフィズムによる条件記述の置き換え」を適用するための土台づくりに使われます。 土台づくりには他に「サブクラスによるタイプコードの置き換…

自己カプセル化フィールド【リファクタリング】

状況 フィールドに直接アクセスしている _a = _a * 2 対処 そのフィールドに対するgetおよびsetメソッドを定義し、それらのメソッドを使用する メリット サブクラスがその情報の取り出しに際し、メソッドによってオーバーライドできる 遅延初期化を試みるこ…

メソッドの移動【リファクタリング】

状況 メソッドが定義されているクラスの特性(変数やフィールド、オブジェクト)よりも、他のクラスの特性の方が利用・被利用回数が多い 例えば、口座種類ごとに手数料が決まっているにも関わらず、 手数料計算のメソッドが、口座種類ではなく口座クラスに紐…

問い合わせと更新の分離【リファクタリング】

状況 一つのメソッドが値を返すと同時に、オブジェクトの状態を変更している 対処 メソッドを分離する メリット メソッドの役割が明確になる メソッドの再利用がしやすくなる 「問い合わせによる一時変数の置き換え」への障害が、一つ取り除かれる 手順 元の…

一時変数のインライン化【リファクタリング】

状況 簡単な式によって一度だけ代入される一時変数があり、それが他のリファクタリングの障害になっている var a = getAmount() return (a > 100) 対処 一時変数への参照を式に置き換え、一時変数を削除する メリット 他のリファクタリングの障害を取り除く…

問い合わせによる一時変数の置き換え【リファクタリング】

状況 式の結果を保持するために一時変数を使用している var a = b * c if (a > 100){ ...... } 対処 一時変数を問い合わせメソッドに置き換える メリット 処理をメソッドとしてまとめることで、他のメソッドから利用できる 呼び出し元の記述が簡潔になる 手…

一時変数の分離【リファクタリング】

状況 同じ変数に、一時的に値を保持する目的で、複数回異なる値が代入されている ただし、ループ処理内の変数と、一時変数を集めるための変数(i = i + 式)は対象外 対処 代入の箇所ごとに、一時変数を分離させる メリット 各変数がどんな目的を持っている…

メソッドの抽出【リファクタリング】

状況 あるメソッドの処理がとても長い 同じような処理がメソッドをまたがって書かれている 対処 長い処理部分をメソッドとして切り出す メリット 他のメソッドから使える可能性が増える 上位メソッド(抽出されたメソッドを使う元)の記述が読みやすくなる …

リファクタリングとは【リファクタリング】

学習の進め方 本カテゴリの執筆にあたっては、 こちらの本に則って学習をし、アプトプットしていきます。 books.rakuten.co.jp リファクタリングとは 「システムが示す最終的な結果は変更せずに、内部構造を改善する取り組み」です。 結果が変わってはいけま…