entangled -> separated -> generalized
ごちゃごちゃのコードはそのまま汎化できない.
コードを整理して機能別にまとまりを作って、共通部分を汎化用インターフェースとして切り出す.
抽象化 -> 最上層: 複雑性↓、下層: 複雑性↑
汎化用インターフェース自体が複雑性を導入する。
それに勝る、上層部での複雑性低減が目的.
その前段階となる「まとまりの分離」というか「フローの整理」的なやつは複雑性を導入しない.
コード量も階層も増えず、ただ絡まった糸を解くだけ.
最初から絡まっていないコードを書くのがプログラマの腕.
"抽象化は道具であって目的ではない"
教条的なインターフェースはYAGNI
分離さえしておけば、インターフェースの導入は簡単に終わる(必要に合わせていつでも簡単に導入できる)