2008-10-02 8 views
22

Seit ich .NET benutze, habe ich gerade Helper-Klassen oder Partial-Klassen erstellt, um den Code in seinen eigenen kleinen Containern usw. zu halten.Refactoring Code: Wann was zu tun?

Ich suche nach den Best Practices um den Code so sauber und sauber wie möglich zu machen.

Offensichtlich sauber Code ist subjektiv, aber ich spreche über wann Dinge (nicht wie sie zu verwenden) wie Polymorphie, Vererbung, Schnittstellen, Klassen und wie Klassen besser geeignet zu gestalten (um sie nützlicher zu machen, nicht nur "DatabaseHelper" sagen, da einige diese schlechte Praxis in der code smells wiki betrachteten).

Gibt es irgendwelche Ressourcen da draußen, die möglicherweise bei dieser Art der Entscheidungsfindung helfen könnten?

Denken Sie daran, dass ich noch nicht einmal einen CS- oder Software-Engineering-Kurs begonnen habe, und dass eine Lehrquelle im wirklichen Leben ziemlich begrenzt ist.

Antwort

23

Ein echter Augenöffner für mich war Refactoring: Improving the Design of Existing Code:

Mit dem richtigen Ausbildung gelernter System Designer ein schlechtes Design nehmen und Nacharbeit es in gut gestalteten, robusten Code. In diesem Buch, Martin Fowler zeigt Ihnen, wo Chancen für Refactoring in der Regel gefunden werden kann, und wie man über die Überarbeitung eines schlechten Design in eine gute gehen.

Refactoring http://ecx.images-amazon.com/images/I/519XT0DER6L._SL160_PIlitb-dp-arrow,TopRight,21,-23_SH30_OU01_AA115_.jpg

Es hat mir geholfen, effizient und systematisch Code Refactoring. Auch hat es mir viel in Diskussionen mit anderen Entwicklern geholfen, wenn ihre holy code geändert werden muss ...

+0

Ich liebe dieses Buch! –

+0

Wird, danke! – RodgerB

5

Hier ist eine Überprüfung auf slash dot eines Buches namens Clean Code.

Das Buch ist anscheinend ein wenig trocken, aber sehr gut.

+0

Hey - das ist meine Rezension! Die Herausforderung mit dem Buch ist, dass es sich manchmal auf Java konzentriert. Aber im Allgemeinen weiß Onkel Bob, wovon er redet, und das schon seit langer Zeit. –

+0

@Cory Foy Gute Kritik Ich bin ernsthaft darüber nachzudenken, das Buch auf der Grundlage davon zu kaufen. Jedoch versuche ich, meine Firma zu bekommen, um es für mich zuerst zu kaufen :) –

11

Jeff Atwood machte eine nice blog post on refactoring and code smells, möchten Sie vielleicht überprüfen.

Refactoring-Code in. NET dauert einige Zeit zu grok. Sie müssen einige objektorientierte design principles (oder design techniques) zu refactor effectively und mercilessly wissen.

Kurz gesagt, Sie Refactor-Code, um Code Gerüche zu entfernen und Änderungen einfacher zu machen. Übertreib es auch nicht.

+0

Interessanter Blogbeitrag, danke. – RodgerB

1
  • Ändern Sie den Code neu, wenn Probleme auftreten. Irgendwelche Probleme werden tun: Leistung, Scablabillity, Integration, Wartung - alles, was Sie mehr Zeit darauf verbringen, wenn Sie sollten. Es ist nicht kaputt, repariere es nicht, auch wenn du nicht glaubst, dass es sauber ist oder den modernen Standards entspricht.
  • Verbringen Sie nicht zu viel Zeit damit, den Code zu perfektionieren. Du wirst nie Perfektion erreichen, aber du könntest viel Zeit damit verbringen, es zu versuchen. Erinnere dich an das Gesetz der abnehmenden Erträge.
  • Innerhalb eines Projekts nur den Code neu einteilen, wenn Sie tatsächlich an der Funktionalität arbeiten, die davon abhängt. I.e. Wenn Sie eine User Story für die Iteration haben, müssen Sie den Upload-Mechanismus ändern oder den Fehler beim Hochladen der Datei beheben. Wenn es in Ihrer User Story jedoch um "Facelifting des UI-Designs zum Hochladen von Dateien" geht, sollten Sie nicht auf die Geschäftslogik eingehen.
1

Ich würde Domain Driven Design empfehlen. Ich denke, sowohl YAGNI als auch AlwaysRefactor Prinzipien sind zwei simpel. Die uralte Frage zu diesem Thema lautet: Refaktoriere ich "if (someArgument == someValue)" in eine Funktion oder lasse sie inline?

Es gibt keine Ja oder Nein Antwort. DDD empfiehlt, es zu refaktorisieren, wenn der Test eine Geschäftsregel darstellt. Das Refactoring besteht nicht (nur) in der Wiederverwendung, sondern darin, die Absichten zu verdeutlichen.

1

Working Effectively with Legacy Code ist eines der besten Bücher, die ich zu diesem Thema gesehen habe.

Lassen Sie sich nicht vom Titel des Buches ablenken - Statt Refactoring als formelles Konzept zu behandeln (was seinen Platz hat), hat dieses Buch viele einfache "Warum habe ich nicht daran gedacht" Tipps . Dinge wie "gehen Sie durch eine Klasse und entfernen Sie alle Methoden, die nicht direkt in diese Klasse umgesetzt wurden und fügen Sie sie in eine andere ein".

z.B. Sie haben ein Raster und etwas Code, um das Layout dieses Rasters in der Datei zu erhalten. Sie können den Layout-Persistenz-Code wahrscheinlich sicher in eine andere Klasse verschieben.

0

Ich habe gerade eine Kopie von Code Complete erhalten und festgestellt, dass es einen Abschnitt dazu gab.

Obwohl ich noch das Buch der angenommenen Antwort lesen werde, hat das, was Code Complete mir beigebracht hat, meine Art, Klassen zu entwickeln, dramatisch verbessert.

Vor heute wusste ich nicht, was ein ADT war (abstrakter Datentyp), und jetzt weiß ich, wie man Klassen entwickelt, die der Verkapselung folgen.

0

Es gibt eine Webseite zum Refactoring unter http://www.refactoring.com/. Es enthält viele Verweise auf weitere Ressourcen zum Thema Refactoring-Code sowie eine Mailing-Liste, um Refactoring-bezogene Probleme zu diskutieren.

Last but not least gibt es einen großen (und immer noch wachsenden) Katalog an verfügbaren Refactorings, der weit über das hinausgeht, was in dem (sehr empfehlenswerten) Refactoring-Buch von Martin Fowler steht.

1

Meine Faustregel ist zu lassen Sie den Code in schlechterer Form als Sie es gefunden haben.

Die Idee ist, in Richtung der besseren zu arbeiten, ohne zu versuchen, das perfekte Ergebnis zu erzielen, oder den ganzen Weg zu gehen.

Individuelle Refactorings haben manchmal einen fraglichen Vorteil, und - als extremes Beispiel - könnte es in der Tat argumentieren, wenn m_Pi ein besserer Name ist als m_PI. Meistens ist eine Wahl jedoch konsistenter und weniger überraschend, auch wenn sie nicht offensichtlich "besser" ist.

Eine Situation, in der ich mich regelmäßig Refactoring finde ist vor Implementierung eines Features auf ein Stück Code.

Es gibt oft ein paar TODOs, die darauf warten, gefüttert zu werden, einige Inkonsistenzen oder manchmal benutzerdefinierte Funktionalität, die in letzter Zeit eine bessere Bibliotheksunterstützung erhalten hat. Wenn ich diese Änderungen vor der Implementierung der eigentlichen Feature-Anforderung durchführe, verstehe ich den Code und überprüfe die "Vorher" -Funktionalität.

Ein weiterer Punkt ist nach Fehler zu beheben. Nachher, also ist die Vorher-Wiederholung nicht betroffen, und der Bugfix und das Refactoring sind zwei separate Commits.