Was ist der beste Weg, eine vorhandene, chaotische Webanwendung auf elegantes MVC zu migrieren?[geschlossen]

StackOverflow https://stackoverflow.com/questions/40242

Frage

Ich bin vor etwa einem Monat einem neuen Unternehmen beigetreten.Das Unternehmen ist eher klein und hat ein starkes „Start-up“-Feeling.Ich arbeite als Java-Entwickler in einem Team von 3 anderen.Das Unternehmen verkauft in erster Linie einen Service für Unternehmen/Geschäftsleute zur Kommunikation untereinander.

Eines der wichtigsten Dinge, an denen ich gearbeitet habe und an denen ich arbeiten werde, ist die Hauptwebsite des Unternehmens – über die der Dienst verkauft wird. Bestehende Benutzer melden sich an, um ihren Dienst zu überprüfen und ihre Rechnungen zu bezahlen. Neue Benutzer können sich für eine Testversion anmelden , usw.Derzeit handelt es sich um eine auf Tomcat bereitgestellte JSP-Anwendung, deren Zugriff auf eine Datenbank über eine vom Unternehmen selbst geschriebene Persistenzschicht erfolgt.

Eine wiederholte und wachsende Frustration, die ich hier empfinde (und ich bin insgesamt ziemlich zufrieden mit dem Job, daher ist dies kein „Oh nein, ich mag meinen Job nicht“-Beitrag), ist das Fehlen eines größeren Designs oder Architektur für diese Webanwendung.Die App besteht aus mehreren Dutzend JSP-Seiten, wobei in Servlets, Beans oder anderen Frameworks nahezu keine Logik vorhanden ist.Viele der JSP-Seiten bestehen aus Tausenden von Codezeilen jsp:include Bei anderen JSP-Seiten wird die Geschäftslogik in den HTML-Code eingemischt, häufig verwendete Codefragmente (z. B. zum Herstellen einer Webdienstverbindung) werden ausgeschnitten und eingefügt statt wiederverwendet usw.Mit anderen Worten, die Anwendung ist ein Chaos.

Innerhalb des Unternehmens gab es einige Gerüchte über den Versuch, diese Site neu zu gestalten, damit sie besser zu MVC passt.Ich denke, dass die Entwickler und Vorgesetzten allmählich erkennen, dass dieses aktuelle Muster von Spaghetti-Code nicht nachhaltig oder sehr einfach skalierbar ist, um mehr Funktionen für die Benutzer hinzuzufügen.Die Vorgesetzten und Entwickler haben Bedenken, das Ding komplett neu zu schreiben (aus gutem Grund, da dies mehrere Wochen oder Monate Arbeit bedeuten würde, um die vorhandene Funktionalität neu zu schreiben), aber wir haben einige Diskussionen über eine (langsame) Überarbeitung geführt. Bestimmte Bereiche der Website in ein neues Framework schreiben.

Was sind einige der besten Strategien, um die Anwendung und Codebasis in diese Richtung zu bewegen?Wie kann ich als Entwickler wirklich dazu beitragen, dass dies schnell vorankommt, ohne wie der idiotische neue Typ zu wirken, der einen Job antritt und jedem sagt, dass das, was er geschrieben hat, Mist ist?Gibt es bewährte Strategien oder Erfahrungen, die Sie in Ihrem eigenen Berufsleben genutzt haben, als Sie auf so etwas gestoßen sind?

War es hilfreich?

Lösung

Am besten ist es wahrscheinlich, es im Laufe der Zeit langsam umzugestalten.Nur wenige von uns verfügen über die Ressourcen, die erforderlich wären, um bei etwas, in dem so viele Geschäftsregeln verborgen sind, ganz von vorne anzufangen.Das Management hasst es wirklich, wenn man Monate damit verbringt, eine App zu entwickeln, die mehr Fehler aufweist als die, die man ersetzt hat.

Wenn Sie die Möglichkeit haben, separate Apps von Grund auf zu erstellen, nutzen Sie alle dortigen Best Practices und demonstrieren Sie damit, wie effektiv sie sind.Wenn möglich, integrieren Sie diese Ideen schrittweise in die alte Anwendung.

Andere Tipps

Besorgen Sie sich zunächst ein Exemplar von „Working“ von Michael Feather Effektiv mit Legacy Code.Finden Sie dann heraus, wie Sie den vorhandenen Code am besten testen können.Der schlimmste Fall ist, dass Sie nur mit ein paar hochstufigen Regressionstests (oder gar nichts) beschäftigt sind und wenn Sie Glück haben, gibt es Unit-Tests.Dann handelt es sich hoffentlich um ein langsames und stetiges Refactoring bei gleichzeitiger Hinzufügung neuer Geschäftsfunktionen.

Meiner Erfahrung nach hat die „Eleganz“ einer App in der Regel mehr mit dem Datenbankdesign zu tun als mit irgendetwas anderem.Wenn Sie eine haben Großartig Datenbankdesign, einschließlich einer klar definierten Schnittstelle für gespeicherte Prozeduren, guter Anwendungscode folgt tendenziell unabhängig von der verwendeten Plattform.Wenn Sie haben arm Unabhängig davon, welche Plattform Sie verwenden, wird es Ihnen beim Datenbankdesign sehr schwer fallen, eleganten Anwendungscode zu erstellen, da Sie die Datenbank ständig kompensieren müssen.

Dazwischen ist natürlich noch jede Menge Platz Großartig Und arm, aber mein Punkt ist, dass Sie, wenn Sie einen guten Anwendungscode wünschen, zunächst sicherstellen sollten, dass Ihre Datenbank auf dem neuesten Stand ist.

Bei Anwendungen, die sich nur im Wartungsmodus befinden, ist dies schwieriger, da es schwierig ist, das Management davon zu überzeugen, dass es sich lohnt, etwas neu zu schreiben, das bereits „funktioniert“.Ich würde damit beginnen, die Prinzipien von MVC auf jeden neuen Code anzuwenden, an dem Sie arbeiten können (z. B.Verschieben Sie die Geschäftslogik in etwas, das einem Modell ähnelt, und platzieren Sie Ihren gesamten Layout-/Ansichtscode an einem Ort.)

Wenn Sie Erfahrung mit neuem Code in MVC sammeln, erkennen Sie möglicherweise Möglichkeiten, den vorhandenen Code subtil zu ändern, damit er ebenfalls mit den Anforderungen übereinstimmt.Es kann ein sehr langsamer Prozess sein, aber wenn Sie die Vorteile dieser Vorgehensweise aufzeigen können, können Sie andere überzeugen und das gesamte Team mit ins Boot holen.

Ich würde dem langsamen Refactoring-Ansatz zustimmen;Nehmen Sie zum Beispiel diesen kopierten und eingefügten Code und extrahieren Sie ihn in das entsprechende Java-Paradigma (vielleicht eine Klasse?oder noch besser, eine vorhandene Bibliothek verwenden?).Wenn Ihr Code wirklich sauber und prägnant ist, es ihm aber immer noch an einer allgemeinen Architekturstrategie mangelt, Dann Sie werden in der Lage sein, Dinge viel einfacher in eine Gesamtarchitektur einzupassen.

Am besten drucken Sie den Code aus, zerknüllen ihn und werfen ihn weg.Recyceln Sie das Papier nicht einmal.

Sie haben eine Anwendung, die in mehr als 1.000 Zeilen langen JSPs geschrieben ist.Es hat wahrscheinlich ein furchtbares Domänenmodell (wenn es überhaupt eines hat) und vermischt nicht nur Präsentation mit Geschäftslogik, es VERMISCHT es und sitzt dort und bewegt sich stundenlang weiter.Es gibt keine Möglichkeit, den Code, der beschissen ist, herauszunehmen und in eine MVC-Controller-Klasse zu verschieben und trotzdem das Richtige zu tun. Am Ende erhalten Sie einfach eine MVC-App mit einem anämischen Domänenmodell oder einer, die Dinge wie Datenbankaufrufe enthält Im Controller-Code scheitern Sie immer noch.

Sie könnten eine neue App ausprobieren, die das Richtige tut, und dann die beiden Apps miteinander kommunizieren lassen, aber das ist an sich schon eine neue Komplexität.Außerdem werden Sie wahrscheinlich die gleiche Menge an Arbeit erledigen, die Sie erledigen würden, wenn Sie ganz von vorne anfangen würden, aber es fällt Ihnen möglicherweise leichter, Ihre Vorgesetzten davon zu überzeugen, dass dies der bessere Ansatz ist.

Iteratives Refactoring.Suchen Sie auch nach neuen Funktionen, die vollständig im neuen Framework umgesetzt werden können, um den Wert des neuen Frameworks zu verdeutlichen.

Mein Vorschlag wäre, die seltenen Seiten zu finden, die keinen Import anderer JSPs erfordern oder nur sehr wenige Importe haben.Behandeln Sie jede importierte JSP als Blackbox und überarbeiten Sie diese Seiten (iterativ, testen Sie jede Änderung und stellen Sie sicher, dass sie funktioniert, bevor Sie fortfahren).Sobald diese bereinigt sind, können Sie weiterhin Seiten mit immer mehr Importen finden, bis Sie schließlich die Importe umgestaltet haben.

Beachten Sie beim Refactoring die Teile, die versuchen, auf Ressourcen zuzugreifen, die nicht auf der Seite angegeben sind, und versuchen Sie, diese an einen Controller weiterzuleiten.Beispielsweise sollte sich alles, was auf die Datenbank zugreift, innerhalb eines Controllers befinden. Überlassen Sie die JSP die Anzeige der Informationen, die der Controller ihm über eine Weiterleitung übermittelt.Auf diese Weise entwickeln Sie für jede Seite mehrere Servlets oder Dinge wie Servlets.Ich würde vorschlagen, für dieses Refactoring ein Front-Controller-basiertes Framework zu verwenden (aus persönlicher Erfahrung empfehle ich Spring und seine Controller-Schnittstelle), sodass jeder Controller kein separates Servlet ist, sondern vielmehr von einem einzelnen Servlet delegiert wird, das entsprechend zugeordnet ist.

Für den Controller ist es besser, alle Datenbankzugriffe auf einmal durchzuführen, als sie stückweise zu versuchen.Benutzer können das Laden einer Seite tolerieren und tun dies im Allgemeinen auch, aber die Seitenausgabe erfolgt viel schneller, wenn alle Datenbankdaten an den Rendering-Code übergeben werden, anstatt dass der Rendering-Code hängen bleibt und keine Daten an den Client weitergibt, während er versucht, noch einen anderen zu lesen Datenelement aus der Datenbank.

Ich fühle deinen Schmerz und wünsche dir viel Glück bei diesem Unterfangen.Wenn Sie nun eine Anwendung warten müssen, die Spring Webflow missbraucht, ist das eine andere Geschichte :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top