Emerge (oder emerge-viz ) ist ein interaktives Code-Analysetool, um Einblicke in die Quellcodestruktur, Metriken, Abhängigkeiten und Komplexität von Softwareprojekten zu gewinnen. Sie können den Quellcode eines Projekts scannen, Metrikergebnisse und Statistiken berechnen, eine interaktive Web-App mit Diagrammstrukturen (z. B. ein Abhängigkeitsdiagramm oder ein Dateisystemdiagramm) erstellen und die Ergebnisse in einige Dateiformate exportieren. Emerge bietet derzeit Parsing-Unterstützung für die folgenden Sprachen: C
, C++
, Groovy
, Java
, JavaScript
, TypeScript
, Kotlin
, ObjC
, Ruby
, Swift
, Python
, Go
. Die Struktur, Farbgebung und Clusterbildung wird berechnet und basiert auf der Idee, eine kraftgerichtete Graphensimulation und Louvain-Modularität zu kombinieren. emerge ist hauptsächlich in Python 3 geschrieben und wird auf macOS, Linux und modernen Webbrowsern (z. B. den neuesten Safari, Chrome, Firefox, Edge) getestet.
auftauchen (/ɪˈməːdʒ/)
- erscheinen, indem man aus etwas herauskommt oder hinter etwas hervorkommt
- bekannt werden, insbesondere dadurch, dass man etwas untersucht oder Fragen dazu stellt
Das Hauptziel dieses Projekts besteht darin, ein kostenloses/Open-Source-Tool zu erstellen, das von jedem, der sich für Softwareentwicklung, Architektur, Metriken und Visualisierung interessiert, problemlos verwendet werden kann, um mehr Einblicke in diese Themen zu gewinnen. Es soll durch einen explorativen Ansatz ein besseres Verständnis eines bestimmten Softwareprojekts ermöglichen/unterstützen.
C
, C++
, Groovy
, Java
, JavaScript
, TypeScript
, Kotlin
, ObjC
, Ruby
, Swift
, Python
Groovy
, Java
, Kotlin
, Swift
git-based
Metriken (SLOC, Whitespace Complexity, Change Coupling)SwiftUI
und Composable
-deklarativen UI-Entitätengit-based
Metriken, z. B. Code-AbwanderungAm einfachsten lässt sich Emergen in einem vorgefertigten Docker-Container verwenden. Die einzige Voraussetzung ist eine Docker-Engine. Zum Beispiel der Docker Desktop.
Bereiten Sie Ihren Arbeitsordner wie folgt vor
config.yml
?export
?source
Der Befehl zum Ausführen der Analyse lautet wie folgt:
docker run --rm -v <YOUR_WORKING_FOLDER_PATH>:/tmp/emerge achtelik/emerge:2.0.0 /tmp/emerge/config.yml
Der letzte Parameter ist der Pfad zur config.yml im Docker-Container.
⚡Sie können den Pyperclip-Fehler am Ende des Laufs ignorieren.
Wenn Sie den Vorschlag von oben verwenden, achten Sie darauf, dass Ihr analyses.source_directory
und export.directory
-Pfad mit /tmp/emerge
beginnen muss. Dies ist notwendig, da Ihre Analyse im Docker-Container ausgeführt wird.
Zum Beispiel:
---
project_name: java_project_example
loglevel: info
analyses:
- analysis_name: full java check
source_directory: /tmp/emerge/source
.
.
.
export:
- directory: /tmp/emerge/export
.
.
.
Der Docker-Container selbst ist pfadunabhängig. Fühlen Sie sich frei, Ihre eigenen Volume-Mount- und Projektkonfigurationspfade zu verwenden.
Grundsätzlich gibt es zwei Möglichkeiten, emerge zu installieren. Wenn Sie mit pip
vertraut sind (eine virtuelle Umgebung mit pyenv
, virtualenv
und virtualenvwrapper
wird empfohlen, ist aber nicht erforderlich), können Sie mit den folgenden wenigen Schritten einfach die neueste Version von emerge installieren.
Der empfohlene Weg wäre die Verwendung einer virtuellen Umgebung. Sie können dies anhand des folgenden Beispiels tun:
pyenv install 3.10.0
pyenv virtualenv 3.10.0 venv-3.10.0
pyenv activate venv-3.10.0
Sie können emerge einfach mit pip
installieren.
Stellen Sie unter Ubuntu 20.04+ bitte sicher, dass die Pakete graphviz
und graphviz-dev
installiert sind, d. h
apt-get install graphviz graphviz-dev
Entweder als neues Paket installieren mit:
pip install emerge-viz
oder wenn es bereits installiert ist, aktualisieren Sie es einfach mit:
pip install -U emerge-viz
und dann einfach so ausführen:
(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]
Sie können eine einfache Ad-hoc-Projektkonfiguration über die Befehlszeile erstellen und dann einfach die erforderlichen Quell-/Exportpfade anpassen
(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
und dann einfach die notwendigen Pfade anpassen ( analyses/source_directory
und 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 %
Danach können Sie einfach einen Scan starten
(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
Kopieren Sie nun einfach den oben genannten file://
-Pfad in einen beliebigen modernen Webbrowser und erkunden Sie interaktiv Ihre konfigurierte Codebasis
Sie können dieses Repository klonen und installieren, indem Sie dieser Anleitung folgen:
git clone https://github.com/glato/emerge.git
graphviz
Paket brew install graphviz
Wenn auf einem Apple Silicon Mac der folgende Fehler auftritt
pygraphviz/graphviz_wrap.c:2711:10: fatal error: ' graphviz/cgraph.h ' file not found
# include "graphviz/cgraph.h"
^~~~~~~~~~~~~~~~~~~
1 error generated.
Sie müssen den folgenden Befehl einmal ausführen, um die Pygraphviz-Include-Verzeichnisse für die neue Homebrew-Umgebung zu aktualisieren
pip install --global-option=build_ext --global-option= " -I $( brew --prefix graphviz ) /include/ " --global-option= " -L $( brew --prefix graphviz ) /lib/ " pygraphviz
Sehen Sie sich das Problem hier im Kontext an.
Überprüfen Sie, ob auf Ihrem macOS das neueste Python 3 installiert ist. Ich empfehle die Installation/Verwendung von Python 3 von Homebrew. Erstellen Sie eine virtuelle Python 3-Umgebung (optional innerhalb der Projektstruktur)
cd emerge
pip3 install virtualenv
virtualenv -p python3 venv
Erforderliche Pakete installieren und eine virtuelle Python 3-Umgebung erstellen (optional innerhalb der Projektstruktur)
apt-get install python3-venv python3-dev graphviz graphviz-dev
cd emerge
python3 -m venv venv
source venv/bin/activate
Installieren Sie alle erforderlichen Abhängigkeiten für das Projekt mit pip
pip install -r requirements.txt
Installieren Sie das Wheel-Paket und installieren Sie anschließend alle erforderlichen Abhängigkeiten für das Projekt mit pip
pip install wheel
pip install -r requirements.txt
Führen Sie Folgendes aus dem geklonten Projektstammverzeichnis aus:
python -m unittest discover -v -s ./emerge -p "test_*.py"
Andernfalls führen Sie das Skript run_tests.py
aus:
python run_tests.py
Wenn Sie beim Ausführen der Tests Probleme haben, sehen Sie sich diese Problemumgehung an.
emerge
zu einem eigenständigen Tool (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]
Versuchen wir schnell, emerge auf einer eigenen Codebasis auszuführen
python emerge.py -c configs/emerge.yaml
Dies sollte eine ähnliche Ausgabe erzeugen:
... 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
Kopieren Sie nun einfach den oben genannten file://
-Pfad in einen beliebigen modernen Webbrowser und erkunden Sie interaktiv die Emerge-Codebasis
s
um einen bestimmten Knoten auszuwählen und hervorzuheben oder die Auswahl aufzuhebenr
f
drückenUnd jetzt machen wir es interessanter ...
Wenn Sie emerge für andere Projekte verwenden möchten, können Sie einfach eine der vorhandenen Konfigurationsvorlagen aus dem Verzeichnis emerge/configs
kopieren oder anpassen.
Für einen schnellen Durchlauf sollte es ausreichen, directory
source_directory
in export
anzupassen.
---
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
Nachdem Sie eine vorhandene Konfiguration angepasst (z. B. config/c-template.yaml
) oder Ihre eigene erstellt haben, führen Sie einfach emerge erneut mit dieser neuen Konfiguration aus
python emerge.py -c configs/c-template.yaml
Nach dem Scan befindet sich Ihre Scanausgabe (einschließlich Ihrer interaktiven Web-App) in dem Verzeichnis, das Sie erstellt und im Konfigurationsparameter export
-> directory
festgelegt haben, wie in den Protokollen oben zu sehen ist.
Eine vollständige YAML-Konfiguration, die sowohl Datei- als auch Entitätsscan enthält, hat das folgende Format:
---
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
Manchmal kann es sinnvoll sein, plattformübliche Abhängigkeiten oder Abhängigkeiten, die nicht viel zum Verständnis eines Projekts beitragen, auszuschließen. Ein guter Ausgangspunkt für z. B. ein Android-Projekt könnte der folgende Abschnitt ignore_dependencies_containing
sein:
ignore_dependencies_containing :
- android
- java
- javax
oder für ein iOS-Projekt ist der folgende Abschnitt ignore_entities_containing
oft sinnvoll, z. B. um SwiftUI-Vorschauen für die Diagrammausgabe nicht zu berücksichtigen:
ignore_entities_containing :
- _Previews
Die Yaml-Konfiguration ist grundsätzlich auf den folgenden Ebenen definiert:
Schlüssel | Wert/Beschreibung |
---|---|
project_name | einen Projektnamen für alle Analysen, Scans und Exporte |
loglevel | Legen Sie eine Protokollebene fest: error (stumm, nur Fehler), info (einschließlich error ) liefert Ihnen grundlegende Protokolle zum Kontrollfluss, debug (einschließlich info ) erstellt viele Debug-Protokolle |
analyses | Eine Reihe von Analysen, die individuell konfiguriert werden können, sodass ein Projekt eine oder mehrere Analysen enthalten kann. |
Schlüssel | Wert/Beschreibung |
---|---|
analysis_name | einen bestimmten Analysenamen |
source_directory | das Quellverzeichnis, in dem der rekursive Dateiscan beginnen soll |
git_directory | das Git-Repo-Verzeichnis, wenn Git-Metriken enthalten sein sollen |
git_commit_limit | Wie viele Commits vom letzten Commit sollten abgebaut werden? Standard: 150 |
git_exclude_merge_commits | Sollten Merge-Commits vom Mining aller Metriken ausgeschlossen werden? Standard: true |
ignore_files_containing | Dateinamen vom Scan ausschließen, die die angegebenen Teilzeichenfolgen enthalten |
ignore_directories_containing | Verzeichnisnamen vom Scan ausschließen, die die angegebenen Teilzeichenfolgen enthalten |
only_permit_languages | Zu den möglichen Werten gehören: Java, Kotlin, Objc, Swift, Ruby, Groovy, Javascript, C – verhindert ausdrücklich das Scannen anderer Sprachen als der hier festgelegten |
only_permit_file_extensions | Erlauben Sie explizit die folgenden Dateierweiterungen, die Sie hier festlegen, z. B. .java |
only_permit_files_matching_absolute_path | Für den Dateiscan ist nur die folgende Liste absoluter Dateipfade zulässig, z. B. [/Users/user1/source/file1.java] . Die Dateien sollten source_directory folgen |
ignore_dependencies_containing | Ignorieren Sie alle in dieser Liste von Teilzeichenfolgen enthaltenen Abhängigkeiten, z. B. java.util |
ignore_dependencies_matching | Ignorieren Sie jede Abhängigkeit, die mit einem der regulären Ausdrücke in dieser Liste von Teilzeichenfolgen übereinstimmt, z. B. ^java.util. |
ignore_entities_containing | Ignorieren Sie alle in dieser Liste von Teilzeichenfolgen enthaltenen Entitäten, z. B. NotRelevantClass |
ignore_entities_matching | Ignorieren Sie jede Entität, die einem der regulären Ausdrücke in dieser Liste von Teilzeichenfolgen entspricht, z. B. ^Test |
import_aliases | Definieren Sie eine Liste von Import-Aliasnamen, dh ersetzen Sie Teilzeichenfolgen innerhalb eines vollständigen Abhängigkeitspfads, z. B. "@foo": src/foo ersetzt jeden @foo -Alias durch src/foo |
override_resolve_dependencies | Wenn dies vom Sprachparser unterstützt wird, erzwingen Sie die Auflösung aller Abhängigkeiten in dieser Liste |
override_do_not_resolve_dependencies | Wenn dies vom Sprachparser unterstützt wird, erzwingen Sie, dass jede Abhängigkeit in dieser Liste NICHT aufgelöst wird (d. h. als globale Abhängigkeit behandelt wird). |
file_scan | Einen Dateiscan durchführen, enthält die Metriken, die auf jede Quelldatei angewendet werden sollen |
entity_scan | führt einen Entitätsscan durch, enthält die Metriken, die auf jede Entität angewendet werden sollen (z. B. auf jede Klasse) |
export | enthält alle Exportformate, die als Ausgabe erstellt werden sollen |
appconfig | Enthält alle konfigurierbaren App-Konfigurationsparameter |
Schlüssel | Wert/Beschreibung |
---|---|
dependency_graph | Erstellen Sie eine Abhängigkeitsdiagrammstruktur basierend auf Quelldateien. Den Diagrammknoten werden zusätzliche Metriken hinzugefügt |
source_lines_of_code | Wenden Sie eine Quellcodezeilenmetrik auf jede Datei an und erstellen Sie eine Gesamtmetrik |
number_of_methods | Wenden Sie eine Reihe von Metrikmethoden auf jede Datei an und erstellen Sie eine Gesamtmetrik |
fan_in_out | Wenden Sie auf jede Datei eine Fan-In-/Fan-Out-Diagrammmetrik an und erstellen Sie eine Gesamtmetrik |
louvain_modularity | Wenden Sie eine Louvain-Modularitätsmetrik auf jede Datei an und erstellen Sie eine Gesamtmetrik |
tfidf | Wenden Sie eine TFIDF-Metrik auf jede Datei an und extrahieren Sie relevante semantische Schlüsselwörter |
ws_complexity | Wenden Sie auf jede Datei eine Leerraumkomplexitätsmetrik an |
git_metrics | Fügen Sie einige Git-basierte Metriken hinzu und versuchen Sie, sie auf jede Datei anzuwenden |
Schlüssel | Wert/Beschreibung |
---|---|
dependency_graph | Erstellen Sie eine Abhängigkeitsdiagrammstruktur basierend auf extrahierten Entitäten aus Dateien. Den Diagrammknoten werden zusätzliche Metriken hinzugefügt |
inheritance_graph | Erstellen Sie eine Vererbungsdiagrammstruktur basierend auf extrahierten Entitäten aus Dateien. Den Diagrammknoten werden zusätzliche Metriken hinzugefügt |
complete_graph | Erstellen Sie eine vollständige Diagrammstruktur (Vereinigung von Abhängigkeits-/Vererbungsdiagramm) basierend auf extrahierten Entitäten aus Dateien. Den Diagrammknoten werden zusätzliche Metriken hinzugefügt |
source_lines_of_code | Wenden Sie eine Quellcodezeilenmetrik auf jede Entität an und erstellen Sie eine Gesamtmetrik |
number_of_methods | Wenden Sie eine Reihe von Metrikmethoden auf jede Entität an und erstellen Sie eine Gesamtmetrik |
fan_in_out | Wenden Sie eine Fan-In-/Fan-Out-Diagrammmetrik auf jede Entität an und erstellen Sie eine Gesamtmetrik |
louvain_modularity | Wenden Sie eine Louvain-Modularitätsmetrik auf jede Entität an und erstellen Sie eine Gesamtmetrik |
tfidf | Wenden Sie eine TFIDF-Metrik auf jede Entität an und extrahieren Sie relevante semantische Schlüsselwörter |
Schlüssel | Wert/Beschreibung |
---|---|
directory | das Ausgabeverzeichnis für alle angegebenen Exportformate |
graphml | Erstellen Sie eine graphML-Datei, die die Diagrammstruktur und die den Knoten des Diagramms zugeordneten Metrikergebnisse enthält |
tabular_file | Erstellen Sie eine tabellarisch formatierte Textdatei, die alle Metrik- und Statistikergebnisse enthält |
tabular_console | Drucken Sie eine tabellarisch formatierte Ausgabe an die Konsole, die alle Metrik- und Statistikergebnisse enthält |
tabular_console_overall | Drucken Sie eine tabellarisch formatierte Ausgabe an die Konsole, die nur Gesamtmetrik- und Statistikergebnisse enthält |
json | Erstellen Sie eine JSON-Datei, die alle Metrik- und Statistikergebnisse enthält |
d3 | Erstellen Sie eine Bootstrap/D3-Webanwendung im Unterordner force-graph-html für weitere visuelle und interaktive/explorative Analysen |
Schlüssel | Wert/Beschreibung |
---|---|
radius_fan_out | Knotenradius-Multiplikationsfaktor für die Fan-Out-Metrik, Standard: 0.1 |
radius_fan_in | Knotenradius-Multiplikationsfaktor für die Fan-In-Metrik, Standard: 0.1 |
radius_louvain | Knotenradius-Multiplikationsfaktor für die Louvain-Metrik, Standard: 0.02 |
radius_sloc | Knotenradius-Multiplikationsfaktor für die Sloc-Metrik, Standard: 0.005 |
radius_number_of_methods | Knotenradius-Multiplikationsfaktor für die Anzahl der Methodenmetrik, Standard: 0.05 |
heatmap_sloc_active | Sollte die Sloc-Metrik in die Berechnung des Heatmap-Scores einbezogen werden? Standard: true |
heatmap_fan_out_active | Sollte die Fan-Out-Metrik in die Berechnung des Heatmap-Scores einbezogen werden? Standard: true |
heatmap_sloc_weight | Gewichtungsfaktor der Sloc-Metrik innerhalb der Heatmap-Score-Berechnung, Standard: 1.5 |
heatmap_fan_out_weight | Gewichtungsfaktor der Fan-Out-Metrik innerhalb der Heatmap-Score-Berechnung, Standard: 1.7 |
heatmap_score_base | Minimaler Bewertungsschwellenwert für die Heatmap-Farbzuordnung, Standard: 10 |
heatmap_score_limit | Maximaler Bewertungsschwellenwert für die Heatmap-Farbzuordnung, Standard: 300 |
Emerge unterstützt die folgenden Dateierweiterungen und Scan-Typen pro Sprache, während ein file_scan
lediglich Metriken berechnet und Knoten innerhalb von Diagrammstrukturen gescannten Dateien zuordnet und ein entity_scan
versucht, feinkörnigere Entitäten aus Dateien zu extrahieren, z. B. Klassen oder Strukturen.
Dateierweiterung | Sprachparser | Dateien | Entitäten |
---|---|---|---|
.java | Java | ✅ | ✅ |
.swift | Schnell | ✅ | ✅ |
.c / .h / .hpp | C | ✅ | |
.cpp / .h / .hpp | C++ | ✅ | |
.groovy | Groovig | ✅ | ✅ |
.js / .jsx | JavaScript | ✅ | |
.ts / .tsx | Typoskript | ✅ | |
.k | Kotlin | ✅ | ✅ |
.m / .h | Ziel-C | ✅ | |
.rb | Rubin | ✅ | |
.py | Python | ✅ | |
.go | Gehen | ✅ |
Die Interpretation solcher Diagramme kann oft sehr subjektiv und projektabhängig sein. Die folgenden Beispiele sollen dabei helfen, durch Indikatoren und Hinweise bestimmte Muster zu erkennen.
Der Zauber der Entdeckung der Modularität liegt in der Anwendung eines Community-Erkennungsalgorithmus, z. B. der Louvain-Optimierung, auf einen kraftgerichteten Graphen, sodass sowohl Abstände als auch Farbgebung das Ergebnis beeinflussen. Das folgende Beispiel enthält mehrere Indikatoren für eine modulare Codebasis.
Im ersten Beispiel auf der linken Seite können Sie mehrere kohärente farbige Cluster erkennen, die über einen bestimmten Abstand (= erzeugt durch den kraftgerichteten Graphen) eine geringe Kopplung aufweisen.
Im zweiten Beispiel rechts wird derselbe Graph mit aktivierten Clusterhüllen gerendert. In diesem Beispiel zeigen die Rümpfe minimale bis keine Überlappungen. Solche Hinweise können Indikatoren für eine gute Softwarearchitektur sein, beispielsweise im Hinblick auf Modularität , Abstraktion und gut definierte Schnittstellen .
„A BIG BALL OF MUD ist willkürlich strukturiert, weitläufig, schlampig, Klebeband und Sicherungsdraht, Spaghetti-Code-Dschungel“ (B. Foote, J. Yoder, 1997). Diese Art von Diagramm stellt oft eine weniger optimale Architektur dar. Um einen solchen Spaghetti-Code-Dschungel zu verifizieren, kann man einfach das Hüllen-Rendering für alle Cluster aktivieren, um schließlich festzustellen: Es gibt schließlich nur einen großen Cluster.
Manchmal kann es helfen, die Komplexität einer Softwarearchitektur besser zu verstehen, wenn irrelevante Abhängigkeiten ignoriert werden.
ignore_dependencies_containing
entfernen (oder ignore_dependencies_matching
, wenn Sie reguläre Ausdrücke bevorzugen). Bei einer vergleichsweise aktivierten Fan-Out-Metrik erkennt man mehr Streuung, einige entfernte Hub-Knoten und klarere Cluster. All dies sind mögliche Hinweise auf die tatsächliche (= oft verständlichere) Architektur darunter.