Skip to content
This repository was archived by the owner on Mar 20, 2023. It is now read-only.

Commit d448935

Browse files
committed
refactoring
1 parent 7483034 commit d448935

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

books/refactoring.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,52 @@ const main = () => {
241241

242242
- 単なる API とみなせて、かつ今後の修正の必要がないとき
243243
- ゼロから書き直したほうが早いとき
244+
245+
### リファクタリングの問題点
246+
247+
#### 新機能の実装が遅くなる
248+
249+
- リファクタの目的はプログラミングの速度を上げること
250+
- よって実装は遅くならない
251+
- ただしトレードレードオフもある。このあたりは経験がモノを言う。
252+
- リファクタする場合の例
253+
- 以後の作業が楽になるとき
254+
- 何度も同じ問題が起きているとき
255+
- 同じような醜いコードに何度も出くわしているとき
256+
- リファクタしない場合の例
257+
- 新機能が非常に些細なもので、リファクタを後回しにできるとき
258+
- めったに触らない箇所であるとき
259+
- 道徳的な理由でリファクタしようとするのは危険
260+
- 「コードが美しくなる」とか
261+
- 「(しばしば原理主義的な)すばらしいプラクティスにコードを近づける」とか
262+
- 経済的な基準でのみ判断せよ
263+
264+
#### コードの所有権
265+
266+
- コードの部分ごとにオーナーを設定し、変更を承認するようなやり方が良いのでは
267+
- これは、以下の 2 つの間を取ったもの
268+
- 所有権が強すぎて、リファクタが困難な状態
269+
- e.g. 関数名を変えたときに、呼び出し元のコードを変更できない場合など。こういったときは古い関数から新しい関数を呼び出すようにして、古い関数には deprecated を指定するなどするものの、最悪の場合、古い関数は永遠に残り続けることになる。
270+
- 所有権がなくて、誰もが好き勝手に変更を加えてカオスになった状態
271+
272+
#### ブランチ
273+
274+
- Feature branch 方式はリファクタリングと相性がとても悪い
275+
- ブランチの生存期間とマージの困難さは指数関数的に相関する
276+
- マージが難しくなることを理由にリファクタを諦める場合もあるくらい
277+
- バージョン管理システムは意味的な変更にすこぶる弱い
278+
- 意味的な変更 ≒ リファクタリング。例えば関数名の変更など
279+
- Trunk-based なブランチ戦略がおすすめ
280+
- 1 日 1 回はメインブランチに統合する方法
281+
- ただし、大きな機能を小さな機能に分割したり、分割できない大きな機能を無効化する Feature flags の仕組みを作ったりするなどの準備が必要
282+
- Feature branch 方式と併用も可能。何れにせよなるべく頻繁にメインブランチにマージする。
283+
284+
#### テスト
285+
286+
- テストは必須。テストがあれば:
287+
- リファクタが容易になる
288+
- 間違いにすぐ気づくので、見るべきコードの範囲が狭まるから
289+
- 新機能追加がやりやすくなる
290+
- 新たに埋め込んでしまったバグにすぐ気づくから
291+
- テストがない or 少ない場合は、IDE に安全が保証されている自動実行できる種類のリファクタであれば、実施できるかも
292+
- ただし注意深く手順に従う必要があるし、言語仕様にも依存するので比較的高度なやり方

0 commit comments

Comments
 (0)