정적코드분석/코딩표준

Halstead 메트릭

Halstead 메트릭

소프트웨어 복잡성의 척도인 Halstead 메트릭은 1977년 Maurice Howard Halstead에 의해 소개된 이론입니다. Cyclomatic Complexity 만큼 유명한 수치로 왠만한 정적분석 도구에서 이 수치를 지원합니다. Halstead 메트릭은 단순히 소스코드에서 연산자와 피연산자의 수를 바탕으로 복잡도를 정량적으로 구한 값인데, 이를 바탕으로 여러 가지 지표를 계산할 수 있습니다.

complex

편의에 따라 각 평가요소를 기호로 적겠습니다.

n1 = 프로그램내에서 유일한 서로 다른 연산자(operator)의 수.
n2 = 프로그램내에서 유일한 서로 다른 피연산자(operand)의 수.
N1 = 연산자의 총 발생 수
N2 = 피연산자의 의 총 발생 수

프로그램 길이(Program Length)

Program length : N = N1 + N2
이 지표는 프로그램의 길이를 나타내는 수치로 메소드, 타입, 패키지의 모든 연산자와 피연산자의 합으로 계산할 수 있습니다.

프로그램 어휘수(Program Vocabulary)

Program vocabulary : n= n1 + n2
이 지표는 메소드, 타입, 패키지의 유일한(Unique) 연산자와 유일한(Unique) 피연산자의 합입니다.

프로그램 볼륨(Program Volume)

Volume : V= N * (LOG2 n)
이 지표는 메소드, 타입, 패키지의 컨텐츠 정보의 측정치 입니다. 메소드의 볼륨은 20~1000 정도가 이상적인 수치이며, 이 값이 높을수록 코드가 복잡하다는 것을 의미합니다.

프로그램 난이도(Program Difficulty)

Difficulty : D= (n1/2) * (N2/n2)
이 지표는 난이도 수치를 나타냅니다. 이해 및 유지보수와 직결되는 수치로, 적정수치를 벗어나는 코드는 이해 및 유지보수가 어렵습니다.

프로그램 구현노력지수(Program Effort)

Effort : E = D * V
이 지표는 코드를 이해하고 구현하는 데에 필요한 노력 수치를 나타냅니다.

프로그램 구현 시간(Time required to program)

T = E /18 second
이 지표는 코드를 구현하고 이해하는 데에 드는 추정 시간입니다.

발생 추정 버그 수(Number of delivered bugs)

B = (E^(2/3))/ 3000 or V/3000
이 지표는 품질과 관련된 참조 수치입니다. 이 값은 메소드, 타입, 패키지에 발생할 수 있는 버그의 수를 나타내는데, 실제 버그의 수를 의미하는 것이 아니라 어디까지나 추정값입니다.

아래 구문을 보겠습니다.

int x = x + 1;

위 구문은 총 4개의 피연산자(int, x, x, 1)가 있고 3개의 유일한 피연산자(int,x,1)이 있습니다. 또한 3개의 연산자(=, +, ;)가 있고 셋 다 유일(Unique)합니다. 길이는 총 피연산자의 수 + 총 연산자의 수 = 7이며, 프로그램 어휘는 6 입니다. 난이도는 (3/2) * (4/3) = 2 입니다.

Hastead 메트릭의 장점과 단점

각각의 메트릭마다 장단점이 있는데, Halstead 메트릭 역시 장점과 단점이 있습니다.

장점 1. Cyclomatic Complexity(이하 CC)에서 잡아내지 못하는 계산 로직의 복잡함을 알 수 있습니다.
장점 2. 유지보수 노력과 상관관계를 가집니다.

단점 1. CC에 비해서 결함 성향과 상관 관계가 낮습니다. CC 수치가 높으면 결함발생률이 높다는 것을 나타내는데 반해, Halstead 메트릭이 높다고 결함 발생률이 높다고 콕 찝어 말할 수가 없습니다.
단점 2. 연산자와 피연산자의 수를 바탕으로 위의 메트릭 값을 뽑아내기 때문에 설계단계에서 사용하기 힘듭니다.
단점 3. 제어흐름의 복잡함을 나타내는 CC와는 달리, 제어흐름의 복잡도를 반영하지 않습니다. 극단적인 예로, if 가 없어도 수치는 충분히 높게 나올 수 있습니다.

image by Rolf Broberg under license Creative Common

Leave a Reply

Leave a Reply

Your email address will not be published. Required fields are marked *