こんにちは。技術チームの柴田です。
2021年になって初めての勉強会が開催されましたので、共有させていただきます。
今回は高崎さんによるリファクタリングについての勉強会でした。
■リファクタリングとは
ソフトウェアの外部から見た振る舞いは変更せずに、内部の仕組みを改良することです。
リファクタリングは一般に難しいと言われることが多いようですが、どうして難しいのか実務的な面で見ていくと以下のような点が挙げられるようです。
・既存の動いているコードを触るとどうなるかわからないので不安
・新機能の開発ではないので利用者側からのメリットが分かりにくい
大小あると思いますが、上のような問題はどこの開発でも起きているのではないでしょうか?
では実際にリファクタリング を行った時のメリットはなんでしょうか?
考えられるものは以下のような点です。
・内部構造が統一化、簡素化、抽象化されているため、構造の把握がしやすく、新機能の追加や、修正が行いやすい
ずいぶん昔に書いたコードで忘れてしまっている部分・他の人が書いたコードで仕様をそれほど知らない部分などの修正の時に、
複雑なコードだと途方もない時間がかかることがあると思います。
ユーザーから見て簡単そうに見える部分も裏側ではとんでもないほど複雑な処理をしているということはあると思います。
リファクタリングを継続的に行うことでこうした複雑な部分を少しでも減らすことは大きなメリットと言えるでしょう。
ではリファクタリングはどのような観点で行っていくのか見ていくことにします。
■リファクタリングの観点 – テストと関数化 –
● テストについて
リファクタリングにおいてテストを書くことは重要です。テストには2種類あります。
white-box testing
・アプリケーションの内部構造をテストするソフトウェアテストの手法である。構造テストとも呼ばれる。 開発したソフトウェアを中身が見える箱として扱い、内部論理を網羅的にテストする。 プログラムが辿る経路をどれだけ実行したかを基準とする。
black-box testing
・内部構造や動作を覗き見することなく、アプリケーションの機能を調べるソフトウェアテストの手法のこと。 アプリケーションを見えない箱として扱い、入力と結果の整合性を確認する。 このテスト方法は、ソフトウェアテストのすべてのレベル(単体テスト、統合テスト、システムテスト、受け入れテスト)に 適用できる。仕様ベースのテストと呼ばれることもある。
今回の勉強会ではwhite-box testingについて説明してもらいました。
きちんとテストを書いてリファクタリングをしていますか?
もし書いていない場合には、それは一種の賭けのようなものです。
既存コードとの矛盾や、予期せぬエラーに遭遇する確率が跳ね上がります。
それは非常に危険で、リファクタリングをする意味が薄れてしまいます。
リファクタリング をする際には必要に応じてテストを追加します。
テストをパスすることを確認しながら少しずつリファクタリングをしましょう。
● 関数(メソッド)化
役割が複数ある関数などは小さくできるだけ役割が一つになるように関数を分割することが必要です。
またプログラミングの抽象度を統一すると良いそうです。例をあげます。
画像は中華料理のメニューですが、上の画像の場合は抽象度が統一されているので、特に違和感はないと思います。
一方、下の画像ですが、3番目のメニューだけ抽象度が低く、ほとんど作り方の説明になってしまっています。
現実のレストランではこのようなメニューは見かけませんが、プログラミングの場合は時折このようなプログラムに遭遇することがあります。
このようなプログラムは見づらく、また理解もしにくいことが多いです。
プログラミングの抽象度の統一をしようと思った時にはメソッド化を行います。
簡単に書けるから、単純だからメソッド化を行っていない
ということもあるかもしれませんが、それでは抽象度が統一されていません。
簡単な場合、一行程度の場合のコードでも抽象度が統一されるのであればメソッド化は行うべきです。
抽象度が統一されると他の問題が見えてくることがあります。
これは中華料理というモデルの中におかしなメソッドがあるということと同じ意味になると思います。
本来ならフランス料理というモデルの中に存在しているのが望ましいと考えられるので、この場合メソッドの配置場所を適切な位置に戻してあげましょう。
リファクタリングをするタイミング
機能を追加するとき(既存のコードを理解するため)
Bugfixが必要になったとき(コードを分かりやすくするため)
コードレビューのとき(コードの理解水準の統一のため。自 分にとって分かりやすいは他人からは違うかも?)
システム、コードの理解を深めたいとき(チームメンバーの 理解度UP。アサインされる業務だけでは偏りがある)
所感
ビジネスにおけるITの比率が高まってきた今こそ、リファクタリングを行うことによって迅速に機能追加・Bugfixを行なっていけたらと思います。