多くの場合、「複雑な」パッチ/チェンジリストは、一度に多くの異なることを行うものです。新しいコード、削除されたコード、リファクタリングされたコード、移動されたコード、拡張されたテストがあります。全体像が見えにくくなります。
一般的な手がかりの手がかりは、パッチが巨大であるが、その説明が小さいことです:「$ FOOを実装する」。
そのようなパッチを処理する合理的な方法は、一連のより小さな自己完結型の断片に分割するように依頼することです。単一責任の原則で、関数は1つのことだけを行うべきであると述べているように、パッチも1つのことだけに焦点を当てる必要があります。
たとえば、最初のパッチには機能的な変更を行わない純粋な機械的リファクタリングが含まれている場合があり、その後、最終的なパッチは、注意散漫と赤ニシンの少ない$ FOOの実際の実装とテストに集中できます。
多くの新しいコードを必要とする機能の場合、シリーズの最後のパッチが実際に新しいコードを呼び出すまで(フラグフリップ)、製品の動作を変更しないテスト可能なチャンクに新しいコードを導入できます。
これを巧みに行うことに関して、私は通常それを私の問題として言い、その後著者の助けを求めます。一緒?" 小さいステップについて具体的な提案をすることが必要な場合があります。
「Implement $ FOO」のような大きなパッチは、次のような一連のパッチに変わります。
- $ FOOを実装するためにベクター以外のシーケンスで呼び出す必要があるため、イテレーターのペアを使用するFrobnicateの新しいバージョンを紹介します。
- Frobnicateの既存のすべての呼び出し元を切り替えて、新しいバージョンを使用します。
- 古いFrobnicateを削除します。
- フロブニケートはやりすぎでした。しわのステップを独自のメソッドに組み込み、そのためのテストを追加します。
- テストでZerzifyを紹介します。まだ使用されていませんが、$ FOOに必要です。
- Zerzifyと新しいFrobnicateの観点から$ FOOを実装します。
手順1〜5は製品に機能的な変更を加えないことに注意してください。すべての適切なテストがあることを確認するなど、レビューするのは簡単です。ステップ6がまだ「複雑」であっても、少なくとも$ FOOに焦点を合わせています。そして、ログから、$ FOOがどのように実装されたか(そしてFrobnicateが変更された理由)について、より良いアイデアが得られます。