중복 코드를 제거하는 방법 (일반)?


10

OO 언어 (예 : Java로 제한되지 않음)에서 발생 범위에 따라 중복 코드를 어떻게 수정합니까? 나는 예를 들어 시작할 것이다.

  • 동일한 클래스 (범위)에서 추출 방법 리팩토링 (수정)을 수행하십시오.
  • 동일한 계층 구조 (범위)의 클래스에서 추출 방법 및 풀업 (수정)을 수행합니다.
  • ...

동일한 클래스로 DRY 원칙 (반복하지 말 것)을 구현하는 예를 살펴보십시오. geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance

SO의 원래 질문 ( stackoverflow.com/questions/7380946/… )이 마감되었습니다. 그래서 여기로 옮겼습니다.
Peter Kofler

답변:


8

최근에 나는 Uncle Bob의 "Clean Code"에서 내 질문에 대한 좋은 답변을 찾았습니다. 그는 세 가지 유형의 복제를 차별화합니다.

동일한 코드 조각은 단일 방법으로 교체해야합니다. 그래서 해결책은 방법을 추출하고 일반적인 행동에 위임하는 것입니다.

  • 동일한 방법으로 로컬 변수 추출을 수행하고 재사용하십시오.
  • 동일한 클래스에서 추출 메소드 리팩토링을 수행하십시오.
  • 동일한 계층 구조의 추출 방법에서 추출 방법을 사용합니다. 메소드의 위치를 ​​찾기 위해 계층이 작성 될 수 있습니다.
  • 별도의 계층 클래스에서 새 개체에 위임을 사용합니다.
  • 메소드가 엔 클로징 상태가 필요하지 않은 경우, "lib"패턴이 적용될 수 있습니다 (정적 메소드의 컨테이너, 일반적으로 SthUtil또는 이라고 함 SthLib).

의 경우 switch/caseif/else조건의 동일한 세트가 항상 시험 .

  • 이것들은 다형성으로 대체되어야합니다.

유사한 알고리즘을 구현하는 모듈 . 클론 탐지기는 찾을 수 없으므로 찾기가 가장 어렵습니다.

  • 스코프가 클수록 디자인 패턴이 사용됩니다. 템플릿 메소드 디자인 패턴은 클래스 계층 구조 내의 알고리즘에 적용될 수 있습니다.
  • 전략 설계 패턴은 다른 장소에서 사용되는 모든 알고리즘에 적용될 수 있습니다.

다른 버전의 라이브러리를 다룰 때 Oded가 언급 한 유효한 요점

  • 단일 버전으로 통합합니다. 외관 디자인 패턴이 여기에 도움이 될 수 있습니다.

결국 내 질문에 대답하는 가장 좋은 문장은 stimms입니다.

OO 언어에서 사용되는 코드 재사용 방법은 객체입니다.


5

일반적으로 중복 코드를 단일 장소로 통합하고 원래 복제 사이트가 통합 장소를 호출하는지 확인하십시오.

예제에서 클래스 내에서 이것은 추출 된 메소드이고 클래스 세트 내에서 기본 클래스 내의 풀업 메소드입니다.

복사-붙여 넣기 코드에서 이것은 복제본을 제거하고 모든 사용자가 이제 단일 사본을 사용하도록 보장하는 것입니다 (수준에 상관없이).

다른 버전의 라이브러리를 다룰 때는 가능한 한 단일 버전으로 통합하십시오.


기본 클래스에있는 경우 "풀다운"방법이 아닙니까? 나는 항상 기본 클래스가 파생 클래스 아래에 물리적으로 있다고 생각합니다.
Dave Nay

리팩토링 책에서 올바른 이름은 "풀업"입니다.
Peter Kofler

1

나는 이것이 개방형 질문이라고 생각하지만 코드의 상태에 달려 있습니다. 문맥에 따라 중복 코드를 약간 견딜 수 있음을 의미합니다. 3의 규칙이이 문제에 좋습니다.

세 가지 규칙 처음으로 무언가를 할 때, 그냥하면됩니다. 두 번째로 비슷한 일을 할 때 복제에서 승리하지만 어쨌든 중복 된 일을합니다. 세 번째로 비슷한 일을하면 리팩터링합니다.

이것은 꽤 논쟁의 여지가 있지만이 게시물 은 중복 코드를 허용하는 경우도 고려합니다.


1
"3의 규칙"에 대해 +1 나는 그것이 얼마나 광범위하게 적용되는지에 항상 놀랐습니다.
andy mango

1
이것은 어떻게 질문에 대답하지 않습니다 .
Jan Doggen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.