「Don't Repeat Yourself」(DRY)とは、変更される可能性のある情報の繰り返しを減らし、変更される可能性の低い抽象化に置き換えたり、そもそも冗長性を回避するデータ正規化を使用したりすることを目的としたソフトウェア開発の原則です。
DRY原則は、「システム内のすべての知識は、単一の、曖昧さのない、権威ある表現を持たなければならない」と述べられています。この原則は、アンディ・ハントとデイブ・トーマスが著書『The Pragmatic Programmer』で提唱しました。[ 1 ]彼らは、データベーススキーマ、テストプラン、ビルドシステム、さらにはドキュメントに至るまで、この原則をかなり広く適用しています。[ 2 ] DRY原則がうまく適用されると、システムの単一要素の変更は、論理的に無関係な他の要素の変更を必要としません。さらに、論理的に関連する要素はすべて予測可能かつ均一に変更されるため、同期が維持されます。[ 3 ]トーマスとハントは、コード内でメソッドやサブルーチンを使用するだけでなく、コードジェネレータ、自動ビルドシステム、スクリプト言語を利用して、レイヤー全体でDRY原則を遵守しています。
DRYの特殊なケースとして、単一選択の原則があります。これはベルトラン・メイヤーによって次のように定義されました。「ソフトウェアシステムが一連の選択肢をサポートする必要がある場合、システム内の1つのモジュールだけがそれらの完全なリストを知っているべきである。」[ 4 ]これはEiffelの設計時に適用されました。
DRY の反対の考え方は WET と呼ばれ、一般的にはwrite everything twice [ 5 ]の略語と解釈されています(あるいはwrite every time、we enjoy typingまたはwaste everyone's timeとも解釈されます)。WET ソリューションは、開発者が Web アプリケーションのフォームにコメント フィールドを追加するなどのタスクを負うマルチティア アーキテクチャでよく使用されます。テキスト文字列「comment」は、ラベル、HTML タグ、読み取り関数名、プライベート変数、データベース DDL、クエリなどで繰り返される可能性があります。DRY アプローチでは、最も重要なものを除くすべての編集タスクを削減または排除するフレームワークを使用することで、この冗長性を排除し、新しい知識変数を 1 か所に追加できる拡張性を残します。[ 6 ] 「DRY」プログラミングの代替としての「WET」の概念化は、Java の世界では少なくとも 2002 年以来存在していますが、誰がこの用語を考案したかは不明です。[ 7 ]
抽象化へのもう 1 つのアプローチは、性急な抽象化を避けること(AHA) です。AHA は、エンジニアがソフトウェアの抽象化に投資すればするほど、その投資のコストを回収できないと認識するようになる (サンクコストの誤謬) という理解に基づいています。そのため、エンジニアは要件が変わるたびに同じ抽象化を繰り返し続ける傾向があります。AHA プログラミングは、WET ソリューションと DRY ソリューションの両方が、必然的に硬直的で保守が困難なソフトウェアを生み出すことを前提としています。抽象化から始めるのではなく、または特定の数の重複で抽象化するのではなく、抽象化が必要なときに、または重複自体が障壁となり、抽象化がどのように機能する必要があるかがわかっているときに抽象化を行うと、ソフトウェアはより柔軟で堅牢になります。ケント C. ドッズによれば、これはまず変更を最適化し、時期尚早な最適化を避けることです。[ 8 ] [ 9 ]
この用語はソフトウェアエンジニアのCher Scarlettによって造語され、この手法は元々ソフトウェアエンジニアで著者のSandi Metzによって「間違った抽象化よりも重複を優先する」と説明された。[ 9 ]
Don't Repeat Yourself (or Others)