※本記事は、Bardによる意訳+翻訳を活用し、レイアウト調整したものです。
※感想は、オリジナルです。
原文
リファクタリングをする際にソースコードの設計からはじめてはいけない - MonotaRO Tech Blog
意訳+要約
リファクタリングをする際にソースコードの設計からはじめてはいけない
リファクタリングとは、ソフトウェアの品質を向上させるために、ソースコードの構造や内容を変更することである。リファクタリングは、ソフトウェアの保守性を向上させ、新機能の追加を容易にする効果がある。
しかし、リファクタリングをする際には、ソースコードの設計からはじめてはいけない。設計からはじめると、リファクタリングの目的を見失い、かえって品質を低下させてしまう可能性がある。
リファクタリングの目的
リファクタリングの目的は、ソフトウェアの品質を向上させることである。品質の向上とは、次のようなものである。
- 保守性:ソフトウェアの修正や拡張が容易になる
- 拡張性:新機能の追加や変更が容易になる
- 理解しやすさ:ソースコードを理解しやすくなる
- パフォーマンス:ソフトウェアのパフォーマンスが向上する
設計からはじめると失敗する
設計からはじめると、リファクタリングの目的を見失い、かえって品質を低下させてしまう可能性がある。その理由は、次のようなものである。
- 設計は、ソフトウェアの全体像を把握した上で行う必要がある。しかし、リファクタリングの段階では、全体像がまだ明らかになっていない場合がある。
- 設計は、将来の拡張性やパフォーマンスを考慮して行う必要がある。しかし、リファクタリングの段階では、将来の拡張性やパフォーマンスがまだ明らかになっていない場合がある。
リファクタリングの進め方
リファクタリングは、次の手順で進めるとよい。
リファクタリングの目的は、前述した品質の向上につながるものである。リファクタリングの対象は、品質を向上させるために必要な部分である。リファクタリングを行う際には、テストを実施して、品質が向上していることを確認する。
結論
リファクタリングをする際には、設計からはじめてはいけない。設計からはじめると、リファクタリングの目的を見失い、かえって品質を低下させてしまう可能性がある。リファクタリングは、品質を向上させることを目的として、目的を明確にして、対象を特定して、テストを実施しながら行うことが重要である。
重要な部分
- リファクタリングの目的は、ソフトウェアの品質を向上させることである。
- 設計からはじめると、リファクタリングの目的を見失い、かえって品質を低下させてしまう可能性がある。
- リファクタリングの進め方は、次の手順で行う。
Bardさんに聞いてみた
Q:リファクタリングするためのテクニックについて教えてください
リファクタリングとは、ソフトウェアの品質を向上させるために、ソースコードの構造や内容を変更することです。リファクタリングは、ソフトウェアの保守性を向上させ、新機能の追加を容易にする効果があります。
リファクタリングを行うためには、いくつかのテクニックを身につける必要があります。ここでは、重要なリファクタリングのテクニックをいくつか紹介します。
単純化
単純化とは、コードをよりシンプルにすることです。コードを単純化することで、コードの理解しやすさや保守性が向上します。
単純化を行うには、次のようなものがあります。
- 重複したコードを削除する
- 不要な変数やメソッドを削除する
- コードを整理して、読みやすくする
抽象化
抽象化とは、コードの共通部分を抽出することです。コードを抽象化することで、コードの再利用性が向上します。
抽象化を行うには、次のようなものがあります。
- 関数やメソッドを抽出する
- クラスやインターフェースを抽出する
名前付け
名前付けは、コードの可読性を向上させるために重要です。コードの意味を正確に伝える名前を付けることで、コードの理解しやすさが向上します。
名前付けを行うには、次のようなものがあります。
- 変数やメソッドの名前を、その役割や意味を示すものにする
- クラスやインターフェースの名前を、その役割や意味を示すものにする
テスト
テストは、リファクタリングを行う上で重要な役割を果たします。リファクタリングを行う前に、テストを実施することで、リファクタリングによってコードが壊れていないことを確認することができます。
テストを行うには、次のようなものがあります。
リファクタリングは、ソフトウェアの品質を向上させるための重要な技術です。上記のテクニックを身につけて、効果的なリファクタリングを実施しましょう。
具体的なリファクタリングの手法としては、Martin Fowler氏の著書「リファクタリング―プログラムの体質改善テクニック」に、179の具体的なリファクタリング手法が紹介されています。この本を参考にしながら、リファクタリングのスキルを磨いていきましょう。
Q:179種類のテクニックを覚えるのは無理ゲーでは?
179種類のテクニックをすべて覚えることは、確かに難しいかもしれません。しかし、すべてのテクニックを覚える必要はありません。
リファクタリングの目的は、ソフトウェアの品質を向上させることです。そのため、品質を向上させるために必要なテクニックを覚えれば十分です。
具体的には、次のようなものが挙げられます。
- 重複したコードを削除する
- 不要な変数やメソッドを削除する
- コードを整理して、読みやすくする
- 関数やメソッドを抽出する
- クラスやインターフェースを抽出する
- 変数やメソッドの名前を、その役割や意味を示すものにする
- クラスやインターフェースの名前を、その役割や意味を示すものにする
これらのテクニックは、リファクタリングの基本的なテクニックであり、多くの場合で効果を発揮します。
また、リファクタリングは、経験を積むことでスキルが向上します。そのため、まずは基本的なテクニックを身につけて、経験を積んでいきましょう。
具体的なリファクタリングのテクニックを学ぶには、以下のようなものがあります。
リファクタリングは、ソフトウェアの品質を向上させるために重要な技術です。ぜひ、リファクタリングのスキルを身につけて、ソフトウェアの品質を向上させましょう。
Q:リファクタリングのサイクルを高速・効率化する手法やアイディアはありますか?
リファクタリングのサイクルを高速・効率化する手法やアイディアとしては、以下のようなものが挙げられます。
リファクタリングの対象を小さくする
リファクタリングの対象を大きくしてしまうと、リファクタリングに時間がかかるだけでなく、バグが発生するリスクも高くなります。そのため、リファクタリングの対象を小さくして、1回のリファクタリングで完了できる範囲に抑えることが大切です。テストを活用する
リファクタリングを行う前に、テストを実施することで、リファクタリングによってコードが壊れていないことを確認することができます。そのため、リファクタリングを行う際には、テストを活用するようにしましょう。自動化ツールを活用する
リファクタリングには、自動化ツールを活用することで、効率化を図ることができます。自動化ツールを利用することで、手作業で行うよりもスピーディーにリファクタリングを実施することができます。リファクタリングを習慣化する
リファクタリングは、継続的に行うことで効果を発揮します。そのため、リファクタリングを習慣化するようにしましょう。
具体的な手法としては、以下のようなものが挙げられます。
リファクタリングの対象を、ユニットテストでカバーされている範囲に限定する
ユニットテストでカバーされている範囲であれば、リファクタリングを行ってもコードが壊れる可能性が低くなります。そのため、リファクタリングの対象を、ユニットテストでカバーされている範囲に限定することで、リファクタリングのリスクを低減することができます。リファクタリングの目的を明確にする
リファクタリングを行う前に、リファクタリングの目的を明確にしておくことが大切です。目的を明確にすることで、リファクタリングの対象や範囲を絞り込むことができます。リファクタリングのステップを決めておく
リファクタリングを行う際には、あらかじめリファクタリングのステップを決めておくと、効率的にリファクタリングを実施することができます。リファクタリングの成果をレビューする
リファクタリングが完了したら、成果をレビューしましょう。レビューを行うことで、リファクタリングによって品質が向上したかどうかを確認することができます。
これらの手法やアイディアを参考にして、リファクタリングのサイクルを高速・効率化しましょう。
Q:自動化ツールとは、具体的に何のことですか?
自動化ツールとは、人間の代わりにタスクを自動的に実行するソフトウェアです。リファクタリングの自動化ツールは、リファクタリングを行うための作業を自動化することで、リファクタリングの効率化を図ることができます。
リファクタリングの自動化ツールには、以下のようなものがあります。
単純なリファクタリングを自動化するツール
このタイプのツールは、重複したコードの削除や、不要な変数やメソッドの削除などの単純なリファクタリングを自動化することができます。複雑なリファクタリングを自動化するツール
このタイプのツールは、関数やメソッドの抽出、クラスやインターフェースの抽出などの複雑なリファクタリングを自動化することができます。
リファクタリングの自動化ツールを活用することで、以下のメリットを得ることができます。
リファクタリングの時間を短縮できる
リファクタリングの自動化ツールを利用することで、手作業で行うよりもスピーディーにリファクタリングを実施することができます。リファクタリングの精度を向上させることができる
リファクタリングの自動化ツールは、人間よりも正確にリファクタリングを実施することができます。リファクタリングのリスクを低減できる
リファクタリングの自動化ツールを利用することで、リファクタリングによってコードが壊れるリスクを低減することができます。
リファクタリングの自動化ツールは、リファクタリングを効率化するために有効なツールです。リファクタリングの自動化ツールを活用して、リファクタリングのサイクルを高速・効率化しましょう。
感想+雑記
要するに目的を見失うなってことだな。
設計段階からリファクタリングする前提で設計しないからな。
リファクタリングとセットとして説明されるのか、テストの自動化だな。
逆に、テストできないところは、リファクタリングしてはいけないな。理由は、動作担保ができないリファクタリングは、怖いから。
何度、泣かされたことか。。。
テストできないところはリファクタリングすべきではないと釘をさされたのは、想定通り。
なぜ、リファクタリングするのかを明確にすることも大切ではないのかと思った。
リファクタリング手法は、経験を積まないと、リファクタリングするべきかどうかで悩む。
経験も、ただ積むだけではダメ。かならず、日々の振り返りをして、悪かった点がなんなのか考える習慣がついてないと、リファクタリング能力は向上しないと思う。
あとは、障害管理一覧を、見通すことだな。
何が原因で仕様を満たせてないのか確認できるから。
意外と、他人の障害からでも学べることはあるので、システムエンジニアやプログラマーは、学ぶ姿勢を常に維持しなきゃいけないと思う。あと、圧倒的当事者意識もね。
あと、最初から完璧なものを作ろうとするマインドセットは、捨てるべきだと思う。
最初から完璧なものができるなら、それに越したことはないけど、それはかなり面倒だし、それを理由に工数をかけすぎるのは、目的を見失っている。
これに陥りやすいひとは、既存のものづくりに執着している人に多い気がする。
建築とか、もろそう。ソフトウェアにはテストするという手法があるから、なんでもかんでも建築の手法を取り入れればいいというものではない。たしか、前に読んだ本ですごく納得したのを今でも覚えてる。何の本だったかは忘れたが。