Maar dan toch wel nadat je hebt nagedacht, hoop ik?
Bij een refactoring dient je dus eerst de test aan te passen (de break) en daarna pas de implementatie (de fix). De IDE mag de API wijzigingen dus niet automatisch doorvoeren in de tests. Om te voorkomen dat VS of ReSharper de tests automatisch wijzigen zitten deze ook in een aparte solution.
De 3 regels van TDD:
1. You are not allowed to write any production code unless it is to make a failing unit test pass.
2. You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.
3. You are not allowed to write any more production code than is sufficient to pass the one failing unit test.
Mja, wie zegt dit? Het manifesto?
De regels die je noemt werken alleen wanneer de tests 100% van de mogelijke situaties dekken (dat is wat anders dan 100% code coverage). Dat is nooit het geval en om het te bereiken moet je veelal een onmogelijke hoeveelheid tests maken. Dit houdt dus in dat je tests vervallen tot integration tests of tests die niet alle mogelijke situaties testen. In dat licht is het dan ook niet onlogisch te concluderen dat pure TDD gewoon niet werkt en je niet uit moet gaan van code maar van wat de code feitelijk representeert.
BDD komt dan veel dichter bij wat je feitelijk aan het doen bent. Bij BDD benoem je veel meer wat de code feitelijk moet doen, en de tests representeren dat dan ook. Als je vanuit dat perspectief te werk gaat is het wijzigen van de code ook logischer: je moet eerst de behavior wijzigen, daaruit volgt een of meerdere gewijzigde tests en daaruit volgt wellicht een of meerdere wijzigingen op de code. TDD is dan dus niet handig, want het dwingt je om meteen met je handen in de tests te gaan zitten poeren maar de vraag waarom test A moet worden aangepast maar niet test B is onbeantwoordbaar.
Deze regels gelden natuurlijk ook bij een refactoring. Maar aan de reacties te begrijpen houden jullie deze 3 regels dus niet aan bij een refactoring?
Als je eerst nadenkt over wat voor functionaliteit je feitelijk wilt representeren in code, en dan de projectie maakt naar code, zul je zien dat code nooit de bron is van wat je moet opleveren maar altijd een representatie van die bron. Het gefocus op code is debet aan veel problemen, waaronder ook jouw initiele vraag valt.
@voutloos: Herstructureren heb ik voor het gemak onder het kopje refactoring gegooit.
Het probleem is namelijk dat de gehele (financiele) wereld is gek geworden en dat idioten (politici) proberen de gekken weer in het gareel te krijgen. Dit zorgt al maanden voor wijzigende wetgeving en dus dat wij de producten moeten updaten. Om in de toekomst minder snel wijzigingen te hoeven maken als er wetgeving ergens wijzigt zijn wij dus een aantal optimalisaties aan het doorvoeren. Daarbij is ook gebleken dat door deze optimalisatie een aantal bestaande functionaliteiten kunnen worden samengevoegd middels een refactoring. Het grootste deel wijzigt alleen onder de motorkap, maar aan enkele public API changes ontkomen wij niet.
Oorzaak (wetswijziging) -> wijziging in functionaliteit van applicatie -> projectie naar code -> wijzigingen maken in code -> klaar.
Niet beginnen met wijzigingen maken in code, want dat is wat we vroeger noemden 'ad hoc prutsen'.