Ich habe in letzter Zeit viel gelesen und nachgedacht und bin zu dem Schluss gekommen, dass ich vielleicht meine Webentwicklungsstrategie überdenken sollte. Ich programmiere viel im laufenden Betrieb und in den zwei Jahren, in denen ich an einer PHP-Webanwendung gearbeitet habe, wurde das, was als kleines Tool begonnen haben könnte, zu einem ziemlich großen Projekt. Aber es gibt eine Menge Legacy- Code von mir und meinem Vorgänger, ein Codeausschnitt, der zu dieser Zeit vielleicht Sinn gemacht hat, aber jetzt stelle ich die Nützlichkeit dieses Codes in der Form in Frage, wie er tatsächlich ist. Darüber hinaus waren solche Dinge wie Unit-Tests und testgetriebene Entwicklung bis vor kurzem nicht in meinem Anwendungsbereich.
Wie würden Sie das Refactoring der Webanwendung angehen? Nach welchen Dingen sollte ich suchen und in welcher Reihenfolge? Was ist mit Browsergame versus funktionaler Web-App? Würde es dann Unterschiede im Ansatz geben?
quelle
Antworten:
So oder so nähern Sie sich jeder Art von Legacy-Code. Sie finden ein Stück, das testbar ist, Sie schreiben Tests dafür und Refactor.
Wenn Sie ein Teil nicht leicht testbar finden, müssen Sie es ohne den Sicherheitsgurt einer Testsuite testbar machen. In diesem Fall ändern Sie einen fast testbaren Code sehr sorgfältig, damit er testbar ist.
Code, der keine Dinge für den Browser rendert - "Infrastruktur" -Code, Modelle, datenbankberührende Dinge - ist möglicherweise ein guter Anfang.
Bearbeiten: UI-Test: Mit der Warnung, dass ich hier wenig Erfahrung habe, macht ein Freund von mir dies: Er führt einen Teil des HTML-generierenden Codes aus. Dann hackt er seinen Code und vergleicht den neu generierten Code mit der alten Version (mit diff; er hat nicht den ganzen Weg automatisiert). Änderungen im HTML-Code bedeuten, dass Ihr Refactoring fehlgeschlagen ist.
quelle
Es gibt ein großartiges Buch mit dem Titel "Effektiv mit Legacy-Code arbeiten" von Michael Feathers. Seien wir ehrlich, wir haben alle Legacy-Code.
Die Hauptsache ist, den neuen Code, den Sie erstellen, zu testen. Wenn Sie andere Codeteile berühren müssen, finden Sie auch Möglichkeiten, diese zu testen. Es ist ein langer, langsamer Prozess, aber wenn Sie systematisch vorgehen, können Sie das Gesamtprodukt im Laufe der Zeit wirklich verbessern.
quelle
Ich würde sie separat behandeln. Wenn Sie einen Teil Ihrer Website haben, der lediglich eine Sammlung von Dokumenten ist (die für anonyme Benutzer und angemeldete Benutzer gleichermaßen aussehen), unterscheidet sich die beste Strukturierungsmethode stark von einer Web-App, die dynamisch unterschiedliche Seiten bereitstellt an jeden Benutzer. Teilen Sie diese beiden Teile der Website in zwei Apps / Komponenten auf und behandeln Sie jeden Teil anders.
Sobald Ihr Code unter Versionskontrolle steht, können Sie alle unnötigen Codes, die Sie zuvor "nur für den Fall" usw. aufbewahrt haben, durchgehen und sicher entfernen. Ich weiß nicht, wie ich ohne Versionskontrolle überlebt habe.
Wenn vier verschiedene URLs alle auf dieselbe Ressource verweisen, ist das Problem viel größer. Am Ende haben Sie es mit unendlich vielen URLs zu tun. Stellen Sie so bald wie möglich sicher, dass eine URL-Normalisierungsrichtlinie vorhanden ist. Sobald dies erledigt ist, können Sie semantische Bedeutungen an URLs anhängen und Reverse-Lookups von Ressource zu URL durchführen. Auf diese Weise können Sie das "Web-Impressum" von den "Ressourcen" der Site trennen.
Sie müssen sich fragen: "Wenn Sie eine URL haben, wie lautet ihre normalisierte Form?". Sobald Sie dies festgenagelt haben. Dann können mehr als 50.000 URLs auf Ihrer Website auf 2.000 reduziert werden. Das ist viel einfacher zu verstehen und in Ihrem Kopf zu verwalten.
siehe: http://www.sugarrae.com/be-a-normalizer-a-c14n-exterminator/
Wenn Sie eine Legacy-Site aufräumen, die von Anfang an nicht unter Berücksichtigung der Best Practice entwickelt wurde, ist es verlockend, von „Chaos“ zu „Idealem Design“ zu springen. Ich glaube, dass Sie dies in mindestens zwei Schritten tun müssen: "Chaos" -> "gut modellierter Legacy-Code" -> "idealer neuer Code mit zusätzlichen Funktionen". Hören Sie auf, Funktionen hinzuzufügen. Konzentrieren Sie sich darauf, das Chaos zu beheben oder es hinter einer Antikorruptionsschicht zu kapseln. Nur dann können Sie beginnen, das Design in etwas Besseres zu verwandeln.
Siehe: http://www.joelonsoftware.com/articles/fog0000000069.html
Siehe: http://www.laputan.org/mud/
Erstellen Sie eine Testsuite / ein Framework und beginnen Sie mit dem Hinzufügen von Tests. Es ist jedoch ziemlich schwierig, alten Code zu testen. Also, lass dich nicht zu sehr darauf ein. Solange Sie das Framework dort haben, können Sie nach und nach Tests hinzufügen.
Siehe: http://www.simpletest.org/en/web_tester_documentation.html
Der größte Teil der Literatur zu Best Practices der Softwareentwicklung ist Desktop-zentriert / Enterprise App Centric. Während Ihre Website durcheinander ist, lesen Sie diese Bücher und Sie können Ehrfurcht vor der Weisheit haben, die von ihnen ausgeht. Vergessen Sie jedoch nicht, dass die meisten dieser Best Practices in Zeiten entstanden sind, bevor das Web / SEO wichtig wurde. Sie wissen viel über das moderne Web, mehr als in klassischen Büchern wie POEA, Gof usw. erwähnt. Es gibt viel zu entnehmen, aber verwerfen Sie Ihre eigenen Erfahrungen und Kenntnisse nicht vollständig.
Ich könnte weitermachen Aber das sind einige Dinge, die ich ausgewählt habe, als ich eine alte Legacy-Site in eine glänzende neue umgestaltet habe.
quelle
Bevor Sie etwas unternehmen, sollten Sie Ihr Projekt in der Quellcodeverwaltung haben. Auf diese Weise können Sie Änderungen rückgängig machen oder wichtige Änderungen in einem separaten Zweig bearbeiten sowie Meilensteine markieren.
Schreiben Sie als Nächstes Tests für jeden Code, den Sie ändern möchten. Sie müssen nicht alles auf einmal tun und Tests für alles schreiben. Genau das, woran Sie sofort arbeiten möchten. Die Theorie besagt, dass bei genügend Zeit der größte Teil der Codebasis durch Tests abgedeckt wird. Beachten Sie, dass einige Refactorings ohne Tests "sicher" sind - diese sind im zuvor erwähnten Legacy Code- Buch dokumentiert und zweifellos an anderer Stelle.
Ändern Sie den Code, wenn Tests für einen Codeabschnitt vorhanden sind. Tun Sie alles, was Sie brauchen, solange die Tests noch bestehen.
Selbst mit Legacy-Code können Sie TDD ausführen, wenn Sie Ergänzungen oder Änderungen vornehmen. Schreiben Sie einfach zuerst Tests für Ihre erwarteten Änderungen, sehen Sie, dass sie fehlschlagen, und nehmen Sie dann die Änderungen vor.
Einige Tools können hier hilfreich sein. NDepend kann auf stark gekoppelten Code und andere Gerüche hinweisen. NCover verfolgt Ihre Codeabdeckung. FxCop ist im Wesentlichen ein Code-Korrektheitsprüfer, der über das hinausgeht, was der Compiler tut. Dies sind alles nützliche Werkzeuge, die Sie für ein Projekt jeder realen Größe zur Hand haben können, insbesondere für die Legacy-Variante.
Letztendlich ist es ein mehrstufiger Prozess. Versuchen Sie nicht, alles auf einmal zu tun, sondern nehmen Sie es nur ein bisschen nach dem anderen.
quelle
Wenn es hässlich genug ist, um mich wütend zu machen, ist es hässlich genug, dass ich das Ganze lösche und einen Ersatztropfen schreibe.
Sie werden feststellen, dass dies meistens genauso lange dauert, wie wenn Sie dort sitzen und sich um ein unorganisiertes und undokumentiertes Durcheinander drehen und es sanft streicheln.
quelle