logo

7 Tehnici de refactorizare a codului în ingineria software

Fiind dezvoltator, cum începi să lucrezi la un nou proiect...??

În primul rând, adunați câteva cerințe de bază și apoi, pe baza cerinței, începeți să implementați caracteristica una câte una. Pe măsură ce progresați cu proiectul și aflați mai multe despre acesta, continuați să adăugați și să modificați codul în baza de cod. Mai târziu, modificați și codul pentru a remedia erorile și cazurile marginale.



7-Tehnici-de-refactorizare-cod-în-ingineria-software

Dar ce se întâmplă după câteva zile sau luni...? Cum arată codul tău...?? Este complicat? E greu de inteles? Dacă da, atunci cu siguranță nu ați acordat atenție îmbunătățirii codului sau restructurarii codului. S-ar putea să fi scris un cod duplicat fără să te uiți la codul existent sau să fi scris câteva metode/funcții mai lungi, clase mari, prea mulți parametri, nume de variabile neintuitive, plasarea codului etc.

Îmbunătățirea sau actualizarea codului fără a modifica funcționalitatea software-ului sau comportamentul extern al aplicației este cunoscută sub denumirea de refactorizare a codului. Reduce costul tehnic și face codul mai eficient și mai ușor de întreținut. Dacă nu acordați atenție procesului de refactorizare a codului mai devreme, veți plăti mai târziu pentru erorile din cod. Deci, nu ignora curățarea codului.



Într-un proces de dezvoltare software, diferiți dezvoltatori au stiluri diferite de scriere a codului. Ei fac modificări, mențin codul, extind codul și de cele mai multe ori părăsesc codul fără refactorizare continuă. Codul nerefactorizat tinde să putregaiul codului: mult de confuzie și dezordine în cod, cum ar fi codul duplicat, dependențe nesănătoase între clase sau pachete, alocarea proastă a responsabilităților de clasă, prea multe responsabilități pe metodă sau clasă etc. Pentru a evita toate aceste probleme, este importantă refactorizarea continuă.

Acum întrebarea este… care sunt tehnicile de refactorizare a codului?

Vom discuta câteva tehnici populare și comune de refactorizare a codului, dar înainte de asta hai să discutăm câteva sfaturi rapide...



Sfaturi:

  • Trebuie să efectuați refactorizarea codului în pași mici. Faceți mici modificări în programul dvs., fiecare dintre micile modificări vă face codul ușor mai bun și lasă aplicația într-o stare de funcționare.
  • Rulați testul TDD și CI după ce faceți mici modificări în procesul de refactorizare. Fără a rula aceste teste, creați riscul de a introduce erori.
  • Nu creați nicio caracteristică sau funcționalitate nouă în timpul procesului de refactorizare. Ar trebui să refactorizați codul înainte de a adăuga actualizări sau funcții noi în codul existent.
  • Procesul de refactorizare poate afecta rezultatele testării, așa că este bine să implicați echipa de QA și de testare în procesul de refactorizare.
  • Trebuie să acceptați că nu veți fi pe deplin mulțumit de codul dvs. Codul dvs. refactorizat va fi depășit în viitorul apropiat și va trebui să îl refactorizați din nou.

Cele mai comune tehnici de refactorizare a codului

Există multe abordări și tehnici de refactorizare a codului. Să discutăm despre unele populare...

1. Refactorizare roșu-verde

Red-Green este cea mai populară și utilizată tehnică de refactorizare a codului în procesul de dezvoltare a software-ului Agile. Această tehnică urmează abordarea de proiectare și implementare bazată pe primul test, aceasta pune bazele tuturor formelor de refactorizare. Dezvoltatorii iau inițiativa pentru refactorizarea în ciclul de dezvoltare bazat pe teste și se realizează în cele trei etape districtuale.

Roșu-Verde-Refactoring

  • ROȘU: Primul pas începe cu scrierea testului roșu eșuat. Te oprești și verifici ce trebuie dezvoltat.
  • Verde: În al doilea pas, scrieți cel mai simplu cod suficient și obțineți testarea verde pentru trecerea de dezvoltare.
  • Refactorizare: În pasul final și al treilea, vă concentrați pe îmbunătățirea și îmbunătățirea codului, păstrând testul verde.

Deci, practic, această tehnică are două părți distincte: prima parte implică scrierea unui cod care adaugă o nouă funcție sistemului dumneavoastră, iar a doua parte este despre refactorizarea codului care face această funcție. Rețineți că nu ar trebui să faceți ambele în același timp în timpul fluxului de lucru.

2. Refactorizarea prin abstracție

Această tehnică este folosită în cea mai mare parte de către dezvoltatori atunci când este nevoie de a face o cantitate mare de refactorizare. În principal, folosim această tehnică pentru a reduce redundanța (duplicarea) în codul nostru. Aceasta implică moșteniri de clasă, ierarhie, crearea de noi clase și interfețe, extracție, înlocuirea moștenirii cu delegarea și invers.

Refactorizarea-prin-abstracție

Tragere în sus/împingere în jos metoda este cel mai bun exemplu al acestei abordări.

  • Metoda pull-up: Atrage părțile de cod într-o superclasă și ajută la eliminarea dublării codului.
  • Metoda push-down: Preia partea de cod dintr-o superclasă și o mută jos în subclase.

Trageți în sus corpul constructorului, extrageți subclasa, extrageți superclasa, colapsați ierarhia, metoda șablonului de formular, extrageți interfața, înlocuiți moștenirea cu delegarea, înlocuiți delegarea cu Moștenirea, împingeți în jos câmpul, toate acestea sunt celelalte exemple.

Practic, în această tehnică, construim stratul de abstractizare pentru acele părți ale sistemului care trebuie refactorizate și omologul care în cele din urmă îl va înlocui. Două exemple comune sunt date mai jos...

len of array în java
  • Încapsulat camp: Forțăm codul să acceseze câmpul cu metode getter și setter.
  • Tipul de generalizare: Creăm tipuri mai generale pentru a permite partajarea codului, înlocuim codul de verificare a tipului cu starea, înlocuim condiționalul cu polimorfism etc.

3. Metoda de compunere

În timpul fazei de dezvoltare a unei aplicații de multe ori scriem metode lungi în programul nostru. Aceste metode lungi fac codul dumneavoastră extrem de greu de înțeles și greu de schimbat. Metoda de compunere este folosită cel mai mult în aceste cazuri.

În această abordare, folosim metode de simplificare pentru a reduce dublarea în codul nostru. Câteva exemple sunt: ​​metoda de extragere, extragerea unei variabile, Temp inline, înlocuirea Temp cu Interogare, metoda inline, împărțirea variabilei temporare, eliminarea asignărilor la parametri etc.

Extracţie: Împărțim codul în bucăți mai mici pentru a găsi și extrage fragmentarea. După aceea, creăm metode separate pentru aceste bucăți și apoi este înlocuită cu un apel la această nouă metodă. Extragerea implică clasă, interfață și variabile locale.

În linie: Această abordare elimină numărul de metode inutile din programul nostru. Găsim toate apelurile la metode și apoi le înlocuim pe toate cu conținutul metodei. După aceea, ștergem metoda din programul nostru.

introduceți în tastatură

4. Metode de simplificare

Există două tehnici implicate în această abordare... să le discutăm pe ambele.

  • Simplificarea expresiilor condiționate Refactorizarea: Declarație condiționată în programare devine mai logic și complicat în timp. Trebuie să simplificați logica din cod pentru a înțelege întregul program.
    Există atât de multe moduri de a refactoriza codul și de a simplifica logica. Unele dintre ele sunt: ​​consolidarea expresiei condiționale și duplicarea fragmentelor condiționale, descompunerea condițională, înlocuirea condițională cu polimorfism, eliminarea pavilionului de control, înlocuirea condiționalului imbricat cu clauze de gardă etc.
  • Refactorizare a apelurilor de metodă de simplificare: În această abordare, facem apelurile de metodă mai simple și mai ușor de înțeles. Lucrăm la interacțiunea dintre clase și simplificăm interfețele pentru ele.
    Exemple sunt: ​​adăugarea, eliminarea și introducerea de noi parametri, înlocuirea parametrului cu metoda explicită și apelul metodei, metoda parametrizare, efectuarea unei interogări separate de modificator, păstrarea întregului obiect, eliminarea metodei de setare etc.

5. Mutarea caracteristicilor între obiecte

În această tehnică, creăm noi clase și mutăm funcționalitatea în siguranță între clasele vechi și cele noi. Ascundem detaliile de implementare pentru accesul publicului.

Acum întrebarea este... când să mutați funcționalitatea între clase sau cum să identificați că este timpul să mutați caracteristicile între clase?

Când descoperiți că o clasă are atât de multe responsabilități și se întâmplă prea multe lucruri sau când descoperiți că o clasă este inutilă și nu face nimic într-o aplicație, puteți muta codul din această clasă în altă clasă și îl puteți șterge complet.

Exemple sunt: ​​mutarea unui câmp, extragerea clasei, mutarea metodei, clasa inline, ascunderea delegatului, introducerea unei metode străine, eliminarea intermediarului, introducerea extensiei locale etc.

6. Refactorizarea pregătitoare

Această abordare este cel mai bine să utilizați atunci când observați nevoia de refactorizare în timp ce adăugați câteva caracteristici noi într-o aplicație. Deci, practic, este o parte a unei actualizări de software cu un proces separat de refactorizare. Vă economisiți cu datorii tehnice viitoare dacă observați că codul trebuie actualizat în fazele anterioare ale dezvoltării caracteristicilor.

Utilizatorul final nu poate vedea astfel de eforturi ale echipei de inginerie ochi la ochi, dar dezvoltatorii care lucrează la aplicație vor găsi valoarea refactorizării codului atunci când construiesc aplicația. Ei își pot economisi timpul, banii și alte resurse dacă doar petrec ceva timp actualizând codul mai devreme.

Este ca și cum aș vrea să merg 100 de mile spre est, dar în loc să merg doar prin pădure, voi conduce 20 de mile spre nord până la autostradă și apoi voi merge la 100 de mile spre est, cu o viteză de trei ori mai mare decât aș putea avea dacă Tocmai am mers direct acolo. Când oamenii te împing să mergi direct acolo, uneori trebuie să spui: „Stai, trebuie să verific harta și să găsesc cea mai rapidă rută”. Refactorizarea pregătitoare face asta pentru mine.

Jessica Kerr (Dezvoltator de software)

Preparator-Refactoring

7. Refactorizarea interfeței cu utilizatorul

Puteți face modificări simple în UI și refactorizați codul. De exemplu: aliniați câmpul de introducere, aplicați fontul, reformulați cu voce activă indicați formatul, aplicați dimensiunea comună a butonului și creșteți contrastul de culoare etc.

Cuvinte finale

Trebuie să luați în considerare procesul de refactorizare a codului ca o curățare a casei ordonate. Dezordinea inutilă dintr-o casă poate crea un mediu haotic și stresant. Același lucru este valabil și pentru codul scris. Un cod curat și bine organizat este întotdeauna ușor de schimbat, ușor de înțeles și ușor de întreținut. Nu veți întâmpina dificultăți mai târziu dacă acordați atenție procesului de refactorizare a codului mai devreme.

Doi dintre cei mai influenți dezvoltatori de software Martin Fowler și Kent Beck și-au dedicat timpul pentru a explica procesul de refactorizare a codului și tehnicile acestuia. Ei au scris și o carte completă pe acest subiect Refactoring: Îmbunătățirea designului codului existent . Această carte descrie diferite tehnici de refactorizare cu o explicație clară a lucrului la acest proces de refactorizare. Vă recomandăm să citiți această carte dacă doriți să mergeți în profunzime cu procesul de refactorizare a codului.