문제

내가 지금 보는 용어는 "순환 복잡성"입니다. 여기에서 "언어 X의 CC를 계산하는 방법"또는 "최소 CC로 어떻게 수행합니까?

ndepend 웹 사이트, 나는 기본적으로 "방법의 결정 수. 코드를 이해하기 쉽게 유지하기 위해 if 진술의 수를 상당히 낮게 유지하고 싶을 수도 있지만 이것이 실제로 모든 것이 있습니까?

아니면 더 깊은 개념이 있습니까?

도움이 되었습니까?

해결책

나는 더 깊은 개념을 모른다. 나는 그것이 일반적으로 유지 보수 성 지수의 맥락에서 고려된다고 생각합니다. 특정 방법 내에 분기가 많을수록 해당 방법의 운영에 대한 정신 모델을 유지하는 것이 더 어려워집니다 (일반적으로).

사이클 성 복잡성이 높은 방법은 단위 테스트에서 전체 코드 범위를 얻기가 더 어렵습니다. (감사 마크 w!)

물론 유지 보수의 다른 측면을 모두 가져옵니다. 오류/회귀/시간의 가능성. 그러나 핵심 개념은 매우 간단합니다.

다른 팁

순환 복잡성은 해당 블록을 통해 모든 경로를 실행하기 위해 다양한 매개 변수로 코드 블록을 실행 해야하는 횟수를 측정합니다. 테스트 전략을 피하는 논리적 오류의 가능성이 높아지기 때문에 카운트가 높아집니다.

Cyclocmatic complexity = Number of decision points + 1

의사 결정 지점은 IF… 다른, 루프, 루프 등 IF…

다음 차트는 응용 프로그램의 유형을 설명합니다.

  • 순환 복잡성은 1 - 10  정상적인 응용 분야로 간주됩니다.

  • 순환 복잡성은 11 - 20  보통 적용입니다

  • 사이클 성 복잡성은 21 - 50  위험한 응용 프로그램입니다

  • 고리적 복잡성은 50 개 이상의 불안정한 응용 프로그램입니다

Wikipedia는 이것에 대한 친구가 될 수 있습니다. 사이클로 음성 복잡성의 정의

기본적으로 귀하의 프로그램은 제어 흐름 그래프 그리고

복잡성은 (...)로 정의됩니다.

M = E − N + 2P

어디

  • m = 사이클로 더 복잡성,
  • e = 그래프의 가장자리 수
  • n = 그래프 노드 수
  • p = 연결된 구성 요소의 수

CC는 프로그램이 얼마나 복잡한 지, 단일 정수 번호로 테스트하는 것이 얼마나 어려운지를 포착하려는 개념입니다.

네, 정말 다입니다. 코드가 더 많은 실행 경로가 취할 수 있고 테스트해야 할 사항이 많고 오류 가능성이 높아집니다.

내가 들었던 또 다른 흥미로운 점 :

가장 큰 들여 쓰기가있는 코드의 장소는 CC가 가장 높아야합니다. 이들은 일반적으로 테스트 범위를 보장하는 가장 중요한 영역입니다. 읽기/유지하기가 더 어려울 것으로 예상되기 때문입니다. 다른 답변에 따르면, 이것들은 또한 커버리지를 보장하기위한 더 어려운 코드 영역입니다.

순환 복잡성은 실제로 무서운 유행어입니다. 실제로 그것은 더 복잡한 코드 부분을 지적하기 위해 소프트웨어 개발에 사용되는 코드 복잡성의 척도입니다 (버그가 될 가능성이 높기 때문에 매우 신중하고 철저히 테스트해야합니다). E-N+2P 공식을 사용하여 계산할 수 있지만 플러그인으로 자동으로 계산하는 것이 좋습니다. 코드의 가독성과 유지 관리를 유지하기 위해 CC를 5 미만으로 유지하기 위해 노력해야한다는 경험의 규칙에 대해 들었습니다.

나는 최근에 실험했다 일식 메트릭 플러그인 내 Java 프로젝트에는 정기적 인 Eclipse 도움말과 통합 될 정말 멋지고 간결한 도움말 파일이 있으며 코드 개선에 대한 다양한 복잡성 측정 및 팁 및 요령에 대한 더 많은 정의를 읽을 수 있습니다.

그것이 바로 그 아이디어는 CC가 낮은 방법이 포크, 루핑 등을 가지고있어서 모두 방법을 더 복잡하게 만듭니다. 분석기와 함께 50 만 줄의 코드를 검토하고 CC가 더 높은 몇 가지 방법을보고 있다고 상상해보십시오. 이렇게하면 더 나은 이해를 위해 해당 방법을 리팩토링하는 데 집중할 수 있습니다 (CC가 높은 버그 속도가 높은 경우에도 일반적입니다).

루틴 (루프, 스위치, if 등)의 각 결정 지점은 본질적으로 IF 문으로 귀결됩니다. 각각 if 당신은 2 개의 코페 스가 가져갈 수 있습니다. 따라서 첫 번째 지점에는 2 개의 코드 경로가 있으며, 두 번째 코드 경로는 4 개의 가능한 경로가 있으며 3 번째는 8 개 이상입니다. N은 분기 수인 2 ** N 코드 경로가 있습니다.

이로 인해 코드의 동작을 이해하고 N이 소수를 넘어서 자라면 테스트하기가 어렵습니다.

지금까지 제공된 답변은 소프트웨어 품질과 사이클로 더 복잡성의 상관 관계를 언급하지 않습니다. 연구에 따르면 사이클로 더 복잡성 메트릭이 낮은 점은 품질이 높은 소프트웨어를 개발하는 데 도움이 될 것입니다. 가독성, 유지 관리 및 이식성의 소프트웨어 품질 속성에 도움이 될 수 있습니다. 일반적으로 하나는 5-10 사이의 고기적 복잡성 메트릭을 얻으려고 시도해야합니다.

사이클로틱 복잡성과 같은 지표를 사용하는 이유 중 하나는 일반적으로 인간이 뇌에서 동시에 약 7 (플러스 또는 마이너스 2) 정보를 추적 할 수 있기 때문입니다. 따라서 소프트웨어가 여러 의사 결정 경로와 지나치게 복잡한 경우 소프트웨어가 어떻게 작동하는지 시각화 할 수있을 것 같지 않습니다 (즉, 사이클 성 복잡성 메트릭이 높습니다). 이로 인해 잘못된 소프트웨어가 잘못되거나 버그가 발생한 소프트웨어가 발생할 수 있습니다. 이에 대한 자세한 내용은 확인할 수 있습니다 여기 그리고 또한 위키 백과.

순환 복잡성은 제어 흐름 그래프를 사용하여 계산됩니다. 프로그램의 소스 코드를 통한 선형 독립 경로의 정량적 측정 수는 순환 복잡성이라고합니다 (if / if / for / while)

사이클로마 트릭 복잡성은 기본적으로 유지 관리에 대한 더 많은 코드가 필요한 코드 영역을 파악하는 메트릭입니다. 기본적으로 리팩토링에 대한 입력입니다. 그것은 깊은 중첩 루프, 조건 등을 피하는 측면에서 코드 개선 영역을 표시합니다.

그것은 일종의 것입니다. 그러나 "case"또는 "switch"문의 각 지점은 1으로 계산되는 경향이 있습니다. 사실상 CC를 의미합니다. 증오합니다 사례 문 및이를 요구하는 모든 코드 (명령 프로세서, 상태 머신 등).

고려하다 제어 흐름 그래프 출구에서 입구까지의 추가 모서리가 실행되는 기능의 기능. 사이클로틱 복잡성은 그래프를 두 조각으로 분리하지 않고 만들 수있는 최대 컷 수입니다.

예를 들어:

function F:
    if condition1:
       ...
    else:
       ...
    if condition2:
       ...
    else:
       ...

Control Flow Graph

제어 흐름 그래프

링크 된 그래프가 왜 3의 사이클러성 복잡성을 갖는지 직관적으로 알 수 있습니다.

사이클로마 트릭 복잡성은 소프트웨어 단위가 얼마나 복잡한지를 측정합니다. 프로그램이 조건부 로직 구성을 따라 따라갈 수있는 다양한 경로의 수를 측정합니다 (경우, for, switch & case 등 ...). 여기 계산에 대해 더 배우고 싶다면 여기에서 볼 수있는 멋진 YouTube 비디오가 있습니다. https://www.youtube.com/watch?v=plcgomvu-nm

프로그램이 수행 할 수있는 다양한 경로 나 시나리오를 보여주기 때문에 테스트 사례를 설계하는 데 중요합니다. "우수한 테스트 가능성과 유지 보수를 갖기 위해 McCabe는 프로그램 모듈이 10의 고리적 복잡성을 초과 할 것을 권장합니다"(Marsic, 2012, p. 232).

참조 : Marsic., I. (2012, 9 월). 소프트웨어 공학. Rutgers University. www.ece.rutgers.edu/~marsic/books/se/book-se_marsic.pdf에서 검색했습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top