사이클로틱 복잡성이란 무엇입니까?
-
06-09-2019 - |
문제
내가 지금 보는 용어는 "순환 복잡성"입니다. 여기에서 "언어 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를 의미합니다. 증오합니다 사례 문 및이를 요구하는 모든 코드 (명령 프로세서, 상태 머신 등).
사이클로마 트릭 복잡성은 소프트웨어 단위가 얼마나 복잡한지를 측정합니다. 프로그램이 조건부 로직 구성을 따라 따라갈 수있는 다양한 경로의 수를 측정합니다 (경우, 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에서 검색했습니다