Emerge (หรือ Emerge-viz ) เป็นเครื่องมือวิเคราะห์โค้ดเชิงโต้ตอบเพื่อรวบรวมข้อมูลเชิงลึกเกี่ยวกับโครงสร้างซอร์สโค้ด ตัวชี้วัด การขึ้นต่อกัน และความซับซ้อนของโปรเจ็กต์ซอฟต์แวร์ คุณสามารถสแกนซอร์สโค้ดของโปรเจ็กต์ คำนวณผลลัพธ์หน่วยเมตริกและสถิติ สร้างเว็บแอปเชิงโต้ตอบพร้อมโครงสร้างกราฟ (เช่น กราฟการขึ้นต่อกันหรือกราฟระบบไฟล์) และส่งออกผลลัพธ์ในรูปแบบไฟล์บางรูปแบบ ปัจจุบัน Emerge มีการสนับสนุนการแยกวิเคราะห์สำหรับภาษาต่อไปนี้: C
, C++
, Groovy
, Java
, JavaScript
, TypeScript
, Kotlin
, ObjC
, Ruby
, Swift
, Python
, Go
โครงสร้าง การระบายสี และการจัดกลุ่มได้รับการคำนวณและอิงตามแนวคิดในการรวมการจำลองกราฟแบบบังคับทิศทางเข้ากับโมดูลาร์ของ Louvain โผล่ออกมาส่วนใหญ่เขียนด้วย 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
declarativegit-based
เช่น การปั่นโค้ดวิธีที่ง่ายที่สุดในการใช้งานจะปรากฏในคอนเทนเนอร์ 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
พารามิเตอร์สุดท้ายคือเส้นทางไปยัง config.yml ภายในคอนเทนเนอร์ Docker
⚡คุณสามารถเพิกเฉยต่อข้อผิดพลาด 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
แต่ไม่จำเป็น) คุณสามารถติดตั้ง Emerge เวอร์ชันล่าสุดได้โดยทำตามขั้นตอนต่อไปนี้
วิธีที่แนะนำคือการใช้ env เสมือน คุณสามารถทำได้โดยใช้ตัวอย่างต่อไปนี้:
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]
คุณสามารถสร้าง adhoc การกำหนดค่าโปรเจ็กต์อย่างง่ายได้จากบรรทัดคำสั่ง จากนั้นเพียงปรับเส้นทางแหล่งที่มา/ส่งออกที่จำเป็น
(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 รวมไดเร็กทอรีสำหรับสภาพแวดล้อม homebrew ใหม่
pip install --global-option=build_ext --global-option= " -I $( brew --prefix graphviz ) /include/ " --global-option= " -L $( brew --prefix graphviz ) /lib/ " pygraphviz
ดูปัญหาในบริบทที่นี่
ตรวจสอบว่าคุณได้ติดตั้ง Python 3 ล่าสุดบน macOS ของคุณแล้ว ฉันแนะนำให้ติดตั้ง/ใช้ Python 3 จาก Homebrew สร้างสภาพแวดล้อมเสมือน 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]
มาลองวิ่งกันอย่างรวดเร็วบน codebase ของมันเอง
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 ในโปรเจ็กต์อื่น คุณสามารถคัดลอกหรือปรับแต่งหนึ่งในเทมเพลตการกำหนดค่าที่มีอยู่จากไดเร็กทอรี emerge/configs
เพื่อการรันอย่างรวดเร็ว ควรปรับ source_directory
directory
ใน export
ให้เพียงพอ
---
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
) หรือสร้างของคุณเอง เพียงเรียกใช้โผล่อีกครั้งด้วยการกำหนดค่าใหม่นี้
python emerge.py -c configs/c-template.yaml
หลังการสแกน คุณจะพบผลลัพธ์การสแกนของคุณ (รวมถึงเว็บแอปแบบโต้ตอบ) ได้ที่ไดเร็กทอรีที่คุณสร้างและตั้งค่าในพารามิเตอร์ config 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, fast, 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 alias ใดๆ ด้วย 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 | สร้างเว็บแอปพลิเคชัน Bootstrap/D3 ในโฟลเดอร์ย่อย force-graph-html เพื่อการวิเคราะห์เชิงภาพและการโต้ตอบ/เชิงสำรวจเพิ่มเติม |
สำคัญ | ค่า/คำอธิบาย |
---|---|
radius_fan_out | ตัวคูณการคูณรัศมีโหนดสำหรับเมทริกการกระจายออก ค่าเริ่มต้น: 0.1 |
radius_fan_in | ตัวคูณการคูณรัศมีโหนดสำหรับเมตริก Fan-in ค่าเริ่มต้น: 0.1 |
radius_louvain | ตัวคูณการคูณรัศมีโหนดสำหรับเมตริก 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 | ซี++ | ||
.groovy | เก๋ | ||
.js / .jsx | จาวาสคริปต์ | ||
.ts / .tsx | TypeScript | ||
.k | คอตลิน | ||
.m / .h | วัตถุประสงค์-C | ||
.rb | ทับทิม | ||
.py | หลาม | ||
.go | ไป |
การตีความกราฟดังกล่าวมักเป็นเรื่องส่วนตัวและขึ้นอยู่กับโครงการ ตัวอย่างต่อไปนี้ควรช่วยในการจดจำรูปแบบบางอย่างผ่านตัวบ่งชี้และคำแนะนำ
ความมหัศจรรย์ของการเปิดเผยความเป็นโมดูลาร์อยู่ที่การใช้อัลกอริธึมการตรวจจับชุมชน เช่น การเพิ่มประสิทธิภาพ Louvain กับกราฟที่บังคับทิศทาง เพื่อให้ทั้งระยะทางและการระบายสีมีอิทธิพลต่อผลลัพธ์ ตัวอย่างต่อไปนี้ประกอบด้วยตัวบ่งชี้หลายตัวสำหรับโค้ดเบสแบบโมดูลาร์
ในตัวอย่างแรกทางด้านซ้าย คุณสามารถมองเห็นกลุ่มสีที่ต่อเนื่องกันหลายกลุ่ม ซึ่งแสดงการมีเพศสัมพันธ์ที่ต่ำตามระยะทางที่กำหนด (= สร้างขึ้นโดยกราฟที่กำกับด้วยแรง)
ในตัวอย่างที่สองทางด้านขวา กราฟเดียวกันถูกสร้างการแสดงผลด้วยตัวเรือคลัสเตอร์ที่เปิดใช้งาน ในตัวอย่างนี้ ตัวถังแสดงการทับซ้อนกันน้อยที่สุดหรือไม่มีการทับซ้อนกัน คำแนะนำดังกล่าวสามารถเป็นตัวบ่งชี้ถึงสถาปัตยกรรมซอฟต์แวร์ที่ดี เช่น ในแง่ของ โมดูลาร์ นามธรรม และ อินเทอร์เฟซ ที่กำหนดไว้อย่างดี
"ก้อนโคลนก้อนใหญ่มีโครงสร้างที่จัดวางอย่างไม่ตั้งใจ แผ่กิ่งก้านสาขา เลอะเทอะ มีเทปพันท่อและลวดสลิง สปาเก็ตตี้โค้ดจังเกิ้ล" (B. Foote, J. Yoder, 1997) กราฟประเภทนี้มักจะแสดงถึงสถาปัตยกรรมที่เหมาะสมน้อยกว่า ในการตรวจสอบ สปาเก็ตตี้โค้ดจัง เกิลชนิดนี้ เราสามารถเปิดใช้งานการเรนเดอร์ฮัลล์สำหรับคลัสเตอร์ทั้งหมดเพื่อระบุในที่สุดว่าจะมีคลัสเตอร์ใหญ่เพียงคลัสเตอร์เดียวเท่านั้น
บางครั้งการเข้าใจความซับซ้อนของสถาปัตยกรรมซอฟต์แวร์ได้ดีขึ้นอาจช่วยให้เข้าใจได้ดีขึ้นหากละเลยการขึ้นต่อกันที่ไม่เกี่ยวข้อง
ignore_dependencies_containing
(หรือ ignore_dependencies_matching
หากคุณต้องการนิพจน์ทั่วไป) ด้วยตัววัดการกระจายที่เปิดใช้งานเมื่อเปรียบเทียบกัน เราจะรับรู้ถึงการกระจัดกระจายมากขึ้น โหนดฮับที่อยู่ไกลออกไป และคลัสเตอร์ที่ชัดเจนยิ่งขึ้น ทั้งหมดนี้เป็นเบาะแสที่เป็นไปได้สำหรับสถาปัตยกรรมที่แท้จริง (= มักจะเข้าใจได้ง่ายกว่า) ที่อยู่ด้านล่าง