[Unity C#] 정적 코드 해석 도구를 사용해 보았습니다.

입문


정적 코드 분석 도구인 SourceMonitor를 사용해 보십시오.

정적 코드 분석 도구?


원본 코드의 더러움을 분석할 수 있다.
참조:정적 코드 분석 - 위키백과

왜 쓰지?


원본 코드를 읽기 전에 원본 코드가 읽기 쉬운지 읽기 어려운지 모르겠다.
정적 분석을 통해 원본 코드를 읽지 않아도 어느 정도 원본 코드가 예쁜지 알 수 있다.

용례


게임회사 프롬 소프트웨어 근처에서도 정적 분석을 사용한 것 같다[CEDEC2013] 정적 분석을 통해 개발 현장에 어떤 변화가 생겼는지, 자동화된 소프트웨어 품질

소스 코드 준비


분석을 위한 사전 준비로 New Behaviour Script.cs의 Unity 프로젝트가 하나만 추가되었습니다.
유니티 버전은 뭐든지 가능합니다.소스 코드가 있으면 OK.
NewBehaviourScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

SourceMonitor 사용


0. 다운로드


아래 URL에서 SourceMonitor 다운로드 및 설치
http://www.campwoodsw.com/sourcemonitor.html

1. SourceMonitor 시작



2. 새 항목 만들기



3. 해석할 언어 선택


이번에는 Unity C#의 소스 코드를 확인하려면 C#을 선택합니다.

4. 소스 코드 디렉토리 지정


프로젝트 이름과 원본 코드가 있는 위치의 디렉터리를 입력하십시오.

5. 하위 디렉토리 지정



6. 항목 설정


이번에는 아무것도 건드리지 않고 "다음"을 누르세요.

다음을 누릅니다.

7. 체크포인트 설정


Allow parsing of UTF-8 파일이 선택되지 않은 경우
UTF-8 형식의 소스 코드는 확인할 수 없으므로 확인합니다.

8. 완성



완성 버튼을 누르면 프로젝트 제작이 완료됩니다.

9. 바로 분석


프로젝트 작성이 완료되면 체크포인트 특정 창이 표시됩니다.

닫으면 메뉴에 체크포인트 새로 만들기...항목에서 사용할 수 있는 모든 패밀리를 봅니다.

10. 분석 결과


확인 결과를 표시하려면 OK 버튼을 누릅니다.

분석 결과


방금 만든 New Bahaviour Script.cs를 분석한 결과는 다음과 같다.
프로젝트 이름
함의
숫자
Files
파일 수

Lines
빈 줄을 포함하는 코드 줄 수
십육
Statements
빈 줄 이외의 코드 줄 수

Mathods/Class
종류별 방법수
2.00
Calls/Method
방법 호출 횟수를 방법 개수의 값으로 나누다
0.00
Max Complexity
최대 복잡도 값

Max Depth
최대 중첩 값

Avg Depth
중첩 평균값
0.33
Avg Complexity
평균 복잡도
1.00

도대체 무슨 가격입니까?


분석 결과의 수치는 알았지만 이 수치들이 무슨 의미가 있는지 잘 모르겠다.
따라서 우리는 원본 코드를 일부 변경한 후에 다시 분석할 것이다.

검증 1: if 문장을 추가하고 정적 코드 분석을 시도합니다.


NewBehaviourScript.cs를 아래와 같이 편집해 보십시오.
NewBehaviourScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

        if (Time.time > 1f)
        {
            Debug.Log("ゲーム開始から1秒以上経過しました");
        }

    }
}
나는 게임이 1초가 넘는 상황에서 디버그 로그를 보내기 위해 스크립트를 바꾸려고 했다.

검증 1: 분석 결과


이 New Behaviour Script.cs의 분석 결과는 다음과 같다

프로젝트 이름
함의
숫자
Files
파일 수

Lines
빈 줄을 포함하는 코드 줄 수
21
Statements
빈 줄 이외의 코드 줄 수

Mathods/Class
종류별 방법수
2.00
Calls/Method
방법 호출 횟수를 방법 개수의 값으로 나누다
0.50
Max Complexity
최대 복잡도 값

Max Depth
최대 중첩 값

Avg Depth
중첩 평균값
0.88
Avg Complexity
평균 복잡도
1.50

비교 분석 결과


프로젝트 이름
함의
시작하다
검증 1
Files
파일 수


Lines
빈 줄을 포함하는 코드 줄 수
십육
21
Statements
빈 줄 이외의 코드 줄 수


Mathods/Class
종류별 방법수
2.00
2.00
Calls/Method
방법 호출 횟수를 방법 개수의 값으로 나누다
0.00
0.50
Max Complexity
최대 복잡도 값


Max Depth
최대 중첩 값


Avg Depth
중첩 평균값
0.33
0.88
Avg Complexity
평균 복잡도
1.00
1.50

고찰


보실 수 있습니다:.
・ 메소드 호출 횟수 증가
• 복잡도 증가

고려 - 복잡성 증가


표에'복잡도'라는 단어가 나타났는데, 이것은 순환의 복잡도를 나타낸다고 한다.
참조:디지털 코드 품질 - give it a try
이 순환 복잡도
매번 조건의 불일치가 나타날 때마다 복잡도가 한 번 증가한다고 한다.
즉, 다음과 같은if문장의 원인으로 인해 복잡도의 최대치가 1에서 2로 증가한다.
NewBehaviourScript.cs
if (Time.time > 1f)
{
    Debug.Log("ゲーム開始から1秒以上経過しました");
}

참조 URL


디지털 코드 품질
http://blog.jnito.com/entry/20101231/1293770272
순환의 복잡성을 이용하여 잠재적인 오류 위험을 낮추다
http://szk-takanori.hatenablog.com/entry/20111219/p1

검증 2: if 문장의 조건을 추가하려고 시도합니다.


if 문장 내용의 조건 표현식을 추가하고 정적 코드 분석을 시도합니다.

        if (Time.time > 1f && Time.time < 2f)
        {
            Debug.Log("ゲーム開始から1秒以上経過しました");
        }

검증 2: 분석 결과


프로젝트 이름
함의
숫자
Files
파일 수

Lines
빈 줄을 포함하는 코드 줄 수
24
Statements
빈 줄 이외의 코드 줄 수

Mathods/Class
종류별 방법수
2.00
Calls/Method
방법 호출 횟수를 방법 개수의 값으로 나누다
0.50
Max Complexity
최대 복잡도 값

Max Depth
최대 중첩 값

Avg Depth
중첩 평균값
0.88
Avg Complexity
평균 복잡도
2.00
이번에는 복잡도가 3이 되었다.
if 내부 조건 표현식의 증가는 복잡성을 증가시킬 수 있음을 알 수 있다.

검증 3: 중첩 시도 if


if가 판정한 곳을 다음과 같은 내용으로 변경하여 정적 코드 분석을 시도해 보십시오.
NewBehaviourScript.cs
        if (Time.time > 1f)
        {
            if (Time.time < 2f)
            {
                Debug.Log("ゲーム開始から1秒以上経過しました");
            }
        }

검증 3: 분석 결과


프로젝트 이름
함의
숫자
Files
파일 수

Lines
빈 줄을 포함하는 코드 줄 수
27
Statements
빈 줄 이외의 코드 줄 수

Mathods/Class
종류별 방법수
2.00
Calls/Method
방법 호출 횟수를 방법 개수의 값으로 나누다
0.50
Max Complexity
최대 복잡도 값

Max Depth
최대 중첩 값

Avg Depth
중첩 평균값
1.22
Avg Complexity
평균 복잡도
2.00

비교 검증 2 및 검증 3


여기서 검증 2와 검증 3을 비교하여 표로 정리한다.
프로젝트 이름
함의
검증 2(if에 두 가지 조건 표현식이 있음)
검증 3 (if 중첩)
Files
파일 수


Lines
빈 줄을 포함하는 코드 줄 수
24
27
Statements
빈 줄 이외의 코드 줄 수


Mathods/Class
종류별 방법수
2.00
2.00
Calls/Method
방법 호출 횟수를 방법 개수의 값으로 나누다
0.50
0.50
Max Complexity
최대 복잡도 값


Max Depth
최대 중첩 값


Avg Depth
중첩 평균값
0.88
1.22
Avg Complexity
평균 복잡도
2.00
2.00
중첩은 분석 결과의 중첩 깊이를 증가시킬 수 있음을 알 수 있다.
복잡도에 변화가 없음을 알 수 있다.

중첩 정보


자주 어떤 사람들은 깊이 끼워 넣으면 원본 코드를 읽기 어려울 것이라고 말한다.
(참조:내포된 깊이는 어둠의 깊이입니다.)
분석 결과의 깊이가 큰 수치라면 원본 코드를 재검토하는 것이 좋다.

총결산


· Complexity는 브랜치의 수량입니다.이 수치가 크면 디자인에 문제가 있을 가능성이 높습니다.
·깊이는 중첩 깊이입니다.이 수치가 크면 읽기 어려운 소스 코드입니다.

참조 URL


복잡도와 단일 테스트 용례수의 관련 관계
http://forza.cocolog-nifty.com/blog/2009/01/post-ca39.html
내포된 깊이는 어둠의 깊이입니다.
https://qiita.com/Mic-U/items/1ec901864d4ab11c8d6f
계량 SourceMonitor 소개
https://qiita.com/syougun360/items/f38981dba32d3afd2957

좋은 웹페이지 즐겨찾기