コードの重複排除を早すぎる段階で行うべきではない理由
- DRY(Don't Repeat Yourself) 原則を厳格に適用しすぎると、「Premature」な抽象化を招き、将来の変更がかえって複雑になる可能性がある
- その重複が本当に不要なのか、それとも時間とともに独立して進化していく機能なのかを考えるべき
- 関数やクラスが同じに見えても、それぞれ異なる文脈やビジネス要件を持つことがある
- コードを短くすることよりも、関数の目的が時間がたっても維持されるかを考えるべき
- 抽象化のリスク: 機能が別々に進化する可能性がある場合、抽象化はむしろ有害になりうる。
- 抽象化を設計するときは、長期的に別々に進化しうる振る舞いを早い段階で結びつけてはいけない
- 疑わしいときは、時間の経過とともに結合を正当化する十分な共通パターンが現れるまで、振る舞いを分離しておくべき
- 小規模なうちは、Prematureな抽象化の複雑さを解消するより、重複を管理するほうが簡単な場合がある
- 開発初期には多少の重複を許容し、抽象化は待つべき
- 将来の要件はしばしば予測できない
- YAGNI(You Aren't Gonna Need It) 原則について考えるべき
- 重複は問題にならないかもしれないし、時間がたてば十分に検討された抽象化の必要性を明確に示すようになる
10件のコメント
そもそも DRY の適用は、繰り返しが発生しているならそれを減らす形で適用すべきであり、
DRY を先行する基準としてコードを考えるのは、誤った適用のように思います。
Hacker News の意見の中では、
DRY 原則の誤解: DRY はコードの重複ではなく、情報/知識の重複を防ぐもの。コードの重複だけに集中すると、不必要な最適化につながることがある。
この意見がいちばん共感できますね。
過渡期には、ああいう悩みをよくしませんか? 完璧なコードなんてないのだから、いつも悩むのが私たちの仕事なのでしょう。ケースバイケースだと思います。
最近は、抽象度の高い構造に対して懐疑的な見方を示す文章をよく見かけます。
MSA、クリーンコード、SOLID、DRY などなど……
人々はそうした言葉に疲れを感じているのかもしれません。
実際のところ、それらは読みやすく、理解しやすく、メモリリークせず、エラーがなく、高速なコードを書こうと考えるときに参考にする道しるべにすぎないのですが……
ほどほどに、いま自分が置かれているビジネスの状況にうまく合わせて適用すればいいのでしょう。
https://velog.io/@kineo2k/…
とても良い文章です。
ウォーターフォールモデルからアジャイルモデルに移行する際には、特に重要だと思います。
アジャイルなのに、未来を予測しすぎています。
どれくらい急げば「性急」なのか?
答えはとても簡単です。最初からやるなら、それは「早計」です。
少し難しい問題は、いつやれば「早計ではない」のか、ということです。
しゃれっぽいですが、最初からやらなければ「性急ではない」ということになりますね^^;
はい、特にアジャイルでは
Hacker Newsの意見
DRY原則の初期適用: 最初からDRY原則を適用するのはよいことだ。似たデータを個別に処理する代わりに、共通のコードベースを使うほうが効率的である。
ベストプラクティスの優先順位: すべてのベストプラクティスが同じ重みを持つわけではない。可読性と凝集性を優先することが重要だ。コードを書くことは、最善のプラクティスを選ぶ過程である。
DRY原則の誤解: DRYはコードの重複ではなく、情報/知識の重複を防ぐためのものだ。コードの重複だけに注目すると、不必要な最適化につながる可能性がある。
再利用性の問題: 特定の機能が別の状況では再利用されないことがある。重複作業を避けるためには、よりよいアプローチが必要だ。
複雑なDRYソリューションの問題: 繰り返しのコードは、複雑なDRYソリューションよりよい場合がある。あまりに早くDRYを適用すると、予期しない構造上の問題を引き起こすことがある。
DRYはベストプラクティスではない: 重複はしばしば抽象化が必要だというシグナルだ。無分別なDRYの適用は、中堅エンジニアがよく犯すミスである。
簡単なコード例: 2つの関数は1つの関数に統合できることがある。リファクタリングの長所と短所を明確に説明することが重要だ。
DRYコードの保守性の問題: DRYコードは複雑になり、保守が難しくなることがある。一方で、WETコードは単純だが、変更の予測可能性が高い。
DRY原則の副作用: DRY原則によってコードベースが複雑になり、保守が難しくなることがある。一部のクリーンコード本は業界に悪影響を与えた。
汎化と性能: 汎化は性能に悪影響を与える可能性がある。特定のデータパターンに合わせたコードの重複が、性能最適化に役立つこともある。