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.