Welche Tools oder Techniken sind nützlich, um eine unbekannte Codebasis zu beschreiben? [geschlossen]

9

Bei der manuellen Überprüfung von unbekanntem Code (zum Überprüfen oder Ändern) habe ich anscheinend drei Möglichkeiten.

  • Ein Lesen des Codes von oben nach unten , wobei jede nächste Quelldatei anhand der grundlegenden Bedeutung des Dateinamens ausgewählt wird. Normalerweise lese ich fast alles. Einige Dateien zweimal.
  • Eine umfassende Lektüre , bei der ich alle aufrufenden Methoden mit minimalem Verständnis finde und lese. Lesen Sie dann alle Funktionen, die von dieser Funktion aufgerufen wurden, und so weiter. Mein mentaler Stack neigt zum Überlaufen, wenn ich ein paar Anrufe tief mache.
  • Eine Tiefenlesung , bei der ich den gesamten Code in einem Debugger durchlaufe und nicht sicher bin, ob dies 8 Minuten oder 8 Stunden dauern wird.

Sobald ich genug von dem Code gelesen habe, um ein ziemlich solides Verständnis dessen zu haben, was er tut, denke ich oft, dass ich 80% oder mehr der Codebasis gelesen habe, während der grundlegende Code 20% oder weniger beträgt . Ich habe viel Zeit verschwendet.

Welche Tools sind nützlich, um schnell einen Einblick in unbekannten Code zu erhalten? Gibt es Tools, die einen Überblick über den kritischen Codepfad geben und es mir ermöglichen, einen Drilldown zu den Details eines Teils durchzuführen?

Drew Dormann
quelle
2
Ohne die 80% Prozent zu erfassen, kann man nicht verstehen, warum die 20% der grundlegende Teil sind
Ratschenfreak
@ratchetfreak Ich würde das nicht so absolut sagen. Ein Tool könnte beispielsweise Code isolieren, der immer aufgerufen wird. Oder lassen Sie nur viele Stapelebenen tief laufen.
Drew Dormann

Antworten:

8

Das Beste ist natürlich, dass jemand, der die Codebasis kennt, Sie durch die Codebasis führt. Wenn dies keine Option ist, gibt es einige Tools, die Ihnen helfen können.

  • VisualStudio kann automatisch ein UML-Klassendiagramm einer Codebasis generieren. Zumindest zeigt es Ihnen die Klassenhierarchien.
  • Sauerstoff kann sehr hilfreich sein. Auch wenn der Code keine Kommentare im Doxygen-Stil enthält, kann Doxygen dennoch lesbare Dokumentationen, Klassendiagramme und Aufrufdiagramme erstellen. Dies kann sehr hilfreich sein, um sich in einer unbekannten Codebasis zurechtzufinden.

Im Allgemeinen möchten Sie auch eine IDE mit vollem Funktionsumfang verwenden, bei der Sie mit der rechten Maustaste auf etwas klicken und zur Definition wechseln können. Dies kann Ihnen viel Zeit sparen, verglichen mit der Verwendung von grep für viele Dateien in einer komplexen Verzeichnisstruktur.

Eine weitere wichtige Sache, je nachdem, wie lange Sie sich mit dem Code befassen müssen. Wenn es Unit-Tests gibt, schauen Sie sich die Tests an. Wenn es keine Tests gibt, schreiben Sie sie. Bilden Sie eine Hypothese darüber, was eine bestimmte Klasse oder Funktion tut, und schreiben Sie einen Test, um sie zu testen. Dies erfordert viel Disziplin, ist aber eine großartige Möglichkeit, Antworten darauf zu erhalten, was im Code passiert.

Dima
quelle
2
Danke @Dima. Doxygen ist fantastisch darin, etwas davon zu handhaben. (Ich wollte die Antworten nicht steuern, indem ich den einen mir bekannten Werkzeugnamen fallen ließ). Ein großes Lob auch für die besonnene Komponente "menschliche Interaktion". :)
Drew Dormann
3

Dies ist ein drastischerer Ansatz. Diese Technik kann für ein Projekt nützlich sein, das viele Klassen enthält, die nicht in aussagekräftigen Namespaces organisiert sind.

Das Ziel dieser Übung ist es, die Klassenbeziehung zu entdecken. Erstellen Sie einen Wegwerfklon des Projekts und versuchen Sie dann, einige Klassen in Namespaces einzufügen. Um bei wiederholten Versuchen Zeit zu sparen, verwenden Sie einige Regex-Dateiverarbeitungswerkzeuge, um diese Änderung zu automatisieren.

Dies führt zu vielen Compilerfehlern. Bei der Behebung dieser Fehler kann man besser verstehen, wie diese Klassen voneinander abhängen, und entscheiden, welche Klassen in denselben Namespace eingefügt werden können.

Diese Technik ist insofern nützlich, als man sie auch bei geringem Verständnis der Code-Organisation des Projekts anwenden kann. Dies birgt das Risiko, dass einige Klassen aufgrund von Missverständnissen durch diese Technik verlegt werden.

rwong
quelle
Das ist schlau. Tun Sie das normalerweise für viele Klassen oder speichern Sie es, wenn Sie auf eine bestimmte Klasse stoßen, die Ihnen unklar ist?
Drew Dormann
@DrewDormann Ich habe diese Technik von einem meiner Kollegen gelernt, als ich mit Hunderten von Klassen konfrontiert war, die nicht gruppiert waren. Dies ist ein allererster Schritt zum "Sortieren" der Projektdateien, bevor ein Refactoring durchgeführt wird. Mit anderen Worten, es wird verwendet, wenn alles noch ein Chaos ist. (Es ist peinlich, dass das Durcheinander von mir selbst geschrieben wurde.) Durch das Sortieren der Projektdateien in Namespaces wird die Generierung von Doxygen-Klassenseiten erleichtert (durch Anzeigen von Namespace-Bäumen) und das Verständnis des Programmierers beschleunigt.
Rwong