Wie tauche ich tief in Code ein, der keinen einzigen Einstiegspunkt hat?


8

Ich arbeite an Java-Unternehmensprojekten, die keinen einzigen Einstiegspunkt haben, von dem aus ich den Ausführungsfluss verfolgen kann. Einige der Projekte haben Hunderte von Klassen, und wenn ich gebeten werde, einem Projekt eine Funktion hinzuzufügen, bin ich oft ratlos, wo ich anfangen soll, nach Code zu suchen.

Was ist der beste Weg, um in solche Projekte einzutauchen, damit ich die Funktion schnell implementieren kann, ohne Zeit zu verschwenden.


Ziehen Ihre Projekte aus einer Datenzugriffsschicht?
PhillipKregg

Geben Sie weitere Details an. Verwendet es Frameworks wie Struts / EJB usw.?
Java_Maus

@PhillipKregg Ja, es hat eine Datenzugriffsschicht.
rdasxy

@java_mouse Es ist ein Frühlingsprojekt.
rdasxy

Fragen Sie einen der Entwickler, der den Code oder größere Teile davon geschrieben hat. Keiner von ihnen ist noch in Ihrer Firma? Dann müssen Sie höchstwahrscheinlich einige Wochen oder Monate damit verbringen, das System zu verstehen.
Doc Brown

Antworten:


10

Verfügt das Projekt über eine Reihe gut gewarteter Komponententests? Die Unit-Tests sind programmatische Dokumentationen für die Funktionsweise des Codes.

Darüber hinaus müssen Sie genug über die Architektur der Anwendung lernen, um die Stellen zu identifizieren, an denen Sie Code für Ihre neuen Funktionen einfügen müssen, und den Rest mehr oder weniger ignorieren. Sie müssen dazu nicht die gesamte Codebasis kennen. Wenn die Projekte gut strukturiert sind, ist die Funktionalität bereits ausreichend gekapselt und entkoppelt, sodass Sie sich auf die relevanten Teile konzentrieren können. Wenn Sie Glück haben, folgen die Projekte bereits einer bekannten Architektur, die Ihnen als Karte dient.

Code hat immer einen oder mehrere Einstiegspunkte. Bei MVC-Projekten ist der Einstiegspunkt eine Controller-Methode, die auf einer URL basiert. Die Methode greift mit ziemlicher Sicherheit auf ein Datenrepository zu und gibt eine Ansicht zurück. Beginnen Sie dort.


3

Beginnen Sie mit der mittleren Ebene (Geschäftslogikschicht).

Dies ist einer der Orte, an denen das Steuerelement für Benutzeraktionen oder Triggerereignisse verwendet wird, wenn es sich um eine nicht auf der Benutzeroberfläche basierende Anwendung handelt. Wenn Sie sich im Debug-Modus befinden, können Sie ihn nach oben und unten verfolgen (höchstwahrscheinlich Datenzugriffsebene).

Es wird einige Zeit dauern, aber dies ist der effiziente Weg, um in undokumentierte Projekte zu springen.

Wenn das Projekt ein Framework verwendet (struts-config.xml, ejb config xmls, spring config xmls), verfügt es über definierte Schnittstellen, und Sie können auch von dort aus beginnen.


2

Es gibt immer einen Einstiegspunkt. Für Java-Unternehmensanwendungen: Servlets, Filter und Kontext-Listener befinden sich ganz oben. Sie führen normalerweise zu Anwendungs-Bootstrapping, z. B. Spring Context Loader, das dann zu Controllern, dann zu Entitäten und Ansichten führt. Es ist eigentlich ziemlich einfach, besonders wenn ein Rahmen wie Feder, Wandteppich oder Wicket verwendet wird. Sobald Sie wissen, wie das Framework eine Anforderung verarbeitet, sollten Sie in der Lage sein, die benötigten Erweiterungspunkte zu identifizieren.


1

Ich würde mit einer Klassenhierarchie beginnen. Wenn Sie ein großartiges Tool haben, finden Sie ein Tool, mit dem Sie Ihren Code zurückentwickeln und eines für Sie erstellen können. Von hier aus können Sie sehen, wie die Dinge zusammenhängen können. Sobald Sie sehen können, wie die Dinge zusammenhängen, können Sie zumindest Bereiche anvisieren, anstatt eine große Anzahl von Klassen zu haben. Sie können auf einen Bereich abzielen, in dem Sie sehen können, wie sie miteinander verknüpft sind (ist diese Klasse eine Zuordnung zu dieser, ist diese Klassengruppe ein Entwurfsmuster usw.). Versuchen Sie, etwas Ordnung und Struktur um das, was Sie betrachten, hinzuzufügen, und teilen Sie dann jeden Abschnitt auf.

BEARBEITEN:

Hier sind einige Beiträge aus dem Stapelüberlauf, in denen die Tools beschrieben sind, die Sie in Eclipse (oder als eigenständige Anwendungen) zum Reverse Engineering und Generieren eines Modells verwenden können:

"Wie isst du einen Elefanten?" "Ein Bissen nach dem anderen".


2
Wie codiert man einen Elefanten? Byte für Byte.
Mason Wheeler

1

Es ist fast unmöglich, Ihr Java-Projekt zu erweitern, wenn Sie nicht die Einstiegspunkte und eine klare Dokumentation darüber erhalten, was und warum getan wurde.

Zu Ihrer Information: Wenn wir unseren Kunden ein Projekt liefern, verbinden wir jetzt systematisch ein UML-Modell sowie ein Java-Dokument und eine gedruckte Dokumentation. Wir erstellen Hunderte von Ansichten aus dem Modell, die als Klassendiagramme angezeigt werden. Wir fügen viele Kommentare hinzu und erläutern die statische Architektur sowie den Ablauf von Geschäftsregeln und -methoden. Wenn unsere Kunden seinen Code übernehmen und an ein anderes Unternehmen weitergeben möchten, können sie die vorhandene Software nicht nur auf Bereitstellungsebene, sondern auch auf Architekturebene problemlos ändern. Leistungsstarke, einfache und brillante Verwendung dynamischer UML-Ansichten aus einem einzigen Modell.

Trotzdem kenne ich nur sehr wenige Integratoren, die daran interessiert sind, all diese Informationen bereitzustellen, denn wenn der Kunde einmal gefangen ist, ist es besser, ihn nicht gehen zu lassen. Durch die Bereitstellung eines vollständigen Modells und einer dynamischen UML-Navigation können Kunden unabhängig sein, was sich nicht positiv auf den Geschäftsumsatz auswirkt. Ich verstehe immer noch nicht, warum Großbanken oder Telekommunikationsunternehmen so naiv sind, von Integratoren gefangen zu werden, und fragen bei der Projektabwicklung nicht nach dem vollständigen Modell? Der Java-Code oder eine gedruckte Dokumentation reichen nicht aus. Die gedruckte Dokumentation ist normalerweise ein automatischer Prozess. Es hat keinen wirklichen Wert, Informationen aus dem Code zu extrahieren, um sie zu drucken oder ein PDF bereitzustellen.


1

Es gibt IMMER Einstiegspunkte, man muss sie nur finden. Wenn es sich um eine zeitgesteuerte Stapelanwendung handelt, sind irgendwo Aufgaben konfiguriert. Wenn es sich um eine Webanwendung handelt (mit Spring), gibt es Zuordnungen und Controller. Wenn es sich um eine Webdienstanwendung handelt, gibt es Dienstendpunkte. Wenn es sich um eine Swing-Anwendung handelt, gibt es Event-Handler oder ähnliches. Und wenn es sich um eine große, haarige Befehlszeilenanwendung handelt, gibt es eine main()Methode.

In Bezug auf "schnell eintauchen" - nun, wie lange es dauert, um die Einstiegspunkte zu finden, ist wirklich individuell. Wenn das System nach festgelegten Mustern geschrieben ist und Sie mit den Frameworks und den zugrunde liegenden Geschäftsregeln und -prozessen vertraut sind, sollten Sie in der Lage sein, diese sehr schnell herauszufinden. Wenn nicht, kann es länger dauern. Aber es gibt keinen universellen "Trick". Sie sammeln Erfahrung, lernen Muster zu erkennen und zu verstehen, wie die Frameworks aufgebaut und organisiert sind, und Sie werden besser.


1

In Bezug auf den Umgang mit Legacy-Code:

  • Das Buch von Michael Feathers enthält einige bewährte Methoden für den Umgang mit Legacy-Software.

In Bezug auf den Ausführungsfluss:

  • Es ist ein Frühlingsprojekt, also erwarten Sie, dass der Kontrollfluss Zaubertricks ausführt. Es kann viele Aufrufmethoden durch Reflektion oder sogar AOP ausführen. Der Versuch, den "Ausführungsfluss" mit einem Debugger zu verstehen, kann zu Frustration führen.
  • Es ist ein Frühlingsprojekt, daher ist die Struktur des Projekts ziemlich homogen. Lernen Sie den Frühling (falls Sie dies noch nicht getan haben), damit Sie die Konzepte von Bohnen und Verkabelung verstehen. Hier erfahren Sie, welche Klassen zusammenarbeiten.

In Bezug auf den Einstiegspunkt:

  • Lassen Sie mich raten: Es ist eine Webanwendung. Lassen Sie mich noch einmal raten: Es wird Spring MVC verwendet. Lernen Sie auch dieses, damit Sie wissen, wie Sie die Controller-Klassen für die Seiten finden. Dies sind die Einstiegspunkte in Ihre Anwendung. Es werden durch Reflektion aufgerufen, sodass Sie sie bei statischer Analyse des Quellcodes nicht finden.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.