リファクタリング:コードをクリーンアップするための単なる凝った言葉ではありませんか?[閉まっている]


21

Martin Fowlerの本「Refactoring:Improving the Design of Existing Code」が出てくる前は、コードの大きな変更を「再構築」、小さな変更を「クリーンアップ」と呼んでいました。IMO、リファクタリング技術はすべて常識であり、私たちがこれまでずっとやってきたことです。

リファクタリングは新しいものだと思いますか?おそらく、管理をtrickしてコードをクリーンアップする時間を割り当てる方法でしょうか?


「本が出る前に」と言うとき、マーティン・フォルワーの本に言及していると思いますが、これは正しいですか?
AlexC

-1:この質問の有用性は何ですか?
ジムG.

はい、ファウラーの本。
チャックステファン

回答:


43

リファクタリングは丘よりも古いので、いや、それは新しいものではありません。

リファクタリングはクリーンアップではありません。それは可能ですが、クリーンアップに限定されません。

動作を維持しながら、アプリケーションのアーキテクチャを調整します(大規模または小規模)。

つまり、アプリケーションの一部は昨日は完全にクリーンで正常だったかもしれませんが、今日の新機能では、その部分を調整して新機能に対応する必要があります。

既存の機能を壊したくないので、動作を維持しながらアプリケーションの構造を調整します-これはリファクタリングです。

これは、コードにどのような変更が加えられたとしても、万が一の場合に備えて常にテストを実行する必要があるということです。


1
ニュートピア:それは重要なポイントです。テストを実行していない場合、何かをランダムにハッキングしたか、実際にリファクタリングしたかはわかりません。(そしてもちろん、適切なテストスイートが必要です!)
フランクシェラー

9

コードを整理しているだけです。基本的に、プログラマー(特にMartin Fowler)は、コードを整理するたびに同じタスクを実行する傾向があることに気付きました。彼らは、整頓方法と関連するコードの問題を定義し、ラベル付けしました。リファクタリングが生まれました。

設計パターンでも同じです。人々は、特定の問題に対して同じアプローチを繰り返し使用する傾向があることに気付きました。彼らはアプローチにラベルを付けて定義しましたが、今ではコードで同じダースほどのパターンを使用しない限り、あなたは本当のプログラマーではないようです。

リファクタリングする魔法はありません。古い慣習を説明するための新しい専門用語です。


William Opdyke、1992:オブジェクト指向フレームワークのリファクタリング。Fowler&Beck&friendsはリファクタリングを普及させました。Jon BrantとDon Robertsは、1999年以前に最初の自動化ツールを実装しました。そのため、「新しい専門用語」はあまり正確ではありません。
フランク・シェラー

1800年代半ばのAda Lovelace以来、コンピュータープログラミングが行われていることを受け入れた場合、はい、それは比較的新しい専門用語です。
アント

1
デザインパターンとの違いは、ほとんどすべての開発者がいくつかの新しいパターンを習得したため、この本から貿易の新しいツールを学んだと思います。リファクタリングでは、誰かが本当に何かを学んだとは感じません。何かに名前を付けるだけで二次的な価値があります(そしてデザインパターンの比較はそこにあります)が、彼はブログ投稿でそれを行うことができました。
チャックステファン

確かに、ラムダ計算と比較して、それは新しい専門用語だと言いました。
フランク・シーラー

@チャック、リファクタリングの本を読んだことがありますか?もしそうなら、もしあなたがそれから何か新しいことを学ばなければ、私は非常に驚くでしょう。
マーシー

7

社内で3つのことを行い、3つの時間を割り当てます。

  • リファクタリング:コード構造を変更し、動作を維持することです。

例:thingsくて判読できない100行のメソッドを、4つのことを行う25行の4つの再利用可能なメソッドに分割します。

  • クリーンアップ:動作も構造も変更せずにコードを読みやすくするために、わずかな変更を行います。

例:このコードが不要になったことを確認した後、コメント化されたコードを削除します。

  • StyleCop / FxCopルールの適用:コードがStyleCopまたはFxCopルールのデフォルトセットに一致するかどうかを確認し、一致しない場合は、それらのルールに一致するように変更します。

例:追加Culture.Invariantstring.Format(又はより適切である別の培養)。

したがって、私の場合、リファクタリングはcleanupとは非常に異なるものです。クリーンアップを行うとき、私は再びユニットテストを実行する必要はありません:コードが前に働いていた場合、それはなりますクリーンアップ後に動作します。つまり、空の行を削除したり、コメントを追加したからではなく、コードが機能しなくなるということです。一方、古いコードの複雑な部分をリファクタリングすると、いくつかの間違いを犯す可能性があるため、リファクタリング後にユニットテストを実行する必要があります。


4
クリーンアップとリファクタリングには基本的な違いがあることに同意しますが、この線がかなりぼやける場合が多くあります。デッドクラスを削除し、メソッドシグネチャまたは残りの関連付けからそのクラスへのすべての参照を「クリーンアップ」することは、クリーニングまたはリファクタリングと見なされますか?また、単体テストの実行がオプションであることにも強く反対します。あなたは、物事がどのように壊れるかについて、全くわかりません。誰かがエラーを処理するために解析するのは良い考えだと考えたため、例外ブレークコードのメッセージ文字列に変更が見られました。
ニュートピア

特にテストを再実行する必要がないという点で、Newtopianに同意する必要があります。実際には、実行しない自動化されたテストスイートがあるはず劣らず、多くの場合、 1回にコミット回。クリーンアップリファクタリングかに関係なく、バージョン管理にコミットするコード変更がある場合、テストを実行する必要があります。
小次郎

クリーンアップを行った後は、空白だけでコメントが変更された場合でも、常にフルビルドを行う必要があります。PythonまたはMakefileの作成者に問い合わせてください。
JBRウィルキンソン

3

リファクタリングにより、コードに知識が追加されます。何か間違った名前が付けられていることがわかっている場合は、より良い名前を付けます。何かがもっとうまくできるとわかっているなら、それをもっと良いものに変えます。

うまくいけば、より良いプログラムが得られるのは、多くのステップ(小規模および大規模)です。


3

「リファクタリングはコードをクリーンアップするための派手な言葉です」と同意しますが、「ただ」ではありません。人々は派手な言葉を使う理由があります:賢いように見えることもあれば、より正確な意味を伝えていることもあれば、IMHOリファクタリング(たまに誤用されている場合もあります)は一般的に後者を指します。

「クリーンアップ」とは、「少しの再フォーマット」から「大きなチャンクの再書き込み」までを意味します。

「リファクタリング」とは、具体的には「同じ機能を維持しながら、より優れた設計に変換するように設計された、コードに対する小さな増分変更」のようなものを意味します。そして、あなたがすることの種類にはベストプラクティスがあります:アドホックなものもありますが、ユニットテストの使用、関数の一部を新しい関数またはクラスに抽出するなどの一般的な原則があります。 。

あなたは、「コードをクリーンアップするための時間を割り当てるために、単にトリック管理をする」と言います。しかし、「リファクタリング」と言うことは、明快さへの着実な投資が将来効率性に利益をもたらすという概念を正しく伝えている場合、それは「トリック」ではなく、それは明確で効果的なコミュニケーションです。


2

リファクタリングはコーディングであり、正規化はリレーショナルデータに対するものです。これは、概念を抽象化して、アプリケーション内での役割のよりクリーンで明確で効率的な表現にするプロセスです。


1
それはそれを見る興味深い方法です。データベースのバックグラウンドから来ているのかもしれませんが、リファクタリングのストレスについて私を悩ませる何かがあり、あなたは私がそれに指を置くのを助けてくれました。データベースでは、設計で修正しないものは、テストで修正するのに10倍、実稼働ではおそらく1000倍長くなります。したがって、優れたDBAは、可能な限り早い段階で物事を正しく行うことについてアナルです。私の直感では、後の段階でリファクタリングする時間が長すぎると、設計に費やす時間が短すぎることを示します。
user21007

@ user21007:コードはデータベーススキーマよりもはるかに複雑ですが、変更とデプロイがはるかに簡単です。
ケビンクライン

1

用語リファクタリングをどのように理解するかによります。ほとんどの人にとって、これは行動を変えることなく構造を改善するプロセスです。同意したら、はい、それはこの本が出るずっと前に行われました。私が知っているのは、本が書かれる前に、クラスの名前を変更し、クラスを抽出し、メソッドを抽出していたからです。私はそれをリファクタリングと呼んでいませんでしたが、本質的にはまったく同じことをしていました。

個人的にリファクタリングとは、人々が現在「自動化されたコードリファクタリング」と呼ぶもの、つまりIDE内のさまざまなリファクタリング技術のサポートです。これは、私が以前やっていたことの本当の改善です(実際、非常に苦痛でした)。あるクラスで変更を行うことができ、これが他のソフトウェアにどのように影響するか心配する必要はありません。Martinはリファクタリング技術をアルゴリズムとして表現でき、さまざまなIDEに実装できるところまで形式化したと思います。

したがって、リファクタリングをプロセスとして理解していれば、それは新しいことではありません。それを自動化として見るなら、はい、それは大きな改善です。かなり大きなプロジェクトで、いくつかのコアクラスの名前を(文字通り、IDEのリファクタリングオプションではなく)変えてみてください:)


0

リファクタリングは確かにコードの「クリーンアップ」ですが、コードの再構築も行います。私のチームでは、リファクタリングは通常後者です。「リファクタリング」の場合は、コードを再構築するための時間を割り当てます。たとえば、新しいアーキテクチャや情報モデルに合わせたり、より効率的にしたりします。

コード「クリーンアップ」は、特別に時間を割り当てずに継続的に実行するものです。私にとって、「クリーンアップ」は通常、名前の変更、コメントの消去などです。


1
名前の変更は標準的なリファクタリング手法です!
チャックステファン

0

いいえ

リファクタリングプロセスでクリーンアップが行われる場合がありますが、それは本質ではありません。

クリーンアップには、以前のコードがクリーンではないという前提があります。実際には、開発者は元のコードがすでにクリーンであってもコードをリファクタリングします。

DRYはリファクタリングの背後にある重要な原動力です。

既存のコードベースに新しいコードを追加する場合、DRYの原則により、リファクタリングは自然に行われます。

ちょうど私の0.02


0

コードをきれいにすることは家を片付けるようなもので、リファクタリングは壁を壊して別の場所に置くようなものです


0

誰かがあなたの家を掃除するとき、目標は物をきれいにして邪魔にならないようにすることなので、何も見つけることができません。リファクタリングは、部屋、クローゼット、キャビネット、棚、ビンなどを構築し、ラベルを付けます。ほとんど同じものを保持します(キッチンでグリルチーズサンドイッチを作成し、リビングルームで食べることができます)。見つけやすくなり、新しいものを置くための効率的な場所ができる可能性があります。


私は流行語ではありませんが、時には一般的なタスクにラベルを付けて正式にする必要があるため、誰もがあなたが話していることを知っています。クライアントがバグを報告し、マネージャーは「コードをきれいにしてください!」と叫びます。あなたは彼らがリファクタリングについて話していないことを知っています。
-JeffO

0

「リファクタリング」という用語は、代数からエレガントに借用されています。用語を単純化して同じ結果を生成することを意味します。エレガントであるだけでなく、革新的でした-多くの人を驚かせるレベルで、ハードな有限のアプローチが必要でした。したがって、この用語自体は重要で有用でした。


-1

いいえ。リファクタリングとは、動作を変更せずに構造を改善することです。厳密な意味でのリファクタリングには、優れたテスト規律が必要です。「クリーンアップ」するとき、それは必ずしも必要ではありません。


2
危険な態度。デッドコードとデッド構成の全体を削除することは、リファクタリングである単一メソッドのシグネチャをクリーンアップして変更することです。それでも、どちらの場合も、私が何も壊さないことを保証するために、良いテスト規律を取得したいと思います。
ニュートピア

テストの規律なしに大きな変更を加えることが良い/安全/望ましいと言っているわけではありません。方法論としてのリファクタリングにはテストの規律が含まれるのに対し、「物事の整理」は方法論ではありません。
ウィリーウィーラー

それで、適切な空想的な名前がないかどうかを正しく理解できたら、私たちは行ってもいいです!! :-O冗談です、あなたが言っていることはわかります、物事をきれいにすることは方法論と呼ばれることはほとんどないかもしれませんが、再びどちらもリファクタリングではありません。これは、動作を変更せずにコードを変更していることを示す、単なるお洒落な言葉です。それ自体は、テストにはまったく影響しません。適切なコーディング慣行に従うと、コードが変更された場合、変更を生成したアクションをどのように呼び出すかに関係なく、コードをテストする必要があることが示されます。
ニュートピア

1
確かに、私はそれを買うことができます。テストの規律とは、リファクタリングを実行する方法に関するものですが、定義に固有​​のものではありません。(つまり、テストなしでコードをリファクタリングできます。)リファクタリングが方法論ではないことに同意できるかどうかはわかりません。段階的なパターンなどで書かれた本があります。
ウィリーウィーラー

-1

2つは端で少し重なりますが、私にとっては、家の掃除と家の改造の違いです。私にとって、クリーンアップは構造的な変更を意味するのではなく、リファクタリングは意味します。


-2

「リファクタリング」は実際には「アーキテクチャ」と同じですが、「機能の変更なし」という意味合いが強くなっています。また、再アーキテクチャの目標に関しても明確です。これは、一般的なコードを再利用可能なチャンクに「ファクタリング」することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.