Emerge (atau emerging-viz ) adalah alat analisis kode interaktif untuk mengumpulkan wawasan tentang struktur kode sumber, metrik, ketergantungan, dan kompleksitas proyek perangkat lunak. Anda dapat memindai kode sumber suatu proyek, menghitung hasil metrik dan statistik, membuat aplikasi web interaktif dengan struktur grafik (misalnya grafik ketergantungan atau grafik sistem file) dan mengekspor hasilnya dalam beberapa format file. Emerge saat ini memiliki dukungan parsing untuk bahasa berikut: C
, C++
, Groovy
, Java
, JavaScript
, TypeScript
, Kotlin
, ObjC
, Ruby
, Swift
, Python
, Go
. Struktur, pewarnaan, dan pengelompokan dihitung dan didasarkan pada gagasan menggabungkan simulasi grafik berarah gaya dan modularitas Louvain. emerging sebagian besar ditulis dengan Python 3 dan diuji pada macOS, linux, dan browser web modern (yaitu Safari, Chrome, Firefox, Edge terbaru).
muncul (/ɪˈməːdʒ/)
- untuk muncul dengan keluar dari sesuatu atau keluar dari belakang sesuatu
- untuk diketahui, terutama sebagai hasil dari memeriksa sesuatu atau mengajukan pertanyaan tentangnya
Tujuan utama dari proyek ini adalah untuk menciptakan alat gratis/sumber terbuka, yang dapat dengan mudah digunakan oleh siapa saja yang tertarik pada pengembangan perangkat lunak, arsitektur, metrik, dan visualisasi untuk mengumpulkan lebih banyak wawasan tentang topik-topik tersebut. Ini harus memfasilitasi/mendukung pemahaman yang lebih baik tentang proyek perangkat lunak tertentu dengan menggunakan pendekatan eksplorasi.
C
, C++
, Groovy
, Java
, JavaScript
, TypeScript
, Kotlin
, ObjC
, Ruby
, Swift
, Python
Groovy
, Java
, Kotlin
, Swift
git-based
tambahan (SLOC, Kompleksitas Spasi Putih, Kopling Perubahan)SwiftUI
dan Composable
git-based
misalnya churn kodeCara termudah untuk menggunakan emerging di container Docker yang sudah dibuat sebelumnya. Satu-satunya prasyarat adalah memiliki mesin Docker. Misalnya Docker Desktop.
Siapkan folder kerja Anda seperti ini
config.yml
?export
?source
Perintah untuk menjalankan analisis adalah:
docker run --rm -v <YOUR_WORKING_FOLDER_PATH>:/tmp/emerge achtelik/emerge:2.0.0 /tmp/emerge/config.yml
Parameter terakhir adalah path ke config.yml di dalam container Docker.
⚡Anda dapat mengabaikan kesalahan Pyperclip di akhir proses.
Jika Anda menggunakan saran di atas, perhatikan bahwa jalur analyses.source_directory
dan export.directory
Anda harus dimulai dengan /tmp/emerge
. Ini diperlukan karena analisis Anda berjalan di dalam container Docker.
Misalnya:
---
project_name: java_project_example
loglevel: info
analyses:
- analysis_name: full java check
source_directory: /tmp/emerge/source
.
.
.
export:
- directory: /tmp/emerge/export
.
.
.
Kontainer Docker sendiri tidak bergantung pada jalur. Jangan ragu untuk menggunakan pemasangan volume dan jalur konfigurasi proyek Anda sendiri.
Pada dasarnya ada dua cara untuk menginstall emerging. Jika Anda familiar dengan pip
(disarankan menggunakan lingkungan virtual dengan pyenv
, virtualenv
dan virtualenvwrapper
, namun tidak diperlukan), Anda cukup menginstal versi terbaru dari emerging dengan beberapa langkah berikut.
Cara yang disarankan adalah dengan menggunakan virtual env, Anda dapat melakukannya dengan menggunakan contoh berikut:
pyenv install 3.10.0
pyenv virtualenv 3.10.0 venv-3.10.0
pyenv activate venv-3.10.0
Anda cukup menginstal emerging dengan menggunakan pip
.
Di Ubuntu 20.04+ harap pastikan bahwa paket graphviz
dan graphviz-dev
diinstal, yaitu
apt-get install graphviz graphviz-dev
Instal sebagai paket baru dengan:
pip install emerge-viz
atau jika sudah terinstall langsung saja update dengan :
pip install -U emerge-viz
dan kemudian jalankan saja seperti ini:
(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]
Anda dapat membuat konfigurasi proyek sederhana adhoc dari baris perintah dan kemudian menyesuaikan jalur sumber/ekspor yang diperlukan
(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
dan kemudian cukup sesuaikan jalur yang diperlukan ( analyses/source_directory
dan 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 %
Setelah ini, Anda cukup memulai pemindaian
(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
Sekarang cukup salin jalur file://
yang disebutkan di atas ke browser web modern mana pun dan jelajahi basis kode konfigurasi Anda secara interaktif
Anda dapat mengkloning repositori ini dan menginstalnya dengan mengikuti instruksi ini:
git clone https://github.com/glato/emerge.git
graphviz
terlebih dahulu brew install graphviz
Jika Anda mengalami kesalahan berikut pada Mac silikon Apple
pygraphviz/graphviz_wrap.c:2711:10: fatal error: ' graphviz/cgraph.h ' file not found
# include "graphviz/cgraph.h"
^~~~~~~~~~~~~~~~~~~
1 error generated.
Anda perlu menjalankan perintah berikut sekali untuk memperbarui direktori penyertaan pygraphviz untuk lingkungan homebrew baru
pip install --global-option=build_ext --global-option= " -I $( brew --prefix graphviz ) /include/ " --global-option= " -L $( brew --prefix graphviz ) /lib/ " pygraphviz
Lihat masalahnya dalam konteks di sini.
Periksa apakah Anda telah menginstal Python 3 terbaru di macOS Anda. Saya sarankan menginstal/menggunakan Python 3 dari Homebrew. Buat lingkungan virtual Python 3 (opsional dalam struktur proyek)
cd emerge
pip3 install virtualenv
virtualenv -p python3 venv
Instal paket yang diperlukan dan buat lingkungan virtual Python 3 (opsional dalam struktur proyek)
apt-get install python3-venv python3-dev graphviz graphviz-dev
cd emerge
python3 -m venv venv
source venv/bin/activate
Instal semua dependensi yang diperlukan untuk proyek dengan pip
pip install -r requirements.txt
Instal paket wheel, setelah itu instal semua dependensi yang diperlukan untuk proyek dengan pip
pip install wheel
pip install -r requirements.txt
Jalankan perintah berikut dari root proyek yang dikloning:
python -m unittest discover -v -s ./emerge -p "test_*.py"
jika tidak, jalankan skrip run_tests.py
:
python run_tests.py
Jika Anda mengalami masalah dalam menjalankan pengujian, periksa solusi ini.
emerge
sebagai alat yang berdiri sendiri (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]
Mari kita segera mencoba menjalankan emerging pada basis kodenya sendiri
python emerge.py -c configs/emerge.yaml
Ini akan menghasilkan keluaran serupa:
... 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
Sekarang salin jalur file://
yang disebutkan di atas ke browser web modern mana pun dan ekspos basis kode emerging secara interaktif
s
untuk memilih dan menyorot atau membatalkan pilihan node tertentur
f
Dan sekarang mari kita buat ini lebih menarik...
Jika Anda ingin menggunakan emerging pada proyek lain, Anda cukup menyalin atau menyesuaikan salah satu templat konfigurasi yang ada dari direktori emerge/configs
.
Untuk menjalankannya dengan cepat, cukup dengan menyesuaikan source_directory
, directory
dalam 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
Setelah mengkustomisasi konfigurasi yang ada (misalnya config/c-template.yaml
) atau membuat konfigurasi Anda sendiri, jalankan kembali emerging dengan konfigurasi baru ini
python emerge.py -c configs/c-template.yaml
Setelah pemindaian, keluaran pemindaian Anda (termasuk aplikasi web interaktif Anda) dapat ditemukan di direktori yang Anda buat dan atur di parameter konfigurasi export
-> directory
, seperti yang terlihat pada log di atas.
Konfigurasi YAML lengkap yang berisi pemindaian file dan entitas memiliki format berikut:
---
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
Kadang-kadang masuk akal untuk mengecualikan ketergantungan platform-biasa atau ketergantungan yang tidak memberikan banyak kontribusi terhadap pemahaman suatu proyek. Titik awal yang baik misalnya proyek Android dapat berupa bagian ignore_dependencies_containing
berikut ini:
ignore_dependencies_containing :
- android
- java
- javax
atau untuk proyek iOS, bagian ignore_entities_containing
berikut sering kali masuk akal, misalnya tidak mempertimbangkan pratinjau SwiftUI untuk keluaran grafik:
ignore_entities_containing :
- _Previews
Konfigurasi yaml pada dasarnya didefinisikan pada level berikut:
kunci | nilai/deskripsi |
---|---|
project_name | nama proyek untuk semua analisis, pemindaian, dan ekspor |
loglevel | atur loglevel: error (diam, hanya kesalahan), info (termasuk error ) memberi Anda log dasar tentang aliran kontrol, debug (termasuk info ) akan menghasilkan banyak log debug |
analyses | serangkaian analisis yang dapat dikonfigurasi secara individual, sehingga suatu proyek dapat berisi satu hingga banyak analisis. |
kunci | nilai/deskripsi |
---|---|
analysis_name | nama analisis tertentu |
source_directory | direktori sumber tempat pemindaian file rekursif harus dimulai |
git_directory | direktori git repo, jika metrik git harus disertakan |
git_commit_limit | berapa banyak komitmen dari komitmen terakhir yang harus ditambang? standar: 150 |
git_exclude_merge_commits | haruskah penggabungan komit dikecualikan dari penambangan semua metrik? bawaan: true |
ignore_files_containing | kecualikan nama file dari pemindaian yang berisi substring tertentu |
ignore_directories_containing | kecualikan nama direktori dari pemindaian yang berisi substring tertentu |
only_permit_languages | nilai yang mungkin meliputi: java, kotlin, objc, swift, ruby, groovy, javascript, c - secara eksplisit mencegah pemindaian bahasa lain selain yang Anda tetapkan di sini |
only_permit_file_extensions | secara eksplisit mengizinkan ekstensi file berikut yang Anda tetapkan di sini, misalnya .java |
only_permit_files_matching_absolute_path | hanya daftar jalur file absolut berikut yang diizinkan untuk pemindaian file, misalnya [/Users/user1/source/file1.java] . File harus mengikuti source_directory |
ignore_dependencies_containing | abaikan setiap ketergantungan yang termasuk dalam daftar substring ini, misalnya java.util |
ignore_dependencies_matching | abaikan setiap ketergantungan yang cocok dengan ekspresi reguler mana pun dalam daftar substring ini, misalnya ^java.util. |
ignore_entities_containing | abaikan setiap entitas yang termasuk dalam daftar substring ini, misalnya NotRelevantClass |
ignore_entities_matching | abaikan setiap entitas yang cocok dengan ekspresi reguler mana pun dalam daftar substring ini, misalnya ^Test |
import_aliases | tentukan daftar alias impor, yaitu mengganti substring dalam jalur ketergantungan penuh, misalnya "@foo": src/foo akan mengganti alias @foo dengan src/foo |
override_resolve_dependencies | jika didukung oleh pengurai bahasa, paksakan setiap ketergantungan dalam daftar ini untuk diselesaikan |
override_do_not_resolve_dependencies | jika didukung oleh pengurai bahasa, paksakan setiap ketergantungan dalam daftar ini untuk TIDAK diselesaikan (yaitu diperlakukan sebagai ketergantungan global) |
file_scan | melakukan pemindaian file, berisi metrik yang harus diterapkan pada setiap file sumber |
entity_scan | melakukan pemindaian entitas, berisi metrik yang harus diterapkan pada setiap entitas (misalnya pada setiap kelas) |
export | berisi format ekspor apa pun yang harus dibuat sebagai output |
appconfig | berisi parameter konfigurasi aplikasi yang dapat dikonfigurasi |
kunci | nilai/deskripsi |
---|---|
dependency_graph | membuat struktur grafik ketergantungan berdasarkan file sumber, metrik tambahan akan ditambahkan ke node grafik |
source_lines_of_code | terapkan baris kode sumber metrik ke setiap file, buat metrik keseluruhan |
number_of_methods | terapkan sejumlah metrik metode ke setiap file, buat metrik keseluruhan |
fan_in_out | terapkan metrik grafik fan in/fan out ke setiap file, buat metrik keseluruhan |
louvain_modularity | terapkan metrik modularitas louvain ke setiap file, buat metrik keseluruhan |
tfidf | terapkan metrik tfidf ke setiap file dan ekstrak kata kunci semantik yang relevan |
ws_complexity | menerapkan metrik kompleksitas spasi putih ke setiap file |
git_metrics | sertakan beberapa metrik berbasis git dan coba terapkan ke setiap file |
kunci | nilai/deskripsi |
---|---|
dependency_graph | membuat struktur grafik ketergantungan berdasarkan entitas yang diekstraksi dari file, metrik tambahan akan ditambahkan ke node grafik |
inheritance_graph | membuat struktur grafik pewarisan berdasarkan entitas yang diekstraksi dari file, metrik tambahan akan ditambahkan ke node grafik |
complete_graph | membuat struktur grafik lengkap (penyatuan grafik ketergantungan/pewarisan) berdasarkan entitas yang diekstraksi dari file, metrik tambahan akan ditambahkan ke node grafik |
source_lines_of_code | terapkan baris kode sumber metrik ke setiap entitas, buat metrik keseluruhan |
number_of_methods | terapkan sejumlah metrik metode ke setiap entitas, buat metrik keseluruhan |
fan_in_out | terapkan metrik grafik fan in/fan out ke setiap entitas, buat metrik keseluruhan |
louvain_modularity | terapkan metrik modularitas louvain ke setiap entitas, buat metrik keseluruhan |
tfidf | terapkan metrik tfidf ke setiap entitas dan ekstrak kata kunci semantik yang relevan |
kunci | nilai/deskripsi |
---|---|
directory | direktori keluaran untuk semua format ekspor yang ditentukan |
graphml | buat file graphML yang berisi struktur grafik dan hasil metrik yang dipetakan ke node grafik |
tabular_file | buat file teks berformat tabel yang berisi setiap hasil metrik dan statistik |
tabular_console | cetak keluaran berformat tabel ke konsol yang berisi setiap hasil metrik dan statistik |
tabular_console_overall | cetak keluaran berformat tabel ke konsol yang hanya berisi hasil metrik dan statistik keseluruhan |
json | buat file JSON yang berisi setiap hasil metrik dan statistik |
d3 | buat aplikasi web Bootstrap/D3 di subfolder force-graph-html untuk analisis visual dan interaktif/eksplorasi lebih lanjut |
kunci | nilai/deskripsi |
---|---|
radius_fan_out | faktor perkalian radius simpul untuk metrik penyebaran, default: 0.1 |
radius_fan_in | faktor perkalian radius simpul untuk metrik kipas masuk, default: 0.1 |
radius_louvain | faktor perkalian radius simpul untuk metrik louvain, default: 0.02 |
radius_sloc | faktor perkalian radius simpul untuk metrik sloc, default: 0.005 |
radius_number_of_methods | faktor perkalian radius simpul untuk jumlah metrik metode, default: 0.05 |
heatmap_sloc_active | haruskah metrik sloc dimasukkan dalam penghitungan skor peta panas? bawaan: true |
heatmap_fan_out_active | apakah metrik penyebaran harus disertakan dalam penghitungan skor peta panas? bawaan: true |
heatmap_sloc_weight | faktor bobot metrik sloc dalam penghitungan skor peta panas, default: 1.5 |
heatmap_fan_out_weight | faktor bobot metrik penyebaran dalam perhitungan skor peta panas, default: 1.7 |
heatmap_score_base | ambang skor minimum untuk pemetaan warna peta panas, default: 10 |
heatmap_score_limit | ambang skor maksimal untuk pemetaan warna peta panas, default: 300 |
Emerge mendukung ekstensi file berikut dan jenis pemindaian per bahasa, sedangkan file_scan
hanya menghitung metrik dan memetakan node dalam struktur grafik ke file yang dipindai dan entity_scan
mencoba mengekstrak entitas yang lebih detail dari file, misalnya kelas atau struct.
Ekstensi file | Pengurai bahasa | File | Entitas |
---|---|---|---|
.java | Jawa | ✅ | ✅ |
.swift | Cepat | ✅ | ✅ |
.c / .h / .hpp | C | ✅ | |
.cpp / .h / .hpp | C++ | ✅ | |
.groovy | asyik | ✅ | ✅ |
.js / .jsx | JavaScript | ✅ | |
.ts / .tsx | skrip ketikan | ✅ | |
.k | Kotlin | ✅ | ✅ |
.m / .h | Tujuan-C | ✅ | |
.rb | Rubi | ✅ | |
.py | ular piton | ✅ | |
.go | Pergi | ✅ |
Penafsiran grafik seperti itu seringkali sangat subyektif dan bergantung pada proyek. Contoh-contoh berikut akan membantu mengenali pola-pola tertentu melalui indikator dan petunjuk.
Keajaiban mengungkap modularitas terletak pada penerapan algoritme deteksi komunitas, misalnya pengoptimalan Louvain, pada grafik yang diarahkan oleh gaya, sehingga jarak dan warna memengaruhi hasilnya. Contoh berikut mencakup beberapa indikator untuk basis kode modular.
Pada contoh pertama di sebelah kiri, Anda dapat melihat beberapa cluster berwarna koheren yang menunjukkan kopling rendah pada jarak tertentu (= dihasilkan oleh grafik berarah gaya).
Pada contoh kedua di sebelah kanan, grafik yang sama ditampilkan dengan cluster lambung yang diaktifkan. Pada contoh ini lambung kapal menunjukkan sedikit atau tidak ada tumpang tindih. Petunjuk tersebut dapat menjadi indikator arsitektur perangkat lunak yang baik, misalnya dalam hal modularitas , abstraksi , dan antarmuka yang terdefinisi dengan baik.
"BOLA LUMPUR BESAR terstruktur secara sembarangan, luas, tidak rapi, lakban dan kawat penahan, kode spageti hutan" (B. Foote, J. Yoder, 1997). Grafik semacam ini seringkali mewakili arsitektur yang kurang optimal. Untuk memverifikasi hutan kode spageti semacam ini, seseorang cukup mengaktifkan rendering lambung untuk semua cluster untuk akhirnya menentukan: bagaimanapun juga, hanya ada satu cluster besar.
Terkadang memahami kompleksitas arsitektur perangkat lunak dengan lebih baik dapat membantu jika ketergantungan yang tidak relevan diabaikan.
ignore_dependencies_containing
(atau ignore_dependencies_matching
jika Anda lebih suka ekspresi reguler). Dengan metrik fan-out yang diaktifkan secara komparatif, seseorang dapat mengenali lebih banyak hamburan, beberapa node hub yang jauh, dan cluster yang lebih jelas. Semua ini adalah petunjuk yang mungkin mengenai arsitektur sebenarnya (= seringkali lebih mudah dipahami) di bawahnya.