今日学んだこと:Tidy First?について
概要
今日はTidy First?に関してまとめた。
ポイント1
ガード節 ガード節を設定したら、その条件を説明ヘルパーに置き換えたり、説明変数に抽出したりするとよい。
デッドコード 散らかったデッドコードを取り除いたら、読む順番や凝集の順番への並べ替えの方法が見えてくるかもしれない。
シンメトリーを揃える 同じことをしているコードは同じように、違うことをしているコードは違って見えるようにすると、関連するコードをきちんと読む順番にまとめられるだろう。以前、複数のウェブのエントリーポイントを含んだファイルでこれをしたことがある。それらが同じように見えるようになったら、残りのコードへの目次のようなものとして、自然とファイルの先頭でグループ化していた。
新しいインターフェイス、古い実装 ピカピカの新しいインターフェイスを手に入れたら、使いたくなるだろう。呼び出し元を自動で書き換えるツールがなければ、一度に1つずつ変換しなければいけない。これが、初めてファンアウトに遭遇する瞬間だ。ファンアウトとはつまり、整頓がさらに多くの整頓を誘発し、それらの整頓がさらに多くの整頓を誘発する現象だ(これについては、結合とべき乗則について話すときに詳しく説明する)。
読む順番 読む順番が確立できたら、シンメトリーを揃える方法が見えてくるかもしれない。以前は、要素が離れすぎて共通点が見えなかった。
凝集の順番 凝集の順番にグループ化された要素は、子要素に抽出する候補となる。たとえば、ヘルパーオブジェクトは整頓の対象外だ。ただし、整頓に慣れて自信がついてきたら、さらなる振る舞いの変更を簡単にする、より大きな規模の設計変更がおのずと見えてくる。
説明変数 説明変数への代入の右側は、説明ヘルパーの候補だ(このあと、変数をインライン化できるかもしれない)。変数名による説明で冗長なコメントを消せるかもしれない。
説明定数 説明定数を抽出することは凝集の順番につながる。同期して変更する定数をグループ化することは将来の変更を簡単にする。定数をどこに置くか、どう並べ替えるかにはさまざまな考え方がある。ここではすべては取り上げないが、あなたの仕事が簡単になるものを選ぼう。おっと、より簡単に、だ。
明示的なパラメーター パラメーターを明示的にしたら、それらのパラメーターセットをオブジェクトに集約し、コードをオブジェクトに移動できるかもしれない。 これは整頓の範囲外ではあるが、整頓によって見えてくる新たな抽象化に注目してほしい。これまであなたが発見したいちばん強力な抽象化のいくつかは、実行中のコードから派生したものだ。それらは推測からは決して生み出すことはできなかっただろう。
ステートメントを小分けにする 小分けにしたチャンクの前に説明コメントをつけることができる。チャンクを説明ヘルパーとして抽出してもよい。
ヘルパーを抽出する ヘルパーを抽出したあとは、ガード節や説明定数、説明変数を取り入れたり、冗長なコメントを削除したりできるだろう。
ひとかたまり 大きくて、見るからに散らかったものを作ってしまったら、文をチャンクに分けたり、説明コメントや説明ヘルパーを追加したりして整頓しよう。
説明コメント できれば、コメント内の情報はコード内に移動しよう。説明変数や説明定数、説明ヘルパーを導入する。
冗長なコメントを削除する 冗長なコメントのノイズを取り除くことで、より良い読む順番が見えてきたり、明示的なパラメーターへの道筋が見えてきたりする。 コメント反対派だと非難されるのでもう一度強調しておくが、削除してよいのは完全に冗長なコメントだけだ。コメントが完全に冗長なものとなる状態を目指して整頓しよう。ソフトウェア設計者としてのあなたの仕事は、あなた自身とチームを現在から将来にわたって成功に導くことだ。 変更はソフトウェア開発において支配的なコストであり、コードの理解は変更の支配的なコストである。よって、動作するコードの構造と意図を伝えることは、鍛えられるなかでもいちばん価値のあるスキルの1つだ。コメントはあくまで構造と意図を伝える方法の一形態であり、整頓はそれとは異なる道から構造と意図の伝達の限界を追い求める試みであると言えるだろう。
ポイント2
整頓しない: このコードを二度と変更しない。 設計の改善から学ぶことはない。 改めて整頓する: すぐに見返りがない大きなかたまりの整頓を抱えている。 整頓を完了することで最終的には見返りがある。 小出しに整頓できる。
あとに整頓する: 将来の整頓まで待つとかえって高くつく。 あとに整頓しないとやりきった感が得られない。
先に整頓する: すぐに見返りがある。たとえば、理解が向上したり、振る舞いを安く変更できたりする。 何をどのように整頓すればよいかわかっている。
コスト:整頓によってコストが小さくなったり、コストが発生する時期が遅くなったり、コストが発生する可能性が低くなったりするか?
収益:整頓によって収益が大きくなったり、収益を手にする時期が早くなったり、収益を生む可能性が高くなったりするか?
結合:整頓によってより少ない要素の変更になるか? 凝集:整頓によって変更が必要な要素が、より小さく、もっと集中した範囲になるか?
参考文献・リンク
Tidy First? -個人で実践する経験主義的ソフトウェア設計