Go:
Koodin uudelleenkirjoitus

Miten:

Gossa refaktorointi voi vaihdella yksinkertaisista kooditweaksista monimutkaisempiin muutoksiin. Aloittakaamme perusesimerkillä: yksinkertaistetaan alustava Go-funktio paremman luettavuuden ja tehokkuuden saavuttamiseksi.

Ennen refaktorointia:

package main

import "fmt"

func CalculatePrice(quantity int, price float64) float64 {
    var total float64
    if quantity > 0 {
        total = float64(quantity) * price
    } else {
        total = 0
    }
    return total
}

func main() {
    fmt.Println(CalculatePrice(10, 5.99))  // Tuloste: 59.9
}

Refaktoroinnin jälkeen:

package main

import "fmt"

func CalculatePrice(quantity int, price float64) float64 {
    if quantity > 0 {
        return float64(quantity) * price
    }
    return 0
}

func main() {
    fmt.Println(CalculatePrice(10, 5.99))  // Tuloste: 59.9
}

Refaktoroidussa versiossa else on poistettu, mikä yksinkertaistaa funktion kulkua vaikuttamatta sen tulokseen—esimerkki perustason, mutta merkittävästä refaktorointitekniikasta Gossa.

Monimutkaisemman esimerkin osalta, harkitse funktioiden refaktorointia käyttämään rajapintoja paremman uudelleenkäytettävyyden ja testattavuuden saavuttamiseksi:

Ennen refaktorointia:

package main

import "fmt"

type Logger struct{}

func (l Logger) Log(message string) {
    fmt.Println("Log:", message)
}

func ProcessData(data string, logger Logger) {
    // Kuvittele tässä olevan jonkin verran datan käsittelyä
    logger.Log("Data käsitelty")
}

func main() {
    logger := Logger{}
    ProcessData("esimerkkidata", logger)
}

Refaktoroinnin jälkeen:

package main

import "fmt"

type Logger interface {
    Log(message string)
}

type ConsoleLogger struct{}

func (c ConsoleLogger) Log(message string) {
    fmt.Println("Log:", message)
}

func ProcessData(data string, logger Logger) {
    // Datan käsittely pysyy muuttumattomana
    logger.Log("Data käsitelty")
}

func main() {
    logger := ConsoleLogger{}
    ProcessData("esimerkkidata", logger)
}

Refaktorointi käyttämään rajapintaa (Logger) konkreettisen tyypin (ConsoleLogger) sijaan parantaa funktion joustavuutta ja irrottaa datan käsittelyn tietystä lokitoteutuksesta.

Syväsukellus

Gossa refaktoroinnin on tasapainotettava yksinkertaisuutta (yksi Gosin perusfilosofioista) suurten ohjelmistoprojektien tarvitseman joustavuuden kanssa. Goksen minimalistisen lähestymistavan vuoksi ominaisuuksiin—ilman yleistyyppejä (ainakin ennen viime aikoina) ja keskittyen vahvasti luettavuuteen—kieli luonnollisesti ohjaa kehittäjiä kohti yksinkertaisempia, helpommin ylläpidettäviä koodirakenteita. Tämä ei kuitenkaan tarkoita, etteikö Gos-koodi hyötyisi refaktoroinnista; se tarkoittaa, että refaktoroinnin täytyy aina priorisoida selkeyttä ja yksinkertaisuutta.

Historiallisesti Gosin tiettyjen ominaisuuksien puute (esim. yleistyypit ennen Go 1.18) johti luoviin, mutta joskus monimutkaisiin ratkaisuihin koodin uudelleenkäytön ja joustavuuden osalta, mikä teki abstraktion refaktoroinnista yleisen käytännön. Goksen yleistyyppejä koskevan ominaisuuden käyttöönotolla Go 1.18:ssa Gos-kehittäjät refaktoroivat nyt perintäkoodia hyödyntääkseen tätä ominaisuutta paremman tyyppiturvallisuuden ja koodin uudelleenkäytön osalta, osoittaen refaktorointikäytäntöjen kehittyvän luonteen Gossa.

Silti Gosin työkaluvalikoima, mukaan lukien gofmt koodin muotoilua varten ja go vet epäilyttävien rakenteiden tunnistamiseen, tukee puhtaan koodikannan ylläpitämistä, vähentäen tarvetta laajalle refaktoroinnille. Vaikka refaktorointi onkin arvokas työkalu Gos-ohjelmoijan arsenaalissa, Gosin kieliominaisuuksien ja työkalujen viisas käyttö alusta alkaen voi auttaa minimoimaan monimutkaisen refaktoroinnin tarpeen myöhemmin.