Warum sollten Sie refaktorisieren?

Một phần của tài liệu AW refactoring improving the design of existing code (Trang 67 - 70)

Ich will hier nicht behaupten, Refaktorisieren sei das Allheilmittel für alle Soft- warekrankheiten. Es ist keine ằSilberkugelô. Es ist aber ein nỹtzliches Werkzeug, wie eine vielseitige Kombizange, die Ihnen hilft, Ihren Code gut im Griff zu behal- ten. Refaktorisieren ist ein Werkzeug, das für verschiedene Aufgaben eingesetzt werden kann und sollte.

2.2.1 Refaktorisieren verbessert das Design von Software

Ohne Refaktorisieren zerfọllt das Design eines Programms mit der Zeit. Wenn je- mand den Code ọndert – Änderungen, um kurzfristige Ziele zu erreichen, oder Än- derungen ohne vollstọndiges Verstọndnis des Codedesigns – bỹòt der Code seine Struktur ein. Es wird schwieriger, das Design zu erkennen, indem man den Code liest. Refaktorisieren ist so ọhnlich wie Code aufrọumen. Es wird daran gearbeitet, Dinge an die richtige Stelle zu rücken, die sich nicht dort befinden. Der Verlust der Struktur von Code hat eine kumulative Wirkung. Je schwieriger es ist, das Design des Codes zu verstehen, umso schwieriger ist es zu erhalten und umso schneller zerfọllt es. Regelmọòiges Refaktorisieren hilft den Code in Form zu halten.

Schlecht gestalteter Code benửtigt meist mehr Befehle, um die gleiche Sache zu erreichen, oft weil der Code im wahrsten Sinne des Wortes die gleiche Sache an mehreren Stellen tut. Ein wichtiger Aspekt bei der Verbesserung eines Designs ist es daher, redundanten Code zu eliminieren. Seine Bedeutung liegt in den zukünf- tigen Verọnderungen am Code. Die Verringerung der Codemenge lọsst das Sys- tem nicht schneller laufen, da die Auswirkungen auf das Verhalten des Pro- gramms selten groò sind. Die Verringerung der Codemenge macht aber einen groòen Unterschied, wenn es darum geht, den Code zu ọndern. Je mehr Code es gibt, umso schwieriger ist es, ihn korrekt zu ọndern. Es ist mehr Code zu verste- hen. Sie ọndern dieses Stỹck Code hier, aber das System tut nicht das, was Sie er- warten, weil Sie das Stück an der anderen Stelle, das das Gleiche nur in einem et- was anderen Kontext tut, nicht geọndert haben. Indem Sie Duplikate eliminieren, stellen Sie sicher, dass der Code alles einmal und nur einmal sagt. Das ist der Kern eines guten Designs.

2.2.2 Refaktorisieren macht Software leichter verstọndlich

Programmieren ist in vieler Weise eine Unterhaltung mit einem Computer. Sie schreiben Code, der dem Computer sagt, was er tun soll, und er antwortet, indem er genau das tut, was Sie ihm gesagt haben. Programmieren in diesem Sinne be- steht ausschlieòlich darin, genau zu sagen, was Sie wollen. Es gibt aber noch an- dere Nutzer Ihres Sourcecodes. In einigen Monaten wird jemand Ihren Code le- sen, um einige Änderungen zu machen. Wir vergessen diesen zusọtzlichen Nutzer des Codes, aber dieser ist in der Tat der wichtigste. Wen kümmert es, wenn der Computer einige Takte mehr benửtigt, um etwas umzuwandeln? Es ist aber von Bedeutung, wenn ein Programmierer eine Woche fỹr eine Änderung benửtigt, die nur eine Stunde gedauert họtte, wenn er Ihren Code verstanden họtte.

Das Problem besteht darin, dass Sie nicht an den zukünftigen Entwickler denken, wenn Sie sich bemühen, das Programm zum Laufen zu bringen. Es erfordert einen Wechsel der Gangart, um Änderungen vorzunehmen, die den Code verstọndli- cher machen. Das Refaktorisieren hilft Ihnen dabei, Ihren Code verstọndlicher zu machen. Wenn Sie mit Refaktorisieren beginnen, haben Sie Code, der funktio- niert, aber nicht optimal strukturiert ist. Eine geringe Zeit, die mit dem Refaktori- sieren verbracht wird, kann dazu führen, dass der Code seine Absichten viel bes- ser erkennen lọsst. Programmieren in diesem Sinne heiòt alles zu tun, um klar zu sagen, was Sie meinen.

Ich bin in diesem Punkt nicht notwendig selbstlos. Oft bin ich nọmlich selbst der zukünftige Entwickler. In diesem Fall ist das Refaktorisieren besonders wichtig.

Ich bin ein besonders fauler Programmierer. Eine meiner Formen von Faulheit be- steht darin, dass ich niemals etwas über den Code behalte, den ich schreibe. Tat- sọchlich achte ich bewusst darauf, mir nie etwas zu merken, was ich auch nach- schlagen kann, weil ich fürchte, dass mein Kopf sonst zu voll wird. Ich lege groòen Wert darauf, alles in den Code hineinzuschreiben, was ich mir merken sollte, damit ich es mir nicht merken muss. So mache ich mir weniger Sorgen, dass mir Old Peculier1 [Jackson] meine Gehirnzellen vernichtet.

Verstọndlicherweise funktioniert das auch fỹr andere Dinge. Ich verwende das Re- faktorisieren, um mir nicht vertrauten Code zu verstehen. Sehe ich Code, der mir nicht vertraut ist, so muss ich versuchen zu verstehen, was er macht. Ich sehe mir einige Zeilen an und sage mir: ằAha, das ist es also, was dieses Stỹck Code machtô.

Mittels Refaktorisieren bleibe ich nicht bei dieser gedanklichen Notiz stehen. Ich verọndere statt dessen den Code, um mein Verstọndnis besser wiederzugeben,

1. Anm. d. ĩ.: Ein Starkbier.

und dann ỹberprỹfe ich mein Verstọndnis, indem ich den Code erneut ausfỹhre, um zu sehen, ob er immer noch funktioniert.

Zunọchst refaktorisiere ich nur kleine Details. Wenn der Code klarer geworden ist, kann ich vieles über das Design erkennen, was ich vorher nicht sehen konnte.

Họtte ich den Code nicht geọndert, so họtte ich dies vielleicht nie erkannt, weil ich einfach nicht in der Lage bin, mir dies alles im Kopf zu visualisieren. Ralph Johnson beschreibt diese ersten Schritte als das Putzen einer Fensterscheibe, so dass man klar sehen kann. Wenn ich Code untersuche, stelle ich fest, dass das Re- faktorisieren mich auf ein hửheres Niveau des Verstọndnisses bringt, das ich an- dernfalls nicht erreicht họtte.

2.2.3 Refaktorisieren hilft Fehler zu finden

Was mir beim Verstehen von Code hilft, hilft mir auch Fehler zu erkennen. Ich gebe zu, nicht fürchterlich gut im Finden von Fehlern zu sein. Es gibt Menschen, die kửnnen eine Menge Code lesen und Fehler sehen, ich kann das nicht. Wenn ich aber Code refaktorisiere, erwerbe ich ein tiefes Verstọndnis davon, was der Code macht, und dieses neue Verstọndnis fỹge ich sofort in den Code ein. Indem ich die Struktur des Programms klọre, klọre ich auch einige Annahmen, die ich ge- macht habe, bis ich an einem Punkt stehe, an dem ich es nicht vermeiden kann, die Fehler zu erkennen.

Dies erinnert mich an eine Bemerkung, die Kent Beck họufig ỹber sich macht:

ằIch bin kein groòartiger Programmierer; ich bin nur ein guter Programmierer mit groòartigen Gewohnheiten.ô Refaktorisieren macht mich beim Schreiben robus- ten Codes sehr viel effizienter.

2.2.4 Refaktorisieren hilft Ihnen schneller zu programmieren

Letztendlich laufen alle genannten Punkte auf eins hinaus: Refaktorisieren hilft Ihnen Code schneller zu entwickeln.

Dies klingt nicht gerade intuitiv. Spreche ich über das Refaktorisieren, so sehen die Menschen leicht ein, dass es die Qualitọt verbessert. Das Verbessern des De- signs, das Verbessern der Lesbarkeit, weniger Fehler, all dies verbessert die Quali- tọt. Aber verringert dies alles nicht das Tempo der Entwicklung?

Ich bin fest davon überzeugt, dass ein gutes Design entscheidend für schnelle Softwareentwicklung ist. In der Tat ist es der Hauptzweck eines guten Designs, eine schnelle Entwicklung zu ermửglichen. Ohne ein gutes Design kửnnen Sie kurzfristig schnelle Fortschritte erzielen, bald aber wird das schlechte Design Sie

bremsen. Sie verbringen die Zeit damit, Fehler zu finden und zu beheben, anstatt neue Funktionen hinzuzufỹgen. Änderungen dauern lọnger, wọhrend Sie versu- chen, das System zu verstehen und den duplizierten Code zu finden. Neue Eigen- schaften erfordern mehr Programmierarbeit, weil Sie Flicken auf Flicken setzen, die Flicken auf dem ursprünglichen Code flicken.

Ein gutes Design ist entscheidend, um das Tempo der Softwareentwicklung auf- rechtzuerhalten. Refaktorisieren hilft Ihnen Software schneller zu entwickeln, weil es den Verfall des Designs des Systems stoppt. Es kann das Design sogar ver- bessern.

Một phần của tài liệu AW refactoring improving the design of existing code (Trang 67 - 70)

Tải bản đầy đủ (PDF)

(468 trang)