때때로 코드 중복은 "pun"의 결과입니다. 두 가지가 동일하게 보이지만 그렇지 않습니다.
과도하게 요약하면 시스템의 실제 모듈성이 손상 될 수 있습니다. 모듈화 체제 하에서 "무엇이 변경 될 가능성이 있습니까?"를 결정해야합니다. "안정적인 것은 무엇입니까?" 안정된 것은 인터페이스에 들어가고 불안정한 것은 모듈의 구현에 캡슐화됩니다. 그런 다음 상황이 변경되면 변경해야 할 사항이 해당 모듈과 분리됩니다.
리팩토링은 안정하다고 생각한 것 (예 :이 API 호출은 항상 두 개의 인수를 취해야 함)을 변경해야 할 때 필요합니다.
따라서이 두 개의 중복 된 코드 조각에 대해 다음과 같이 묻습니다. 하나에 필요한 변경이 반드시 다른 하나도 변경되어야한다는 것을 의미합니까?
그 질문에 어떻게 대답하면 좋은 추상화가 무엇인지에 대한 더 나은 통찰력을 얻을 수 있습니다.
디자인 패턴도 유용한 도구입니다. 아마도 중복 코드가 어떤 형태의 순회를 수행하고 있으며 반복자 패턴을 적용해야 할 것입니다.
중복 된 코드에 여러 개의 반환 값이있는 경우 (단순한 추출 방법을 수행 할 수없는 경우) 반환 된 값을 보유하는 클래스를 만들어야합니다. 이 클래스는 두 코드 조각 사이에서 다른 각 지점에 대해 추상 메서드를 호출 할 수 있습니다. 그런 다음 클래스의 두 가지 구체적인 구현을 수행합니다. 각 조각마다 하나씩. [이것은 효과적으로 템플릿 메소드 디자인 패턴이며 C ++의 템플릿 개념과 혼동되지 않습니다. 또는 전략 패턴으로보고있는 내용을 더 잘 해결할 수도 있습니다.]
그것에 대해 생각하는 또 다른 자연스럽고 유용한 방법은 고차 함수입니다. 예를 들어, 코드를 추상화하기 위해 람다를 만들거나 익명의 내부 클래스를 사용합니다. 일반적으로 복제를 제거 할 수 있지만 실제로 변경이있을 경우 (하나가 변경되면 다른 하나도 변경되지 않는 한) 모듈성을 손상시키지 않을 수 있습니다.