I really like the way functional programmers tend to think about factoring code. There's more of a tendency to think in terms of creating algebras. That forces you to think a lot more carefully about what abstractions you're producing, why, and how they relate to your domain model. And to be more cautious about it.
DRY, by comparison, is an almost offensively crude heuristic.
DRY, by comparison, is an almost offensively crude heuristic.