別の質問の答えで述べたように、私のアプローチは次のとおりです。
- 特定の問題を初めて解決するとき、私はそれをやり遂げます。
- 2回目(つまり、同様の問題を解決するとき)私は思う:hm、多分私は自分自身を繰り返しているが、今のところ簡単なコピーアンドペーストに行きます。
- 3回目に思う:フム、私は自分自身を繰り返す->それを一般的にする!
つまり、2つまでの別の原則(YAGNI)がDRYに勝ちます。しかし、3(または私が本当に怠けている場合は4)から始めて、私はそれを必要とするようであるので、DRYに従います。
更新
私の最近の経験からのいくつかのさらなるアイデア。別のチームが開発した2つのコンポーネントAとBを製品に適合/統合する必要がありました。まず、2つのコンポーネントAとB Bは互いに非常に類似しているため、アーキテクチャが多少異なるという事実に既に悩まされていました。2番目:サブクラスを使用して、本当に必要なものだけをオーバーライドして良かったので、それらを適応させる必要がありました。
そこで、これら2つのコンポーネント(それぞれ約8つのC ++クラスで構成されています)のリファクタリングを開始しました。AとBの両方に共通のアーキテクチャを用意し、サブクラスを定義して必要な機能を追加しました。このようにして、2つの新しいコンポーネントA 'とB'は既存のコンポーネントから派生します。
既存のコードから一般的で明確な構造を取得しようとして2週間後、毎日の会議で元のコードが面倒であまり進歩していないことを説明しなければならなかったので、上司に話しました。これらの2つの新しいコンポーネントA 'およびB'以外は必要ないことがわかりました(4つまたは6つではなく、2つだけでした)。
わかりましたので、AとBからクラスの大規模なコピーと名前変更を行い、コードのコピーの適応を開始しました。あと2週間で動作するようになりました(今でもバグ修正を行っています)。
利点:機能がほぼ完成し、すべてのバグを修正したら完成しました。AとBのすべてのリファクタリングとテストを保存しました。
欠点:2週間前、他のチームはAとBが使用する別のコンポーネントCを変更しました。AとBを適合させましたが、A 'とB'も壊れていたため、自分で変更する必要がありました。これにより、修正が必要な新しいバグが発生しました。A 'とB'がコードの大部分をAとBと共有している場合、この余分な作業はおそらく不要だったでしょう。
そのため、コードの複製は常に危険です。トレードオフを見つけることは常に問題であり、多くの場合それは簡単ではないと思います。