중복코드

Duplicate code

컴퓨터 프로그래밍에서 중복 코드는 프로그램 내 또는 동일한 엔티티가 소유하거나 유지 관리하는 다른 프로그램 간에 두 번 이상 발생하는 일련의 소스 코드입니다.일반적으로 중복 코드는 여러 [1]가지 이유로 바람직하지 않은 으로 간주됩니다.최소 요건은 보통 우연이 아닌 중복으로 간주되기 위해 시퀀스에 표시되어야 하는 코드의 양에 적용됩니다.중복된 코드 시퀀스는 코드 클론 또는 단순한 클론이라고도 하며, 소스 코드에서 중복을 찾는 자동화된 프로세스를 클론 탐지라고 합니다.

예를 들어 공백 문자와 코멘트가 무시된 경우에만 문자 대 문자 대 문자 대 코멘트가 동일하거나 토큰 대 토큰이 동일하거나 토큰 대 토큰이 때때로 변동하는 등 2개의 코드시퀀스가 서로 중복될 수 있습니다.기능적으로만 동일한 코드 시퀀스도 중복된 코드로 간주될 수 있습니다.

출현

중복 코드를 작성하는 방법에는 다음과 같은 것이 있습니다.

  • Scounging: 코드 섹션이 "작동하기 때문에" 복사됩니다.대부분의 경우 이 작업은 변수 이름 변경이나 코드 삽입/삭제 등 복제된 코드의 약간의 수정이 수반됩니다.언어는 거의 항상 다른 장소에서 코드의 복사본을 호출할 수 있도록 허용하고, 그래서 그것은 여러 가지 목적을 제공할 수 있지만, 대신 프로그래머는 아마도 그들이 있기 때문에 다른 복사본을 만듭니다.
    • 언어를 올바르게 이해하지 못하다
    • 제대로 할 시간이 없다, 또는
    • 액티브 소프트웨어의 로트 증가에 개의치 않습니다.

또, 프로그램의 다른 부분과 매우 유사한 기능이 요구되어 개발자가 독립적으로 다른 부분에 존재하는 것과 매우 유사한 코드를 작성할 수도 있습니다.연구에 따르면 이와 같이 독립적으로 다시 작성된 코드는 일반적으로 구문적으로 [2]유사하지 않습니다.

코드 자동 생성도 중복 발생의 또 다른 원인입니다.복제된 코드가 있으면 속도나 개발의 용이성을 높일 수 있습니다.실제 제너레이터는 소스 코드에 중복되는 것을 포함하지 않고 생성되는 출력만 포함합니다.

고치는

중복 코드는 일반적으로 코드를 자체 장치(기능 또는 모듈)로 이동하고 원래 사용되었던 모든 위치에서 해당 장치를 호출함으로써 수정됩니다.컴포넌트가 집중화된 장소에 있는 오픈 소스 개발 스타일을 사용하는 것도 복제에 도움이 될 수 있습니다.

비용과 이점

중복된 기능을 포함하는 코드는 다음과 같은 이유로 지원하기가 더 어렵습니다.

  • 단순히 더 길고,
  • 업데이트가 필요한 경우 동일한 코드의 다른 인스턴스가 있는지 더 확인하지 않고 코드의 복사본 하나가 업데이트될 위험이 있습니다.

한편, 코드의 1개의 카피가 다른 목적으로 사용되고 있어 적절히 문서화되어 있지 않은 경우는, 1개의 목적으로 갱신될 우려가 있습니다만, 이 갱신은 그 외의 목적으로는 불필요하거나 적절하지 않습니다.

이러한 고려사항은 소스 코드에 기능의 복사본이 1개만 있는 경우 자동으로 생성되는 코드에는 해당되지 않습니다.

예전에는 메모리 용량이 한정되어 있을 때는 중복 코드가 더 많은 공간을 차지한다는 단점이 있었지만, 현재는 이것이 문제가 되지 않습니다.

소프트웨어 취약성이 있는 코드가 복사될 때 개발자가 이러한 [3]복사본을 인식하지 못하면 복사된 코드에 취약성이 계속 존재할 수 있습니다.중복 코드를 리팩터링하면 코드 라인, 사이클로매틱 복잡성, 커플링 등 많은 소프트웨어 메트릭이 개선됩니다.이로 인해 컴파일 시간이 단축되고 인지 부하가 낮아지며 인적 오류가 줄어들며 잊어버리거나 간과하는 코드 조각이 줄어들 수 있습니다.그러나 모든 코드 복제를 리팩터링할 [4]수 있는 것은 아닙니다.프로그래밍 언어가 불충분하거나 지나치게 복잡한 추상화를 제공하는 경우, 특히 동시 편집 등의 사용자 인터페이스 기술을 지원하는 경우 클론이 가장 효과적인 솔루션이 될 수 있습니다.또한 리팩터링 시 코드가 깨질 위험이 유지 보수상의 이점보다 클 수 있습니다.[5] Wagner, Abdulkhaleq 및 Kaya의 연구에 따르면 복제를 동기화하기 위해서는 추가 작업이 필요하지만, 관련된 프로그래머가 중복 코드를 인식한다면 중복되지 않은 코드보다 훨씬 많은 장애가 발생하지 않는다고 합니다.[6][disputed ]

중복 코드 검출 중

중복 코드를 검출하기 위한 다양한 알고리즘이 제안되고 있습니다.예를 들어 다음과 같습니다.

기능적으로 중복되는 코드의 예

정수 배열평균을 계산하려면 다음 코드 스니펫을 고려하십시오.

외부 인트 어레이_a[]; 외부 인트 어레이_b[];   인트 sum_a = 0;  위해서 (인트 i = 0; i < > 4; i++)    sum_a += 어레이_a[i];  인트 평균_a = sum_a / 4;   인트 sum_b = 0;  위해서 (인트 i = 0; i < > 4; i++)    sum_b += 어레이_b[i];  인트 평균_b = sum_b / 4; 

2개의 루프는 단일 함수로 다시 쓸 수 있습니다.

인트 calc_평균_4의 평균(인트* 배열) {    인트  = 0;    위해서 (인트 i = 0; i < > 4; i++)         += 배열[i];     돌아가다  / 4; } 

또는 일반적으로 배열 내의 요소 수를 매개 변수화하는 것이 좋습니다.

위의 함수를 사용하면 루프 중복이 없는 소스 코드가 생성됩니다.

외부 인트 어레이1[]; 외부 인트 어레이2[];  인트 평균 1 = calc_평균_4의 평균(어레이1); 인트 평균 2 = calc_평균_4의 평균(어레이2); 

이 간단한 경우 컴파일러는 양쪽 콜을 함수에 인라인 하도록 선택할 수 있습니다.그 결과 머신 코드는 위의 중복된 예와 중복되지 않은 예에서 모두 동일합니다.함수가 인라인 되어 있지 않으면 함수 호출의 추가 오버헤드가 실행되는 데 시간이 오래 걸릴 수 있습니다(대부분의 고성능 언어에서는 10개의 프로세서 명령).이론적으로 이 추가 실행 시간은 문제가 될 수 있습니다.

메서드에 의해 대체된 코드를 통한 중복 코드 수정 예제

「 」를 참조해 주세요.

레퍼런스

  1. ^ Spinellis, Diomidis. "The Bad Code Spotter's Guide". InformIT.com. Retrieved 2008-06-06.
  2. ^ Elmar Juergens, Florian Deissenboeck, Benjamin Hummel의 복사 및 붙여넣기 이상의 코드 유사성.
  3. ^ Li, Hongzhe; Kwon, Hyuckmin; Kwon, Jonghoon; Lee, Heejo (25 April 2016). "CLORIFI: software vulnerability discovery using code clone verification". Concurrency and Computation: Practice and Experience. 28 (6): 1900–1917. doi:10.1002/cpe.3532. S2CID 17363758.
  4. ^ Arcelli Fontana, Francesca; Zanoni, Marco; Ranchetti, Andrea; Ranchetti, Davide (2013). "Software Clone Detection and Refactoring" (PDF). ISRN Software Engineering. 2013: 1–8. doi:10.1155/2013/129437.
  5. ^ C., C.; M.W. Godfrey, "유해하다고 여겨지는 복제", 제13회 리버스 엔지니어링 실무회의, 2006년 10월 19-28페이지
  6. ^ Wagner, Stefan; Abdulkhaleq, Asim; Kaya, Kamer; Paar, Alexander (2016). "On the relationship of inconsistent software clones and faults: an empirical study". Proc. 23rd IEEE International Conference on Software Analysis, Evolution, and Reengineering (SANER 2016): 79–89. arXiv:1611.08005. doi:10.1109/SANER.2016.94. ISBN 978-1-5090-1855-0. S2CID 3154845.
  7. ^ 브렌다 S. 베이커중복 코드 식별 프로그램.Computing Science and Statistics, 1992년 24:49 ~ 57.
  8. ^ Ira D. Baxter 등추상 구문 트리를 사용한 클론 검출
  9. ^ Stephane Ducasse의 Matthias Rieger가 Wayback Machine에 2006-06-29를 아카이브한 중복 코드 검출.
  10. ^ 2011년 제18회 아시아 태평양 소프트웨어 엔지니어링 컨퍼런스에서 Y.와 Y.CMD: Count Matrix Based Code Detection(매트릭스 기반 코드 클론 검출) IEEE, 2011년 12월, 페이지 250–257.
  11. ^ Chen, X, Wang, A.Y., & Tempero, E.D. (2014).코드 클론 검출 스터디의 레플리케이션과 레플리케이션.ACSC에서 (105-114페이지)
  12. ^ 불리체프, 피터, 마리우스 미네아."통합 방지 기능을 사용하여 중복 코드 탐지"소프트웨어 공학에 관한 봄여름 젊은 연구자 토론회 진행.No. 2. Федеральное государственное бюджетное учреждение науки Институт системного программирования Российской академии наук, 2008.

외부 링크