다른 질문에 대한 답변에서 언급했듯이 내 접근 방식은 다음과 같습니다.
- 특정 문제를 처음 해결하면 문제가 해결됩니다.
- 두 번째로 (즉, 비슷한 문제를 해결할 때) 생각합니다. 흠, 아마도 반복하고 있지만 지금은 빠른 복사하여 붙여 넣기로 갈 것입니다.
- 내가 생각하는 세 번째 시간 : 흠, 나는 나 자신을 반복하고 있습니다-> 그것을 일반으로 만드십시오!
즉, 2까지, 또 다른 원칙 (YAGNI)이 DRY를 이깁니다. 그러나 3 (또는 정말로 게으른 경우 4)부터 시작하면 필요할 것 같아서 DRY를 따릅니다.
최신 정보
최근 경험에서 얻은 몇 가지 추가 아이디어. 다른 팀에서 개발 한 두 가지 구성 요소 A와 B를 제품에 적용 / 통합해야했습니다. 첫째, 두 구성 요소 A와 B는 서로 매우 유사하므로 아키텍처가 약간 다르다는 사실 때문에 이미 혼란 스러웠습니다. 둘째 : 하위 클래스를 사용하고 실제로 필요한 것을 재정의하기 때문에 기꺼이 적응해야했습니다.
그래서이 두 가지 구성 요소 (각각 약 8 개의 C ++ 클래스로 구성)를 리팩토링하기 시작했습니다. A와 B에 공통 아키텍처를 구축하고 서브 클래스를 정의하여 필요한 기능을 추가하고 싶었습니다. 이런 식으로 우리의 두 가지 새로운 구성 요소 A '와 B'는 기존 구성 요소에서 파생되었을 것입니다.
2 주 동안 기존 코드에서 공통적이고 명확한 구조를 얻으려고 노력하고 일상적인 회의에서 원래 코드가 너무 지저분해서 진행이 거의 이루어지지 않았다고 설명해야했는데, 나는 상사에게 말했다. 우리는이 두 가지 새로운 구성 요소 A '와 B'보다 더 많은 것이 필요하지 않다는 것을 관찰했습니다.
좋아, 그렇게하십시오 : 나는 A와 B의 클래스를 대량으로 복사하고 이름을 바꾸고 코드 사본을 조정하기 시작했습니다. 2 주 안에 더 작동하도록했습니다 (여전히 버그 수정을하고 있습니다).
장점 : 이제 거의 기능이 완료되었으며 모든 버그를 수정하면 완료되었습니다. A와 B의 모든 리팩토링과 테스트를 저장했습니다.
단점 : 2 주 전에 다른 팀이 A와 B에서 사용하는 다른 구성 요소 C를 변경했습니다. A와 B를 수정했지만 A '와 B'도 고장 났고 우리는 스스로 변경해야했습니다. 이것은 우리가 고쳐야 할 새로운 버그를 소개했습니다. A '와 B'가 코드의 대부분을 A와 B와 공유했다면이 추가 작업은 불필요했을 것입니다.
따라서 코드 복제는 항상 위험합니다. 나는 그것이 항상 절충점을 찾는 문제라고 생각하며 종종 쉽지 않습니다.