Refactoring ( eng. refactoring ), eller kodomformning, kodrevision, ekvivalent transformation av algoritmer - processen att ändra programmets interna struktur , utan att påverka dess externa beteende och syftar till att göra det lättare att förstå dess arbete [1] [2 ] . Refaktorering baseras på en serie små ekvivalenta (det vill säga beteendebevarande) transformationer. Eftersom varje transformation är liten är det lättare för programmeraren att följa dess korrekthet, och samtidigt kan hela sekvensen leda till en betydande omstrukturering av programmet och förbättra dess konsekvens och tydlighet.
Syftet med refactoring är att göra programkoden lättare att förstå; utan detta kan omfaktoriseringen inte anses vara framgångsrik.
Refaktorering bör särskiljas från prestandaoptimering . Liksom refactoring ändrar optimering vanligtvis inte programmets beteende, utan påskyndar bara dess arbete. Men optimering gör ofta kod svårare att förstå, vilket är motsatsen till refactoring [3] .
Å andra sidan måste refactoring också särskiljas från reengineering , som utförs för att utöka funktionaliteten hos programvara. Som regel föregår större omstruktureringar omkonstruktion.
Refaktorering bör tillämpas ständigt vid utveckling av kod. De främsta incitamenten för dess genomförande är följande uppgifter:
På många sätt är det bättre att förlita sig på intuition baserad på erfarenhet när man refaktorerar. Det finns dock några synliga kodlukter som kräver omfaktorering :
I programmering betyder termen refactoring att ändra källkoden för ett program utan att ändra dess externa beteende. I Extreme Programming och andra agila metoder är refactoring en integrerad del av mjukvaruutvecklingscykeln: utvecklare växlar mellan att skapa nya tester och funktionalitet och sedan omfaktorisera koden för att förbättra dess konsekvens och transparens. Automatiserad enhetstestning säkerställer att refactoring inte bryter befintlig funktionalitet.
Refactoring är ursprungligen inte tänkt att fixa buggar och lägga till ny funktionalitet, det ändrar inte beteendet hos programvaran alls [3] och det hjälper till att undvika buggar och göra det lättare att lägga till funktionalitet. Det utförs för att förbättra förståelsen av koden eller ändra dess struktur, för att ta bort "död kod" - allt detta för att göra koden lättare att underhålla och utveckla i framtiden. I synnerhet kan det vara svårt att lägga till nytt beteende i ett program med en befintlig struktur, i vilket fall utvecklaren kan utföra den nödvändiga omstruktureringen innan den nya funktionen lägger till.
Detta kan vara att flytta ett fält från en klass till en annan, ta en bit kod ur en metod och göra den till en fristående metod, eller till och med flytta kod genom en klasshierarki. Varje enskilt steg kan verka elementärt, men den kumulativa effekten av sådana små förändringar kan radikalt förbättra ett projekt eller till och med förhindra att ett dåligt utformat program faller samman.
De vanligaste [4] refaktoriseringsmetoderna är:
Kärnan i att ändra signaturen för en metod är att lägga till, ändra eller ta bort en metodparameter. Efter att ha ändrat metodsignaturen är det nödvändigt att korrigera anropen till den i koden för alla klienter. Denna ändring kan påverka programmets externa gränssnitt, dessutom har inte alltid utvecklaren som ändrar gränssnittet tillgång till alla klienter av detta gränssnitt, så någon form av registrering av gränssnittsändringar kan krävas för efterföljande överföring av dem tillsammans med ny version av programmet.
Om en klass har ett offentligt fält måste du göra det privat och tillhandahålla åtkomstmetoder. Efter "Field Encapsulation" tillämpas ofta " Method Relocation " .
Metodextraktion består i att extrahera separata fragment från en lång och / eller kräva kommentarer av kod och konvertera dem till separata metoder, med ersättning av lämpliga anrop på användningsplatserna. I det här fallet gäller regeln: om en bit kod kräver en kommentar om vad den gör, ska den separeras i en separat metod. Också en regel: en metod bör inte uppta mer än en skärm (25-50 rader, beroende på redigeringsvillkoren), annars har några av dess fragment ett oberoende värde och är föremål för urval. Från analysen av det valda fragmentets kopplingar till det omgivande sammanhanget dras en slutsats om listan över parametrar för den nya metoden och dess lokala variabler.
Metodomplacering gäller en metod som oftare refererar till en annan klass än den som den finns i.
En villkorlig sats med flera grenar ersätts av ett anrop till en polymorf metod av någon basklass som har underklasser för varje gren av den ursprungliga satsen. Valet av gren är implicit, beroende på vilken instans av underklassen samtalet riktades till.
Grundläggande principer:
Tekniska kriterier för refaktoreringsverktyg:
Praktiska kriterier för refaktoreringsverktyg: