Complexity, Duplication Matrix 소개 - cleancodeclass/cleancode_theory GitHub Wiki
Complexity (복잡도)
소스코드 내의 분기분, 반복문 등을 계산식을 통해 정량적으로 산출하는 Sotfware 품질 측정 지표.
1. Cyclomatic Complexity
-
McCabe는 10 이하로 유지하라고 권고 (1976년)
-
분기문, 반복문 (if, for, while 등)에 의해 구분되는 실행 경로의 가지 수
-
계산식 = E - N + 2P
-
예제 = 9 - 8 + (2*1) = 3
-
예제 = 6 - 6 + (2*1) = 2
-
-
PMD
- 1-4 (low)
- 5-7 (moderate)
- 8-10 (high)
- 11+ (very high)로 구분 (임계치: 10)
-
Microsoft
- 임계치 15
- 10 이상 refactoring 고려 대상
-
SDS 사내 표준은 20
-
References
2. NPath Complexity
- 실행경로의 수를 수치로 표현하는 이론이다
- 조건의 분기마다 지수적으로 수치가 높아진다
- 임계치 기본값은 200 임
- 장점
- 소프트웨어에서 몇 안되는 정량적인 수치로 딱 정수로 된 숫자값 하나기 때문에 이해하기 용이
- 정량적이기 때문에 여러 설계를 수치적으로 직접 비교가능
- 개발자가 설계 단계에서 사용하기 용이
- 단점
- 코드 복잡도를 알 수는 있지만, 데이터 복잡도를 알기 어려움
- 단순한 로직임에도 수치가 높아서 Refactoring 요청이 있을 수도 있음
- 예제 = 2 * 2 * 3 = 12
- 위의 예제를 Cyclomatic Complexity로 계산하면 5
3. Modified Cyclomatic Complexity
- switch-case 문의 case 수에 상관없이 1로 산정
- switch-case가 if/else 중복보다 이해 쉽다고 판단
4. Strict Cyclomatic Complexity
- if 조건 안의 and(&&), or(||)를 별개의 조건문으로 취급
5. SonarQube Complexity 산정반식
- For each of the below java statements the number increments by one.
- if, for, while, case, catch, throw, return, &&, ||, and ?.
Duplication (중복도)
중복코드는 동일한 소스코드가 복사되어 여러 곳에 사용된 코드로써, 코드의 복잡성을 높이는 안좋은 설계의 증상을 나타낸다.
많이 활용되는 중복코드가 변경이되거나 버그가 있는 경우에는 여러 곳에서 수정되어야 한다.
1. SonarQube를 활용한 점검
- 100개 이상의 연속된 문자와 10줄 이상의 같은 코드가 검출될 경우
- sonar.cpd.${language}.minimumTokens 및 sonar.cpd.${language}.minimumLines 속성으로 변경 가능
2. PMD's CPD(Copy/Paste Detector)
3. Visual Studio Enterprise
- Analyze -> Analyze Solution for Code Clones
4. 개선방안
- 항상 파일을 수정하기 전에 중복 여부 확인
- 상속을 통한 중복 제거 또는 적절한 디자인 패턴 적용
- 공통 모듈로 중복 부분 모듈화
- AOP(Aspect Oriented Programming) 적용