Emerge (또는 erge-viz )는 소프트웨어 프로젝트의 소스 코드 구조, 메트릭, 종속성 및 복잡성에 대한 통찰력을 수집하는 대화형 코드 분석 도구입니다. 프로젝트의 소스 코드를 스캔하고, 지표 결과와 통계를 계산하고, 그래프 구조(예: 종속성 그래프 또는 파일 시스템 그래프)가 있는 대화형 웹 앱을 생성하고 결과를 일부 파일 형식으로 내보낼 수 있습니다. Emerge는 현재 C
, C++
, Groovy
, Java
, JavaScript
, TypeScript
, Kotlin
, ObjC
, Ruby
, Swift
, Python
, Go
언어에 대한 구문 분석을 지원합니다. 구조, 색상 및 클러스터링은 힘 방향 그래프 시뮬레이션과 Louvain 모듈성을 결합하는 아이디어를 기반으로 계산됩니다. Emergency는 주로 Python 3로 작성되었으며 macOS, Linux 및 최신 웹 브라우저(예: 최신 Safari, Chrome, Firefox, Edge)에서 테스트되었습니다.
출현 (/ˈməːdʒ/)
- 무언가에서 나오거나 뒤에서 나타나다
- 특히 무엇인가를 조사하거나 그것에 대해 질문한 결과로 알려지다
이 프로젝트의 주요 목표는 소프트웨어 개발, 아키텍처, 측정 및 시각화에 관심이 있는 사람이라면 누구나 쉽게 사용하여 해당 주제에 대한 더 많은 통찰력을 수집할 수 있는 무료/오픈 소스 도구를 만드는 것입니다. 탐색적 접근 방식을 사용하여 주어진 소프트웨어 프로젝트에 대한 더 나은 이해를 촉진/지원해야 합니다.
C
, C++
, Groovy
, Java
, JavaScript
, TypeScript
, Kotlin
, ObjC
, Ruby
, Swift
, Python
Groovy
, Java
, Kotlin
, Swift
git-based
측정항목(SLOC, 공백 복잡성, 변경 결합)의 실험적 구현SwiftUI
및 Composable
선언적 UI 엔터티 추출 포함git-based
측정항목 시각화(예: 코드 이탈)이머지를 사용하는 가장 쉬운 방법은 사전 빌드된 Docker 컨테이너에서입니다. 유일한 전제 조건은 Docker 엔진을 보유하는 것입니다. 예를 들어 Docker Desktop이 있습니다.
다음과 같이 작업 폴더를 준비하십시오.
config.yml
?export
?source
분석을 실행하는 명령은 다음과 같습니다.
docker run --rm -v <YOUR_WORKING_FOLDER_PATH>:/tmp/emerge achtelik/emerge:2.0.0 /tmp/emerge/config.yml
마지막 매개변수는 Docker 컨테이너 내부의 config.yml 경로입니다.
⚡실행이 끝나면 Pyperclip 오류를 무시할 수 있습니다.
위의 제안을 사용하는 경우 analyses.source_directory
및 export.directory
경로가 /tmp/emerge
로 시작해야 한다는 점에 주의하세요. 이는 분석이 Docker 컨테이너 내부에서 실행되기 때문에 필요합니다.
예를 들어:
---
project_name: java_project_example
loglevel: info
analyses:
- analysis_name: full java check
source_directory: /tmp/emerge/source
.
.
.
export:
- directory: /tmp/emerge/export
.
.
.
Docker 컨테이너 자체는 경로 독립적입니다. 자신만의 볼륨 마운트 및 프로젝트 구성 경로를 자유롭게 사용해 보세요.
기본적으로 이머지를 설치하는 방법에는 두 가지가 있습니다. pip
( pyenv
, virtualenv
및 virtualenvwrapper
사용하는 가상 환경이 권장되지만 필수는 아님)에 익숙하다면 다음 몇 단계를 통해 간단하게 최신 버전의 Emergency를 설치할 수 있습니다.
권장되는 방법은 가상 환경을 사용하는 것입니다. 다음 예제를 사용하여 이를 수행할 수 있습니다.
pyenv install 3.10.0
pyenv virtualenv 3.10.0 venv-3.10.0
pyenv activate venv-3.10.0
pip
사용하여 이머지를 간단히 설치할 수 있습니다.
Ubuntu 20.04+에서는 graphviz
및 graphviz-dev
패키지가 설치되어 있는지 확인하십시오.
apt-get install graphviz graphviz-dev
다음을 사용하여 새 패키지로 설치하십시오.
pip install emerge-viz
또는 이미 설치되어 있는 경우 다음을 사용하여 업데이트하세요.
pip install -U emerge-viz
그런 다음 간단히 다음과 같이 실행하십시오.
(emerge) user@host ~ % emerge
usage: emerge [-h] [-c YAMLCONFIG] [-v] [-d] [-e] [-a LANGUAGE]
? Welcome to emerge x.y.z (yyyy-mm-dd hh:mm:ss)
options:
-h, --help show this help message and exit
-c YAMLCONFIG, --config YAMLCONFIG
set yaml config file
-v, --verbose set logging level to INFO
-d, --debug set logging level to DEBUG
-e, --error set logging level to ERROR
-a LANGUAGE, --add-config LANGUAGE
add a new config from a template, where LANGUAGE is one of [JAVA, SWIFT, C, CPP, GROOVY, JAVASCRIPT,
TYPESCRIPT, KOTLIN, OBJC, RUBY, PY, GO]
명령줄에서 간단한 프로젝트 구성 임시를 생성한 다음 필요한 소스/내보내기 경로를 간단히 조정할 수 있습니다.
(emerge) user@host tmp % pwd
/Users/user1/tmp
(emerge) user@host tmp % emerge -a java
✅ created config file from template: /Users/user1/tmp/java-template.yaml
그런 다음 필요한 경로( analyses/source_directory
및 export/directory
)를 조정하면 됩니다.
(emerge) user@host tmp % cat java-template.yaml
---
project_name: java_project_example
loglevel: info
analyses:
- analysis_name: full java check
source_directory: /Users/user1/emerge/project/source
only_permit_languages:
- java
only_permit_file_extensions:
- .java
file_scan:
- number_of_methods
- source_lines_of_code
- dependency_graph
- fan_in_out
- louvain_modularity
- tfidf
entity_scan:
- dependency_graph
- source_lines_of_code
- number_of_methods
- fan_in_out
- louvain_modularity
- tfidf
export:
- directory: /Users/user1/emerge/project/export
- graphml
- json
- tabular_file
- tabular_console_overall
- d3
(emerge) user@host tmp %
그 후에는 간단히 스캔을 시작할 수 있습니다
(emerge) user@host tmp % emerge -c java-template.yaml
2021-12-04 21:18:15 analysis I starting to analyze java_project_example
2021-12-04 21:18:15 analysis I ⏩ performing analysis 1/1: full java check
2021-12-04 21:18:15 analysis I starting to create filesystem graph in full java check
2021-12-04 21:18:15 analysis I ⏩ starting scan at directory: ...
...
...
...
2021-12-04 21:18:27 analysis I ✅ all your generated/exported data can be found here: /Users/user1/tmp/java
2021-12-04 21:18:27 analysis I ✅ copy the following path to your browser and start your web app: file:///Users/user1/tmp/java/html/emerge.html
2021-12-04 21:18:27 analysis I ✅ total runtime of analysis: 00:00:10 + 154 ms
이제 위에서 언급한 file://
경로를 최신 웹 브라우저에 복사하고 구성된 코드베이스를 대화형으로 노출하세요.
다음 지침에 따라 이 저장소를 복제하고 설치할 수 있습니다.
git clone https://github.com/glato/emerge.git
graphviz
패키지를 설치하세요 brew install graphviz
Apple Silicon Mac에서 다음 오류가 발생하는 경우
pygraphviz/graphviz_wrap.c:2711:10: fatal error: ' graphviz/cgraph.h ' file not found
# include "graphviz/cgraph.h"
^~~~~~~~~~~~~~~~~~~
1 error generated.
새로운 홈브류 환경에 대한 pygraphviz 포함 디렉터리를 업데이트하려면 다음 명령을 한 번 실행해야 합니다.
pip install --global-option=build_ext --global-option= " -I $( brew --prefix graphviz ) /include/ " --global-option= " -L $( brew --prefix graphviz ) /lib/ " pygraphviz
여기의 맥락에서 문제를 참조하세요.
macOS에 최신 Python 3이 설치되어 있는지 확인하세요. Homebrew에서 Python 3을 설치/사용하는 것이 좋습니다. Python 3 가상 환경 만들기(선택적으로 프로젝트 구조 내에서)
cd emerge
pip3 install virtualenv
virtualenv -p python3 venv
필수 패키지를 설치하고 Python 3 가상 환경을 생성합니다(선택적으로 프로젝트 구조 내에서).
apt-get install python3-venv python3-dev graphviz graphviz-dev
cd emerge
python3 -m venv venv
source venv/bin/activate
pip를 사용하여 프로젝트에 필요한 모든 종속성을 설치합니다.
pip install -r requirements.txt
휠 패키지를 설치한 후 pip를 사용하여 프로젝트에 필요한 모든 종속성을 설치합니다.
pip install wheel
pip install -r requirements.txt
복제된 프로젝트 루트에서 다음을 실행합니다.
python -m unittest discover -v -s ./emerge -p "test_*.py"
그렇지 않으면 run_tests.py
스크립트를 실행하십시오.
python run_tests.py
테스트를 실행하는 데 문제가 있는 경우 이 해결 방법을 확인하세요.
emerge
. (emerge) user@host emerge % python emerge.py
usage: emerge.py [-h] [-c YAMLCONFIG] [-v] [-d] [-e] [-a LANGUAGE]
? Welcome to emerge x.y.z (yyyy-mm-dd hh:mm:ss)
options:
-h, --help show this help message and exit
-c YAMLCONFIG, --config YAMLCONFIG
set yaml config file
-v, --verbose set logging level to INFO
-d, --debug set logging level to DEBUG
-e, --error set logging level to ERROR
-a LANGUAGE, --add-config LANGUAGE
add a new config from a template, where LANGUAGE is one of [JAVA, SWIFT, C, CPP, GROOVY, JAVASCRIPT,
TYPESCRIPT, KOTLIN, OBJC, RUBY, PY, GO]
자체 코드베이스에서 이머지를 빠르게 실행해 보겠습니다.
python emerge.py -c configs/emerge.yaml
그러면 비슷한 출력이 생성됩니다.
... analysis I starting to analyze emerge
... analysis I ⏩ performing analysis 1/1: self-check
... analysis I starting to create filesystem graph in self-check
... analysis I ⏩ starting scan at directory: .
... ...
... analysis I the following statistics were collected in self-check
+-------------------------------------+-------------------+
| statistic name | value |
+-------------------------------------+-------------------+
| scanning_runtime | 00:00:00 + 61 ms |
| scanned_files | 32 |
| skipped_files | 176 |
| parsing_hits | 313 |
| parsing_misses | 141 |
| extracted_file_results | 32 |
| file_results_creation_runtime | 00:00:00 + 538 ms |
| number-of-methods-metric-runtime | 00:00:00 + 4 ms |
| source-lines-of-code-metric-runtime | 00:00:00 + 11 ms |
| louvain-modularity-metric-runtime | 00:00:00 + 161 ms |
| fan-in-out-metric-runtime | 00:00:00 + 4 ms |
| total_runtime | 00:00:00 + 786 ms |
+-------------------------------------+-------------------+
... analysis I the following overall metrics were collected in self-check
+----------------------------------------------+----------------------------+
| metric name | value |
+----------------------------------------------+----------------------------+
| avg-number-of-methods-in-file | 13.0 |
| avg-sloc-in-file | 151.41 |
| total-sloc-in-files | 4845 |
| louvain-communities-dependency-graph | 3 |
| louvain-modularity-dependency-graph | 0.21 |
| louvain-biggest-communities-dependency-graph | 0.49, 0.46, 0.05, 0.0, 0.0 |
| avg-fan-in-dependency-graph | 5.55 |
| avg-fan-out-dependency-graph | 5.55 |
| max-fan-in-dependency-graph | 29 |
| max-fan-in-name-dependency-graph | typing |
| max-fan-out-dependency-graph | 19 |
| max-fan-out-name-dependency-graph | emerge/appear.py |
+----------------------------------------------+----------------------------+
... analysis I ✅ all your generated/exported data can be found here: /Users/user1/tmp/python
... analysis I ✅ copy the following path to your browser and start your web app: file:///Users/user1/tmp/python/html/emerge.html
... analysis I ✅ total runtime of analysis: 00:00:00 + 786 ms
이제 위에서 언급한 file://
경로를 최신 웹 브라우저에 복사하고 이머지 코드베이스를 대화형으로 노출해 보세요.
s
눌러 특정 노드를 선택하고 강조 표시하거나 선택 취소합니다.r
눌러 현재 활성 노드 선택을 재설정합니다.f
눌러 선택되지 않은 모든 노드를 페이드하여 현재 선택한 노드를 더욱 강조하여 시각화합니다.이제 이것을 더 흥미롭게 만들어 보겠습니다 ...
다른 프로젝트에서 이머지를 사용하고 싶다면, emerge/configs
디렉토리에 있는 기존 구성 템플릿 중 하나를 간단히 복사하거나 사용자 정의하면 됩니다.
빠른 실행을 위해서는 export
의 directory
source_directory
조정하는 것만으로도 충분합니다.
---
project_name : c-example-project
loglevel : info
analyses :
- analysis_name : check_c_files
source_directory : /Users/user1/emerge/project/source/github/linux-5.8.5/crypto
only_permit_languages :
- c
only_permit_file_extensions :
- .c
- .h
ignore_dependencies_containing :
- string.h
ignore_dependencies_matching :
- ^test_(.*).h$
file_scan :
- number_of_methods
- source_lines_of_code
- dependency_graph
- louvain_modularity
- fan_in_out
- tfidf
export :
- directory : /Users/user1/emerge/project/export
- graphml
- json
- tabular_file
- tabular_console_overall
- d3
현재 구성(예: config/c-template.yaml
)을 사용자 정의하거나 자신만의 구성을 만든 후, 이 새로운 구성을 사용하여 Emergency를 다시 실행하세요.
python emerge.py -c configs/c-template.yaml
스캔 후 위 로그에 표시된 대로 스캔 출력(대화형 웹 앱 포함)은 구성 매개변수 export
-> directory
에서 생성하고 설정한 디렉터리에서 찾을 수 있습니다.
파일 및 항목 검사를 모두 포함하는 전체 YAML 구성의 형식은 다음과 같습니다.
---
project_name : java_project_example
loglevel : info
analyses :
- analysis_name : check_java_files_and_classes
source_directory : /Users/user1/emerge/project/source
only_permit_languages :
- java
only_permit_file_extensions :
- .java
ignore_dependencies_containing :
- java.util
file_scan :
- number_of_methods
- source_lines_of_code
- dependency_graph
- fan_in_out
- louvain_modularity
- tfidf
entity_scan :
- dependency_graph
- source_lines_of_code
- number_of_methods
- fan_in_out
- louvain_modularity
- tfidf
export :
- directory : /Users/user1/emerge/project/export
- graphml
- json
- tabular_file
- tabular_console_overall
- d3
때로는 플랫폼의 일반적인 종속성이나 프로젝트 이해에 크게 기여하지 않는 종속성을 제외하는 것이 합리적일 수 있습니다. 예를 들어 Android 프로젝트 의 좋은 시작점은 다음과 같은 ignore_dependencies_containing
섹션일 수 있습니다.
ignore_dependencies_containing :
- android
- java
- javax
또는 iOS 프로젝트 의 경우 다음의 ignore_entities_containing
섹션이 의미가 있는 경우가 많습니다. 예를 들어 그래프 출력에 대한 SwiftUI 미리보기를 고려하지 않는 것입니다.
ignore_entities_containing :
- _Previews
yaml 구성은 기본적으로 다음 수준에서 정의됩니다.
열쇠 | 값/설명 |
---|---|
project_name | 모든 분석, 스캔 및 내보내기를 위한 프로젝트 이름 |
loglevel | 로그 수준 설정: error (자동, 오류만), info ( error 포함)는 제어 흐름에 대한 기본 로그를 제공하고, debug ( info 포함)는 많은 디버그 로그를 생성합니다. |
analyses | 개별적으로 구성할 수 있는 분석 배열이므로 프로젝트에는 일대다 분석이 포함될 수 있습니다. |
열쇠 | 값/설명 |
---|---|
analysis_name | 특정 분석 이름 |
source_directory | 재귀적 파일 검사가 시작되어야 하는 소스 디렉터리 |
git_directory | git repo 디렉토리(git 메트릭을 포함해야 하는 경우) |
git_commit_limit | 마지막 커밋에서 몇 개의 커밋을 채굴해야 합니까? 기본값: 150 |
git_exclude_merge_commits | 모든 메트릭 마이닝에서 병합 커밋을 제외해야 합니까? 기본값: true |
ignore_files_containing | 주어진 하위 문자열을 포함하는 스캔에서 파일 이름을 제외합니다. |
ignore_directories_containing | 주어진 하위 문자열을 포함하는 스캔에서 디렉터리 이름을 제외합니다. |
only_permit_languages | 가능한 값은 다음과 같습니다: java, kotlin, objc, Swift, ruby, groovy, javascript, c - 여기에서 설정한 언어 이외의 다른 언어는 스캔하지 못하도록 명시적으로 금지합니다. |
only_permit_file_extensions | 여기에서 설정한 다음 파일 확장자를 명시적으로 허용합니다(예: .java |
only_permit_files_matching_absolute_path | 파일 검색에는 다음 절대 파일 경로 목록만 허용됩니다(예: [/Users/user1/source/file1.java] . 파일은 source_directory 따라야 합니다. |
ignore_dependencies_containing | 이 하위 문자열 목록에 포함된 모든 종속성을 무시합니다(예: java.util |
ignore_dependencies_matching | 이 하위 문자열 목록(예: ^java.util. |
ignore_entities_containing | 이 하위 문자열 목록에 포함된 모든 엔터티를 무시합니다(예: NotRelevantClass . |
ignore_entities_matching | 이 하위 문자열 목록의 정규 표현식과 일치하는 모든 항목을 무시합니다(예: ^Test |
import_aliases | 가져오기 별칭 목록을 정의합니다. 즉, 전체 종속성 경로 내의 하위 문자열을 바꿉니다. 예 "@foo": src/foo 모든 @foo 별칭을 src/foo 로 바꿉니다. |
override_resolve_dependencies | 언어 파서에서 지원하는 경우 이 목록의 모든 종속성을 강제로 해결합니다. |
override_do_not_resolve_dependencies | 언어 파서에서 지원하는 경우 이 목록의 모든 종속성이 해결되지 않도록 강제합니다(즉, 전역 종속성으로 처리됨). |
file_scan | 파일 검사를 수행하며 모든 소스 파일에 적용해야 하는 측정항목이 포함되어 있습니다. |
entity_scan | 엔터티 스캔을 수행합니다. 모든 엔터티(예: 모든 클래스)에 적용해야 하는 측정항목이 포함되어 있습니다. |
export | 출력으로 생성되어야 하는 모든 내보내기 형식이 포함되어 있습니다. |
appconfig | 구성 가능한 앱 구성 매개변수가 포함되어 있습니다. |
열쇠 | 값/설명 |
---|---|
dependency_graph | 소스 파일을 기반으로 종속성 그래프 구조를 생성하면 추가 측정항목이 그래프 노드에 추가됩니다. |
source_lines_of_code | 코드 메트릭의 소스 라인을 모든 파일에 적용하고 전체 메트릭을 생성합니다. |
number_of_methods | 모든 파일에 다양한 방법 메트릭을 적용하고 전체 메트릭을 생성합니다. |
fan_in_out | 팬인/팬아웃 그래프 메트릭을 모든 파일에 적용하고 전체 메트릭을 생성합니다. |
louvain_modularity | 모든 파일에 louvain 모듈성 메트릭을 적용하고 전체 메트릭을 생성합니다. |
tfidf | 모든 파일에 tfidf 측정항목을 적용하고 관련 의미 키워드 추출 |
ws_complexity | 모든 파일에 공백 복잡성 측정항목을 적용합니다. |
git_metrics | 일부 git 기반 측정항목을 포함하고 모든 파일에 적용해 보세요. |
열쇠 | 값/설명 |
---|---|
dependency_graph | 파일에서 추출된 엔터티를 기반으로 종속성 그래프 구조를 생성하면 추가 측정항목이 그래프 노드에 추가됩니다. |
inheritance_graph | 파일에서 추출된 엔터티를 기반으로 상속 그래프 구조를 생성하면 추가 측정항목이 그래프 노드에 추가됩니다. |
complete_graph | 파일에서 추출된 엔터티를 기반으로 완전한 그래프 구조(종속성/상속 그래프의 결합)를 생성하면 추가 측정항목이 그래프 노드에 추가됩니다. |
source_lines_of_code | 코드 메트릭의 소스 라인을 모든 엔터티에 적용하고 전체 메트릭을 생성합니다. |
number_of_methods | 모든 엔터티에 다양한 방법 메트릭을 적용하고 전체 메트릭을 만듭니다. |
fan_in_out | 팬인/팬아웃 그래프 메트릭을 모든 엔터티에 적용하고 전체 메트릭을 생성합니다. |
louvain_modularity | 모든 엔터티에 Louvain 모듈성 측정항목을 적용하고 전체 측정항목을 생성합니다. |
tfidf | 모든 엔터티에 tfidf 측정항목을 적용하고 관련 의미 키워드 추출 |
열쇠 | 값/설명 |
---|---|
directory | 지정된 모든 내보내기 형식의 출력 디렉터리 |
graphml | 그래프의 노드에 매핑된 그래프 구조와 메트릭 결과를 포함하는 graphML 파일을 생성합니다. |
tabular_file | 모든 측정항목 및 통계 결과를 포함하는 표 형식의 텍스트 파일을 만듭니다. |
tabular_console | 모든 지표 및 통계 결과를 포함하는 표 형식의 출력을 콘솔에 인쇄합니다. |
tabular_console_overall | 전체 지표 및 통계 결과만 포함하는 표 형식의 출력을 콘솔에 인쇄합니다. |
json | 모든 측정항목 및 통계 결과를 포함하는 JSON 파일 생성 |
d3 | 추가 시각적 및 대화형/탐색적 분석을 위해 하위 폴더 force-graph-html 에 Bootstrap/D3 웹 애플리케이션을 생성합니다. |
열쇠 | 값/설명 |
---|---|
radius_fan_out | 팬아웃 측정항목에 대한 노드 반경 곱셈 인자, 기본값: 0.1 |
radius_fan_in | 팬인 측정항목에 대한 노드 반경 곱셈 인자, 기본값: 0.1 |
radius_louvain | 루베인 메트릭의 노드 반경 곱셈 인자, 기본값: 0.02 |
radius_sloc | sloc 메트릭에 대한 노드 반경 곱셈 인자, 기본값: 0.005 |
radius_number_of_methods | 메소드 수 메트릭에 대한 노드 반경 곱셈 계수, 기본값: 0.05 |
heatmap_sloc_active | 히트맵 점수 계산에 sloc 측정항목을 포함해야 합니까? 기본값: true |
heatmap_fan_out_active | 히트맵 점수 계산에 팬아웃 측정항목을 포함해야 합니까? 기본값: true |
heatmap_sloc_weight | 히트맵 점수 계산 내 sloc 지표의 가중치 계수, 기본값: 1.5 |
heatmap_fan_out_weight | 히트맵 점수 계산 내 팬아웃 측정항목의 가중치 계수, 기본값: 1.7 |
heatmap_score_base | 히트맵 색상 매핑의 최소 점수 임계값, 기본값: 10 |
heatmap_score_limit | 히트맵 색상 매핑의 최대 점수 임계값, 기본값: 300 |
Emerge는 언어별로 다음과 같은 파일 확장자와 스캔 유형을 지원하는 반면, file_scan
단순히 메트릭을 계산하고 그래프 구조 내의 노드를 스캔된 파일에 매핑하며, entity_scan
파일(예: 클래스 또는 구조체)에서 더 세분화된 엔터티를 추출하려고 시도합니다.
파일 확장자 | 언어 파서 | 파일 | 엔터티 |
---|---|---|---|
.java | 자바 | ✅ | ✅ |
.swift | 스위프트 | ✅ | ✅ |
.c / .h / .hpp | 기음 | ✅ | |
.cpp / .h / .hpp | C++ | ✅ | |
.groovy | 그루비 | ✅ | ✅ |
.js / .jsx | 자바스크립트 | ✅ | |
.ts / .tsx | 타입스크립트 | ✅ | |
.k | 코틀린 | ✅ | ✅ |
.m / .h | 오브젝티브-C | ✅ | |
.rb | 루비 | ✅ | |
.py | 파이썬 | ✅ | |
.go | 가다 | ✅ |
이러한 그래프의 해석은 매우 주관적이며 프로젝트에 따라 달라질 수 있습니다. 다음 예는 표시기와 힌트를 통해 특정 패턴을 인식하는 데 도움이 됩니다.
모듈성을 발견하는 마법은 커뮤니티 감지 알고리즘(예: Louvain 최적화)을 힘 방향 그래프에 적용하여 거리와 색상이 모두 결과에 영향을 미치는 데 있습니다. 다음 예에는 모듈식 코드베이스에 대한 여러 표시기가 포함되어 있습니다.
왼쪽의 첫 번째 예에서는 특정 거리(= 힘 방향 그래프에 의해 생성됨)만큼 낮은 결합을 나타내는 여러 개의 일관된 색상 클러스터를 발견할 수 있습니다.
오른쪽의 두 번째 예에서는 동일한 그래프가 활성화된 클러스터 헐을 사용하여 렌더링됩니다. 이 예에서는 선체가 겹치는 부분이 최소화되거나 전혀 표시되지 않습니다. 이러한 힌트는 모듈성 , 추상화 및 잘 정의된 인터페이스 측면에서 좋은 소프트웨어 아키텍처에 대한 지표가 될 수 있습니다.
"큰 진흙 공은 무질서하게 구성되어 있고, 넓고, 엉성하고, 덕트 테이프와 베일링 와이어, 스파게티 코드 정글입니다"(B. Foote, J. Yoder, 1997). 이러한 종류의 그래프는 종종 덜 최적의 아키텍처를 나타냅니다. 이러한 종류의 스파게티 코드 정글을 확인하려면 모든 클러스터에 대해 헐 렌더링을 활성화하여 최종적으로 결정하면 됩니다. 결국 큰 클러스터는 하나뿐입니다.
때로는 관련 없는 종속성을 무시하면 소프트웨어 아키텍처의 복잡성을 더 잘 이해하는 데 도움이 될 수 있습니다.
ignore_dependencies_containing
(또는 정규 표현식을 선호하는 경우 ignore_dependencies_matching
) 키를 사용하여 관련 없는 종속성을 구성적으로 제거할 수 있습니다. 비교적 활성화된 팬아웃 측정항목을 사용하면 더 많은 산란, 일부 먼 허브 노드 및 더 명확한 클러스터를 인식할 수 있습니다. 이들 모두는 실제(종종 더 이해하기 쉬운) 아키텍처에 대한 가능한 단서입니다.