window.pipedriveLeadboosterConfig = { base: pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster on jo olemassa') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Nopea peruskurssi refaktorointiin aloittelijoille - The Codest
Codest
  • Tietoa meistä
  • Palvelut
    • Ohjelmistokehitys
      • Frontend-kehitys
      • Backend-kehitys
    • Staff Augmentation
      • Frontend-kehittäjät
      • Backend-kehittäjät
      • Tietoinsinöörit
      • Pilvi-insinöörit
      • QA insinöörit
      • Muut
    • Se neuvoa-antava
      • Tilintarkastus & konsultointi
  • Toimialat
    • Fintech & pankkitoiminta
    • E-commerce
    • Adtech
    • Terveysteknologia
    • Valmistus
    • Logistiikka
    • Autoteollisuus
    • IOT
  • Arvo
    • TOIMITUSJOHTAJA
    • CTO
    • Toimituspäällikkö
  • Tiimimme
  • Tapaustutkimukset
  • Tiedä miten
    • Blogi
    • Tapaamiset
    • Webinaarit
    • Resurssit
Työurat Ota yhteyttä
  • Tietoa meistä
  • Palvelut
    • Ohjelmistokehitys
      • Frontend-kehitys
      • Backend-kehitys
    • Staff Augmentation
      • Frontend-kehittäjät
      • Backend-kehittäjät
      • Tietoinsinöörit
      • Pilvi-insinöörit
      • QA insinöörit
      • Muut
    • Se neuvoa-antava
      • Tilintarkastus & konsultointi
  • Arvo
    • TOIMITUSJOHTAJA
    • CTO
    • Toimituspäällikkö
  • Tiimimme
  • Tapaustutkimukset
  • Tiedä miten
    • Blogi
    • Tapaamiset
    • Webinaarit
    • Resurssit
Työurat Ota yhteyttä
Takaisin nuoli PALAA TAAKSE
2021-10-18
Ohjelmistokehitys

Refaktoroinnin nopea alkeiskurssi aloittelijoille

Codest

Marta Swiatkowska

Junior Software Engineer

Ehkä kirjoitan jostain, mikä on monille itsestään selvää, mutta ei ehkä kaikille. Refaktorointi on mielestäni monimutkainen aihe, koska siinä muutetaan koodia vaikuttamatta sen toimintaan.

Siksi joillekin on käsittämätöntä, että refaktorointi on itse asiassa ohjelmoinnin osa-alue, ja se on myös erittäin tärkeä osa ohjelmoijan työtä. Koodi kehittyy jatkuvasti, sitä muutetaan niin kauan kuin on mahdollista lisätä uusia toiminnallisuuksia. Se voi kuitenkin ottaa muodon, joka ei enää mahdollista uusien toiminnallisuuksien tehokasta lisäämistä, ja silloin olisi helpompaa kirjoittaa koko ohjelma uudelleen.

Mitä refaktorointi on?

Yleensä vastaus on, että koodin rakennetta muutetaan soveltamalla useita refaktorointimuunnoksia vaikuttamatta koodin havaittavaan käyttäytymiseen. Tämä on totta. Äskettäin törmäsin myös määritelmään Martin Fowler kirjassaan "Olemassa olevan säännöstön suunnittelun parantaminen" jossa hän kuvailee refaktorointi "suurten muutosten tekeminen pienin askelin". Hän kuvailee refaktorointi koodimuutoksena, joka ei vaikuta sen toimintaan, mutta hän korostaa, että se on tehtävä pienin askelin.

Kirjassa myös kannatetaan, että refaktorointi ei vaikuta koodin toimintaan ja huomauttaa, että sillä ei ole vaikutusta testien läpäisyyn missään vaiheessa. Siinä kuvataan vaihe vaiheelta, miten turvallisesti suoritetaan refaktorointi. Pidin hänen kirjastaan, koska siinä kuvataan yksinkertaisia temppuja, joita voi käyttää jokapäiväisessä työssä.

Miksi tarvitsemme refaktorointia?

 Useimmiten saatat tarvita sitä, kun haluat ottaa käyttöön uuden toiminnallisuuden ja koodi nykyisessä versiossaan ei salli sitä tai se olisi vaikeampaa ilman muutoksia koodiin. Se on hyödyllinen myös silloin, kun uusien ominaisuuksien lisääminen ei ole ajallisesti kannattavaa, eli olisi nopeampaa kirjoittaa koodi uudelleen alusta alkaen. Mielestäni joskus unohdetaan, että refaktorointi voi tehdä koodista siistimpää ja luettavampaa. Martin kirjoittaa kirjassaan, miten hän tekee refaktorointia, kun hän tuntee epämiellyttäviä hajuja koodissa, ja miten hän asian ilmaisee, "se jättää aina tilaa paremmalle". Hän yllätti minut tässä yhteydessä näkemällä refaktoroinnin osana jokapäiväistä koodityöskentelyä. Minulle koodit ovat usein käsittämättömiä, niiden lukeminen on hieman kokemus, koska koodi on usein epäintuitiivista.

Hyvin suunnitellun ohjelman tunnusmerkki on sen modulaarisuus, jonka ansiosta riittää, että tunnet vain pienen osan koodista, jotta voit tehdä suurimman osan muutoksista. Modulaarisuus helpottaa myös uusien ihmisten sisäänpääsyä ja työskentelyn aloittamista tehokkaammin. Modulaarisuuden saavuttamiseksi toisiinsa liittyvät ohjelman osat on ryhmiteltävä yhteen, ja yhteydet on ymmärrettävä ja löydettävä helposti. Ei ole olemassa mitään yksittäistä nyrkkisääntöä siitä, miten tämä voidaan tehdä. Kun tiedät ja ymmärrät yhä paremmin, miten koodin on tarkoitus toimia, voit ryhmitellä elementtejä, mutta joskus sinun on myös testattava ja tarkistettava.

Yksi refaktoroinnin säännöistä YAGNI, se on lyhenne sanoista "You Aren't Gonna't Need It" (Et tarvitse sitä), ja se juontaa juurensa sanoista eXtreme-ohjelmointi (XP) käytetään pääasiassa Ketterä ohjelmistokehitys joukkueet. Pitkä tarina lyhyesti, YAGNI sanoo, että vain ajantasaisia asioita pitäisi tehdä. Tämä tarkoittaa periaatteessa sitä, että vaikka jotakin asiaa voitaisiin tarvita tulevaisuudessa, sitä ei pitäisi tehdä juuri nyt. Emme kuitenkaan voi myöskään murskata uusia laajennuksia, ja tässä kohtaa modulaarisuus tulee tärkeäksi.

Kun puhutaan refaktorointion mainittava yksi olennaisimmista tekijöistä eli testit. Osoitteessa refaktorointi, meidän on tiedettävä, että koodi toimii edelleen, koska refaktorointi ei muuta sen toimintaa vaan sen rakennetta, joten kaikki testit on läpäistävä. Testit on parasta suorittaa sille koodin osalle, jonka parissa työskentelemme, jokaisen pienen muutoksen jälkeen. Näin saamme varmistuksen siitä, että kaikki toimii niin kuin pitääkin, ja se lyhentää koko toimenpiteeseen kuluvaa aikaa. Tästä Martin puhuu kirjassaan - aja testit niin usein kuin mahdollista, jotta et joutuisi ottamaan askelta taaksepäin ja tuhlaamaan aikaa etsimällä muunnosta, joka rikkoi jotain.

Koodin uudelleenkäsittely ilman testausta on tuskallista, ja on suuri mahdollisuus, että jokin menee pieleen. Jos se on mahdollista, olisi parasta lisätä ainakin joitakin perustestejä, jotka antavat meille hieman varmuutta siitä, että koodi toimii.

Alla luetellut muunnokset ovat vain esimerkkejä, mutta ne ovat todella hyödyllisiä päivittäisessä ohjelmoinnissa:

  • Funktioiden ja muuttujien poisto - jos funktio on liian pitkä, tarkista, onko olemassa pienempiä funktioita, jotka voitaisiin poistaa. Sama koskee pitkiä rivejä. Nämä muunnokset voivat auttaa löytämään koodista päällekkäisyyksiä. Pienten funktioiden ansiosta koodista tulee selkeämpää ja ymmärrettävämpää,
  • Funktioiden ja muuttujien uudelleennimeäminen - oikean nimeämiskäytännön käyttäminen on olennaisen tärkeää hyvän ohjelmoinnin kannalta. Muuttujien nimet voivat hyvin valittuna kertoa paljon koodista,
  • Toimintojen ryhmittely luokkaan - tämä muutos on hyödyllinen silloin, kun kaksi luokkaa suorittaa samanlaisia toimintoja, sillä se voi lyhentää luokan pituutta,
  • Sisäänrakennetun lausekkeen ohittaminen - jos ehto tarkistetaan erityistapauksessa, anna palautuslauseke, kun ehto toteutuu. Tämäntyyppisiä testejä kutsutaan usein varoituslausekkeeksi. Sisäkkäisen ehdollisen lausekkeen korvaaminen poistumislausekkeella muuttaa koodin painotusta. If-else-konstruktiossa molemmille vaihtoehdoille annetaan yhtä suuri painoarvo. Koodia lukevalle henkilölle se on viesti siitä, että kumpikin on yhtä todennäköinen ja tärkeä,
  • Erikoistapauksen esittely - jos käytät joitakin ehtoja koodissasi useita kertoja, voi olla syytä luoda niille erillinen rakenne. Näin ollen useimmat erikoistapausten tarkistukset voidaan korvata yksinkertaisilla funktiokutsuilla. Usein yleinen arvo, joka vaatii erityiskäsittelyä, on null. Siksi tätä mallia kutsutaan usein nollakohteeksi. Tätä lähestymistapaa voidaan kuitenkin käyttää missä tahansa erikoistapauksessa,
  • Ehdollisen käskyn polymorfismin korvaaminen.

Esimerkki

Tämä on artikkeli aiheesta refaktorointi ja tarvitaan esimerkki. Haluan näyttää alla yksinkertaisen refaktorointinäytteen, jossa käytetään työkalua Sisäänrakennetun lausekkeen ohittaminen ja Ehdollisen käskyn polymorfismin korvaaminen. Oletetaan, että meillä on ohjelmatoiminto, joka palauttaa hash-tiedoston, jossa on tietoa siitä, miten kasveja kastellaan tosielämässä. Tällainen tieto olisi luultavasti mallissa, mutta tässä esimerkissä se on funktiossa.

def watering_info(kasvi)
     result = {}
     if plant.is_a? Suculent || plant.is_a? Kaktus
         result = { water_amount: ", how_to: "Alhaalta", watering_duration: "2 weeks" }
     elsif plant.is_a? Alocasia || plant.is_a? Maranta
         result = { water_amount: "Big amount", how_to: "As you prefer", watering_duration: "5 päivää" }
     elsif plant.is_a? Peperomia
         result = { water_amount: "Dicent amount",
             how_to: "Alhaalta! ne eivät pidä vedestä lehdillä",
             watering_duration: "1 week" }
     else
         result = { water_amount: "Dicent amount",
             how_to: "As you prefer",
             watering_duration: "1 week"
             }
     end
     return result
 end

Ajatuksena on muuttaa, jos palata:

if plant.isa? Suculent || plant.isa? Cactus

     result = { wateramount: ", howto: "Alhaalta",

Osoitteeseen

return { water_amount: ", how_to: "Alhaalta",watering_duration: "2 weeks" } if plant.is_a? Suculent || plant.is_a? Kaktus

return { vesimäärä: "Vähän" , mitento: "Alhaalta", kastelukesto: on: "2 viikkoa" } if plant.isa? Suculent || plant.is_a? Kaktus

Ja niin edelleen, kunnes saamme aikaan funktion, joka näyttää tältä:

def watering_info(kasvi)

return result = { wateramount: ", howto: "Alhaalta", wateringduration: "2 weeks" } if plant.isa? Suculent || plant.is_a? Kaktus

return result = { wateramount: "Big amount", howto: "As you prefer", wateringduration: "5 days" } if plant.isa? Alocasia || plant.is_a? Maranta

return result = { water_amount: "Dicent amount",

          howto: "Alhaalta! ne eivät pidä vedestä lehdillä",
          wateringduration: "1 week" } if plant.is_a? Peperomia

return result = { water_amount: "Dicent amount",

          how_to: "As you prefer",

          kastelun_kesto: "1 viikko"

          }

end

 Aivan lopussa meillä oli jo palautustulos. Ja hyvä tapa on tehdä tämä vaihe vaiheelta ja testata jokainen muutos. Voisit korvata tämän if-lohkon switch-tapauksella, ja se näyttäisi heti paremmalta, eikä sinun tarvitsisi tarkistaa kaikkia if-lohkoja joka kerta. Se näyttäisi tältä:

def watering_info(kasvi)

swich plant.class.to_string

case Sukkulentti, Kaktus

     { wateramount: "A little bit " , howto: "Alhaalta", watering_duration: "2 weeks" }

case Alocasia, Maranta

     { wateramount: "Big amount", howto: "As you prefer", watering_duration: "5 days" }

case Peperomia

     { water_amount: "Dicent amount",

          how_to: "Alhaalta! ne eivät pidä vedestä lehdillä",

          kastelun_kesto: "1 viikko" }

else

     { water_amount: "Dicent amount",

            how_to: "Miten haluat",

       kastelun_kesto: "1 week" }

end

end

Ja sitten voit soveltaa Ehdollisen käskyn korvaaminen polymorfismilla. Tämän tarkoituksena on luoda luokka, jossa on funktio, joka palauttaa oikean arvon ja vaihtaa ne oikeisiin paikkoihinsa.

luokka Suculent

...

def watering_info()

     return { wateramount: ", howto: "Alhaalta", watering_duration: "2 weeks" }

end

end

luokka Kaktus

...

def watering_info()

     return { wateramount: ", howto: "Alhaalta", watering_duration: "2 weeks" }

end

end

luokka Alocasia

...

def watering_info

     return { wateramount: "Big amount", howto: "As you prefer", watering_duration: "5 days" }

end

end

luokka Maranta

...

def watering_info

     return { wateramount: "Big amount", howto: "As you prefer", watering_duration: "5 days" }

end

end

luokka Peperomia

...

def watering_info

     return { water_amount: ,

      how_to: "Alhaalta! ne eivät pidä vedestä lehdillä",

      kastelun_kesto: "1 viikko" }

end

end

luokka Kasvi

...

def watering_info

     return { water_amount: ,

              how_to: "As you prefer",

              kastelun_kesto: "1 week" }

end

end

Ja pääkastelu_infofunktiossa koodi näyttää tältä:

def watering_info(kasvi)

    plant.map(&:watering_info)

end

Tämä toiminto voidaan tietenkin poistaa ja korvata sen sisällöllä. Tämän esimerkin avulla halusin esitellä yleisen refaktorointimalli.

Yhteenveto

Refaktorointi on suuri aihe. Toivottavasti tämä artikkeli kannusti lukemaan lisää. Nämä refaktorointitaidot auttaa sinua löytämään virheet ja parantamaan puhdasta koodia. Suosittelen lukemaan Martinin kirjan (Improving the Design of Existing Code), joka on melko perustavanlaatuinen ja hyödyllinen kokoelma sääntöjä, jotka koskevat refaktorointi. Kirjoittaja näyttää erilaisia muunnoksia askel askeleelta täydellisen selityksen ja motivaation kanssa sekä vinkkejä siitä, miten välttää virheitä. refaktorointi. Monipuolisuutensa ansiosta se on ihastuttava kirja frontend- ja backend-kehittäjät.

Tule Junior Ruby Developer

Lue lisää

GraphQL Ruby. Entä suorituskyky?

Kiskot ja muut liikennevälineet

Rails-kehitys TMUX, Vim, Fzf + Ripgrep -ohjelmilla

Aiheeseen liittyvät artikkelit

Ohjelmistokehitys

Tulevaisuuden web-sovellusten rakentaminen: The Codest:n asiantuntijatiimin näkemyksiä

Tutustu siihen, miten The Codest loistaa skaalautuvien, interaktiivisten verkkosovellusten luomisessa huipputeknologian avulla ja tarjoaa saumattomia käyttäjäkokemuksia kaikilla alustoilla. Lue, miten asiantuntemuksemme edistää digitaalista muutosta ja liiketoimintaa...

THECODEST
Ohjelmistokehitys

Top 10 Latviassa toimivaa ohjelmistokehitysyritystä

Tutustu Latvian parhaisiin ohjelmistokehitysyrityksiin ja niiden innovatiivisiin ratkaisuihin uusimmassa artikkelissamme. Tutustu siihen, miten nämä teknologiajohtajat voivat auttaa nostamaan liiketoimintaasi.

thecodest
Yritys- ja skaalausratkaisut

Java-ohjelmistokehityksen perusteet: A Guide to Outsourcing Successfully

Tutustu tähän keskeiseen oppaaseen Java-ohjelmistokehityksen onnistuneesta ulkoistamisesta tehokkuuden parantamiseksi, asiantuntemuksen saamiseksi ja projektin onnistumiseksi The Codestin avulla.

thecodest
Ohjelmistokehitys

Perimmäinen opas ulkoistamiseen Puolassa

Ulkoistamisen lisääntyminen Puolassa johtuu taloudellisesta, koulutuksellisesta ja teknologisesta kehityksestä, joka edistää tietotekniikan kasvua ja yritysystävällistä ilmapiiriä.

TheCodest
Yritys- ja skaalausratkaisut

Täydellinen opas IT-tarkastustyökaluihin ja -tekniikoihin

Tietotekniikan tarkastuksilla varmistetaan turvalliset, tehokkaat ja vaatimustenmukaiset järjestelmät. Lue lisää niiden merkityksestä lukemalla koko artikkeli.

Codest
Jakub Jakubowicz teknologiajohtaja ja toinen perustaja

Tilaa tietopankkimme ja pysy ajan tasalla IT-alan asiantuntemuksesta.

    Tietoa meistä

    The Codest - Kansainvälinen ohjelmistokehitysyritys, jolla on teknologiakeskuksia Puolassa.

    Yhdistynyt kuningaskunta - pääkonttori

    • Toimisto 303B, 182-184 High Street North E6 2JA
      Lontoo, Englanti

    Puola - Paikalliset teknologiakeskukset

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Krakova
    • Brain Embassy, Konstruktorska
      11, 02-673 Varsova, Puola

      Codest

    • Etusivu
    • Tietoa meistä
    • Palvelut
    • Tapaustutkimukset
    • Tiedä miten
    • Työurat
    • Sanakirja

      Palvelut

    • Se neuvoa-antava
    • Ohjelmistokehitys
    • Backend-kehitys
    • Frontend-kehitys
    • Staff Augmentation
    • Backend-kehittäjät
    • Pilvi-insinöörit
    • Tietoinsinöörit
    • Muut
    • QA insinöörit

      Resurssit

    • Faktoja ja myyttejä yhteistyöstä ulkoisen ohjelmistokehityskumppanin kanssa
    • Yhdysvalloista Eurooppaan: Miksi amerikkalaiset startup-yritykset päättävät muuttaa Eurooppaan?
    • Tech Offshore -kehityskeskusten vertailu: Tech Offshore Eurooppa (Puola), ASEAN (Filippiinit), Euraasia (Turkki).
    • Mitkä ovat teknologiajohtajien ja tietohallintojohtajien tärkeimmät haasteet?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Verkkosivuston käyttöehdot

    Tekijänoikeus © 2025 by The Codest. Kaikki oikeudet pidätetään.

    fiFinnish
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek fiFinnish