Скорость движущихся объектов: рефакторинг от switch/enum к полиморфизму

Код-ревьюMiddle25 минпроверка — Спринт23-t009

Код считает скорость движущихся объектов трёх видов: колёсный, грузовой (скорость падает с загрузкой) и устаревший (зависит от напряжения, может быть заблокирован). Все виды реализованы одной структурой с полем-типом и switch внутри Speed(). Проведите ревью и отрефакторьте код так, чтобы добавление нового вида транспорта не требовало правки существующего.

Как на собесе: 25 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.

review.gogo
1package main2 3import (4	"errors"5	"math"6)7 8type moverType int9 10const (11	TypeWheeled moverType = 112	TypeCargo   moverType = 213	TypeLegacy  moverType = 314)15 16type Mover interface {17	Speed() (float64, error)18}19 20type mixedMover struct {21	_type   moverType22	load    int23	voltage float6424	locked  bool25}26 27func NewMover(t moverType, load int, voltage float64, locked bool) Mover {28	return &mixedMover{t, load, voltage, locked}29}30 31func (m mixedMover) Speed() (float64, error) {32	switch m._type {33	case TypeWheeled:34		return m.baseSpeed(), nil35 36	case TypeCargo:37		return math.Max(0, m.baseSpeed()-m.loadFactor()*float64(m.load)), nil38 39	case TypeLegacy:40		if m.locked {41			return 0, nil42		}43		return m.scaledSpeed(m.voltage), nil44 45	default:46		return 0, errors.New("should be unreachable")47	}48}49 50func (m mixedMover) scaledSpeed(voltage float64) float64 {51	return math.Min(24.0, voltage*m.baseSpeed())52}53 54func (m mixedMover) loadFactor() float64 {55	return 9.056}57 58func (m mixedMover) baseSpeed() float64 {59	return 12.060}
⌘ Enter — проверить