it-swarm.com.de

Wie soll ich die Struktur meines Codes visualisieren?

Ich habe eine Anwendung in Java geschrieben. In ist in mehreren Dateien gespeichert. Es werden verschiedene Klassen mit unterschiedlichen Methoden verwendet. Der Code ist groß und kompliziert. Ich denke, es wäre einfacher, den Code zu verstehen, wenn ich ein grafisches Modell des Codes hätte (eine Art gerichteter Graph). Gibt es einige Standardmethoden für die Visualisierung von Code. Ich denke über die Verwendung von UML nach (nicht sicher, ob es eine richtige Wahl ist). Kann mir jemand was empfehlen?

HINZUGEFÜGT:

Ich betrachte zwei Möglichkeiten:

  1. Erstellen der Grafik von Hand (explizit).
  2. Automatische Erstellung eines Diagramms. Verwenden Sie beispielsweise einige Tools, die den verfügbaren Code lesen und ein Diagramm generieren, das die Struktur des Codes beschreibt.

HINZUGEFÜGT 2:

Es wäre schön, etwas umsonst zu haben.

38
Roman

Das wichtigste Werkzeug, das Sie verwenden sollten, ist Ihr Gehirn und es ist kostenlos.

Es gibt keinen Grund, warum Sie eine beliebige Standard-Visualisierungsmethode verwenden müssen, und Sie können jedes beliebige Medium verwenden. Papier, Whiteboard, Photoshop, Visio, PowerPoint, Notepad: All dies kann effektiv sein. Zeichnen Sie ein Diagramm mit Klassen, Objekten, Methoden, Eigenschaften und Variablen - was immer Sie für nützlich halten, um die Anwendung zu verstehen. Das Publikum besteht nicht nur aus anderen Mitgliedern Ihres Teams, sondern auch aus Ihnen. Erstellen Sie Diagramme, die hilfreich für Sie sind, um sie zu betrachten und schnell zu verstehen. Stellen Sie sie in Ihrem Arbeitsbereich auf, und sehen Sie sich regelmäßig an, um sich beim Erstellen an die gesamte Systemarchitektur zu erinnern.

UML und andere Standards für die Codedokumentation sind gute Richtlinien für die Diagrammtypen und die Informationen, die Sie berücksichtigen sollten. Es ist jedoch für die meisten Anwendungen ein Overkill und besteht im Wesentlichen für Personen, die keine persönliche Verantwortung für das Dokumentieren ohne Standards übernehmen können. Wenn Sie der UML bis zum Ende folgen, müssen Sie viel zu viel Zeit für Ihre Dokumentation aufwenden, anstatt Ihre Anwendung zu erstellen.

18
Erick Robertson

Ich habe versucht, eine Reihe von UML-Tools zu verwenden, und festgestellt, dass die Reverse-Engineering-Funktionen in den meisten UML-Tools für das Verständnis von Code nicht hilfreich waren . Sie konzentrieren sich auf das Entwerfen von Anforderungen, und Reverse Engineering-Funktionen zeigen oft nur riesige Bilder mit vielen nutzlosen Informationen. Als ich an der Microsoft Office-Codebasis arbeitete, stellte ich fest, dass die Verwendung von Stift und Papier hilfreicher ist als die typischen Entwurfs-/Modellierungswerkzeuge.

In der Regel möchten Sie auf verschiedene Arten darüber nachdenken:

  1. Verwenden Sie Ihr Gehirn : Jemand anders hat es erwähnt - es gibt keinen Ersatz dafür, tatsächlich zu versuchen, eine Codebasis zu verstehen. Möglicherweise müssen Sie sich Notizen machen und später darauf zurückgreifen. Können Werkzeuge helfen? Bestimmt. Aber erwarten Sie nicht, dass sie den größten Teil der Arbeit für Sie erledigen.
  2. Dokumentation suchen und mit Kollegen sprechen : Es gibt keinen besseren Weg, als die wichtigsten Konzepte in einer Quelle beschreiben zu lassen in einer Codebasis. Wenn Sie jemanden finden, der Ihnen hilft, nehmen Sie einen Stift und Papier, gehen Sie zu ihm und machen Sie sich viele Notizen. Wie viel nervt die andere Person? Am Anfang - so viel wie es für Ihre Arbeit praktisch ist, aber kein Betrag ist zu wenig.
  3. Denken Sie an Tools : Wenn Sie noch nicht mit einem Teil eines Projekts vertraut sind, verbringen Sie viel Zeit damit, den Code zu verstehen Wie viel Hilfe können Sie automatisch erhalten. Es gibt gute und schlechte Werkzeuge. Versuchen Sie zunächst herauszufinden, welche Tools Funktionen für Sie hilfreich sein könnten. Wie bereits erwähnt, konzentriert sich das durchschnittliche UML-Tool eher auf die Modellierung und scheint nicht für Sie geeignet zu sein.
  4. Time vs Cost : Sicher, kostenlos ist großartig. Aber wenn ein kostenloses Tool nicht von vielen Leuten benutzt wird, kann es sein, dass das Tool nicht funktioniert. Es gibt viele Tools, die erstellt wurden, um zu untersuchen, was getan werden kann, aber nicht wirklich hilfreich sind und daher nur in der Hoffnung kostenlos zur Verfügung gestellt werden, dass jemand anderes sie übernimmt. Eine andere Möglichkeit, darüber nachzudenken und zu entscheiden, wie viel Ihre Zeit wert ist - es kann sinnvoll sein, ein oder zwei Tage zu verbringen, um ein Werkzeug für Sie zum Arbeiten zu bringen.

Denken Sie an diese Punkte, wenn Sie versuchen, das Projekt zu verstehen:

  1. The Mile High View : Ein mehrschichtiges Architekturdiagramm kann wirklich hilfreich sein, um zu wissen, wie die Hauptkonzepte in ein Projekt sind miteinander verbunden. Werkzeuge wie Lattix und Architexa kann hier wirklich hilfreich sein.
  2. Der Kern : Versuchen Sie herauszufinden, wie der Code in Bezug auf die Hauptkonzepte funktioniert. Hier sind Klassendiagramme besonders nützlich. Pen-and-Paper funktioniert hier häufig genug, aber Tools können nicht nur den Prozess beschleunigen, sondern auch das Speichern und Freigeben solcher Diagramme unterstützen. Ich denke AgileJ und Architexa sind hier Ihre besten Wetten, aber Ihr durchschnittliches UML-Tool kann oft gut genug sein.
  3. Schlüsselverwendungsfälle : Ich würde vorschlagen, mindestens einen Schlüsselverwendungsfall für Ihre App zu verfolgen. Sie können wahrscheinlich die wichtigsten Anwendungsfälle von jedem in Ihrem Team erhalten, und es wird sehr hilfreich sein, sie durchzuarbeiten. Die meisten IDEs sind hier wirklich hilfreich. Wenn Sie versuchen, sie zu zeichnen, sind Sequenzdiagramme am besten geeignet. Für Tools hier denke ich MaintainJ, JDeveloper und Architexa sind hier Ihre besten Wetten.

Hinweis: Ich bin der Gründer von Architexa - wir entwickeln Tools, die Ihnen helfen Java Code verstehen und dokumentieren, aber ich habe oben versucht, unvoreingenommen zu sein. Ich beabsichtige, Tools und Optionen vorzuschlagen, da ich mich im Rahmen meiner Promotion darauf konzentriert habe.

25
Vineet

Es ist in mehreren Dateien gespeichert. Es verwendet verschiedene Klassen mit unterschiedlichen Methoden. Der Code ist groß und kompliziert. 

Der gesamte Java-Code, der außerhalb der Schule geschrieben wurde, ist so, insbesondere für einen neuen Entwickler, der mit einem Projekt beginnt.

Dies ist eine alte Frage, aber da dies bei Google-Suchen der Fall ist, füge ich hier meine Antwort hinzu, damit sie den zukünftigen Besuchern nützlich sein kann. Lassen Sie mich auch mitteilen, dass ich der Autor von MaintainJ bin.

Versuchen Sie nicht, die gesamte Anwendung zu verstehen 

Lassen Sie mich das fragen - warum möchten Sie den Code verstehen? Wahrscheinlich beheben Sie einen Fehler oder verbessern eine Funktion der Anwendung. Als Erstes sollten Sie nicht versuchen, die gesamte Anwendung zu verstehen. Wenn Sie versuchen, die gesamte Architektur zu verstehen, während Sie ein Projekt neu beginnen, werden Sie überwältigt.

Glauben Sie mir, wenn ich das sage - Entwickler mit mehr als 10 Jahren solider Codierungserfahrung verstehen möglicherweise nicht, wie bestimmte Teile der Anwendung funktionieren, auch wenn sie mehr als ein Jahr an demselben Projekt gearbeitet haben (vorausgesetzt, es handelt sich nicht um die ursprünglichen Entwickler). Sie verstehen möglicherweise nicht, wie die Authentifizierung funktioniert oder wie die Transaktionsverwaltung in der Anwendung funktioniert. Ich spreche von typischen Unternehmensanwendungen mit 1000 bis 2000 Klassen und unterschiedlichen Frameworks. 

Zwei wichtige Fähigkeiten zur Verwaltung großer Anwendungen 

Wie überleben sie dann und werden viel Geld bezahlt? Erfahrene Entwickler verstehen normalerweise, was sie tun. Das heißt, wenn sie einen Fehler beheben sollen, finden sie den Ort des Fehlers, beheben ihn und stellen sicher, dass der Rest der App nicht beschädigt wird. Wenn sie eine Funktion verbessern oder eine neue Funktion hinzufügen müssen, müssen sie meist nur eine vorhandene Funktion imitieren, die eine ähnliche Funktion erfüllt. 

Es gibt zwei wichtige Fähigkeiten, die ihnen dabei helfen.

  1. Sie sind in der Lage, die Auswirkungen der Änderungen zu analysieren, die sie beim Beheben eines Fehlers vornehmen. Zuerst finden sie das Problem, ändern den Code und testen ihn, um sicherzustellen, dass er funktioniert. Da sie die Java-Sprache gut kennen und die Frameworks „gut genug“ sind, können sie feststellen, ob andere Teile der App beschädigt werden. Wenn nicht, sind sie fertig. 

  2. Ich sagte, dass sie einfach nachahmen müssen, um die Anwendung zu verbessern. Um effektiv zu imitieren, muss man Java gut kennen und die Frameworks „gut genug“ verstehen. Wenn sie beispielsweise eine neue Struts-Action-Klasse hinzufügen und zur Konfigurations-XML hinzufügen, finden sie zuerst eine ähnliche Funktion, versuchen dem Ablauf dieser Funktion zu folgen und zu verstehen, wie sie funktioniert. Sie müssen möglicherweise etwas an der Konfiguration anpassen (z. B. wenn die 'Form'-Daten in' Anfrage 'sind als im' Sitzungsbereich '). Wenn sie die Frameworks jedoch gut genug kennen, können sie dies leicht tun.

Im Endeffekt lautet Sie brauchen nicht zu verstehen, was alle 2000 Klassen tun, um einen Fehler zu beheben oder die App zu verbessern. Verstehe einfach, was nötig ist.

Sofortige Wertschöpfung

Entmutige ich Sie also, die Architektur zu verstehen? Nein überhaupt nicht. Alles, was ich von Ihnen fordere, ist zu liefern. Wenn Sie mit einem Projekt beginnen und die Entwicklungsumgebung auf Ihrem PC eingerichtet haben, sollten Sie nicht mehr als eine Woche für die Bereitstellung von etwas benötigen, auch wenn dies noch so klein ist. Wenn Sie ein erfahrener Programmierer sind und nach zwei Wochen nichts liefern, wie kann ein Manager wissen, ob Sie wirklich arbeiten oder Sportnachrichten lesen?

Also, um das Leben für alle einfacher zu machen, liefern etwas. Gehen Sie nicht zu der Einstellung, dass Sie die gesamte Anwendung verstehen müssen, um etwas Wertvolles zu liefern. Das ist völlig falsch. Das Hinzufügen einer kleinen und lokalisierten Javascript-Validierung kann für das Unternehmen sehr wertvoll sein, und wenn Sie es liefern, fühlt sich der Manager erleichtert, dass er für sein Geld einen Wert hat. Außerdem haben Sie Zeit, die Sportnachrichten zu lesen.

Mit der Zeit und nachdem Sie 5 kleine Korrekturen bereitgestellt haben, beginnen Sie langsam, die Architektur zu verstehen. Unterschätzen Sie nicht die Zeit, die erforderlich ist, um jeden Aspekt der App zu verstehen. Geben Sie 3-4 Tage, um die Authentifizierung zu verstehen. Kann 2-3 Tage dauern, um das Transaktionsmanagement zu verstehen. Das hängt wirklich von der Anwendung und Ihren bisherigen Erfahrungen mit ähnlichen Anwendungen ab, aber ich gebe nur die Einschätzung. Stehlen Sie die Zeit dazwischen, um die Fehler zu beheben. Fragen Sie nicht nach dieser Zeit. 

Wenn Sie etwas verstanden haben, schreiben Sie Notizen oder zeichnen Sie das Klassen-/Sequenz-/Datenmodelldiagramm. 

Diagramme 

Haaa ... ich habe so lange gebraucht, um Diagramme zu erwähnen :). Ich begann mit der Offenlegung, dass ich der Autor von MaintainJ bin, dem Werkzeug, das Laufzeitsequenzdiagramme generiert. Lassen Sie mich Ihnen sagen, wie es Ihnen helfen kann.

Der Hauptteil der Wartung besteht darin, die Ursache eines Problems zu ermitteln oder zu verstehen, wie eine Funktion funktioniert. 

Von MaintainJ generierte Sequenzdiagramme zeigen den Anrufverlauf und den Datenfluss für einen einzelnen Anwendungsfall. In einem einfachen Sequenzdiagramm können Sie also sehen, welche Methoden für einen Anwendungsfall aufgerufen werden. Wenn Sie also einen Fehler beheben, liegt der Fehler höchstwahrscheinlich in einer dieser Methoden. Reparieren Sie es einfach, stellen Sie sicher, dass nichts anderes kaputt geht und steigen Sie aus. 

Wenn Sie eine Funktion verbessern möchten, müssen Sie den Anrufverlauf dieser Funktion anhand des Sequenzdiagramms verstehen und anschließend verbessern. Die Verbesserung kann wie das Hinzufügen eines zusätzlichen Feldes oder das Hinzufügen einer neuen Validierung usw. sein. Normalerweise ist das Hinzufügen von neuem Code weniger riskant.

Wenn Sie eine neue Funktion hinzufügen müssen, suchen Sie nach einer anderen Funktion, die der zu entwickelnden Funktion ähnelt, und verstehen Sie den Anrufverlauf dieser Funktion mit Hilfe von MaintainJ, und ahmen Sie sie nach. 

Klingt einfach? Es ist eigentlich ganz einfach, aber es wird Fälle geben, in denen Sie größere Verbesserungen vornehmen werden, z. B. das Erstellen einer völlig neuen Funktion oder etwas, das sich auf das grundlegende Design der Anwendung auswirkt. Wenn Sie so etwas versuchen, sollten Sie mit der Anwendung vertraut sein und die Architektur der App einigermaßen gut verstehen.

Zwei Vorbehalte zu meinem Argument oben 

  1. Ich erwähnte, dass das Hinzufügen von Code weniger riskant ist als das Ändern von vorhandenem Code. Da Sie das Ändern vermeiden möchten, sind Sie möglicherweise versucht, eine vorhandene Methode einfach zu kopieren und hinzuzufügen, anstatt den vorhandenen Code zu ändern. Widerstehen Sie dieser Versuchung. Alle Anwendungen haben eine bestimmte Struktur oder "Einheitlichkeit". Verderben Sie es nicht durch schlechte Praktiken wie Code-Duplizierung. Sie sollten wissen, wann Sie von der Einheitlichkeit abweichen. Bitten Sie einen leitenden Entwickler des Projekts, die Änderungen zu überprüfen. Wenn Sie etwas tun müssen, das den Konventionen nicht entspricht, stellen Sie zumindest sicher, dass es lokal für eine kleine Klasse ist (eine private Methode in einer 200-Zeilen-Klasse würde die Ästhetik der Anwendung nicht zerstören). 

  2. Wenn Sie dem oben beschriebenen Ansatz folgen, obwohl Sie in der Branche jahrelang bestehen können, besteht das Risiko, dass Sie die Anwendungsarchitekturen nicht verstehen, was auf lange Sicht nicht gut ist. Dies kann durch die Bearbeitung größerer Änderungen oder durch weniger Zeitaufwand für Facebook vermieden werden. Verbringen Sie Zeit, um die Architektur zu verstehen, wenn Sie ein wenig frei sind, und dokumentieren Sie sie für andere Entwickler. 

Fazit

Konzentrieren Sie sich auf den unmittelbaren Wert und verwenden Sie die Tools, die das liefern, aber seien Sie nicht faul. Tools und Diagramme helfen, aber Sie können auch darauf verzichten. Sie können meinem Rat folgen, indem Sie sich ein paar Jahre lang von einem leitenden Entwickler des Projekts trennen. 

13

Einige Plugins, die ich für Eclipse kenne:

Architexa

http://www.architexa.com/

nWire

http://www.nwiresoftware.com/

Wenn Sie den Code zurückentwickeln möchten, sollten SieEnterprise Architectversuchen.

10
nanda

haben Sie versucht, Google CodePro Analytix ?

es kann beispielsweise Abhängigkeiten anzeigen und ist kostenlos (Screenshot von cod.google.com):

Screenshot from Google

9
Jan Schierkolk

Hier ist ein Nicht-UML-Tool, das sehr schöne Visualisierungsfunktionen bietet.

Sie können die Codezeilen pro Klasse/Methode den Farben/Seitenlängen von Rechtecken zuordnen. Sie können auch die Abhängigkeiten zwischen den Klassen anzeigen.

http://www.moosetechnology.org/

Das Schöne ist, Sie können Smalltalk-Scripting verwenden, um anzuzeigen, was Sie benötigen: http://www.moosetechnology.org/docs/faq/JavaModelManipulation

Hier sehen Sie, wie eine solche Visualisierung aussieht: http://www.moosetechnology.org/tools/moosejee/casestudy

4
haschibaschi

JUDE Community UML konnte früher Java importieren. Dies ist jedoch nicht mehr der Fall. Es ist ein gutes, kostenloses Werkzeug. 

Wenn Ihre App wirklich komplex ist, denke ich, dass Sie mit Diagrammen nicht sehr weit kommen. Wenn Diagramme sehr komplex werden, werden sie schwer zu lesen und verlieren ihre Leistung. Einige gut ausgewählte Diagramme, auch wenn sie von Hand erstellt werden, können ausreichen.

Sie benötigen nicht alle Methoden, Parameter und Rückgabewerte. Normalerweise sind es nur die Beziehungen und Interaktionen zwischen Objekten oder Paketen, die Sie benötigen.

3
duffymo

Hier ist ein weiteres Tool, das den Trick ausführen könnte: http://xplrarc.massey.ac.nz/

2
jens

Sie können JArchitect tool verwenden, ein ziemlich komplettes Werkzeug, um Ihre Codestruktur mithilfe des Abhängigkeitsgraphen zu visualisieren und Ihren Quellcode wie eine Datenbank zu durchsuchen, die CQlinq verwendet. .____.] JArchitect ist frei für Open Source Contributors

1
Dane

Einige tolle Werkzeuge, die ich benutze -

StarUML (ermöglicht die Konvertierung von Code in Diagramm)

MS Visio 

XMind (sehr nützlich für den Überblick über das System)

Stift und Papier!

0
Syed Priom