Скорость движущихся объектов: рефакторинг от switch/enum к полиморфизму
Код-ревьюMiddle25 минпроверка — Спринт23-t009
Код считает скорость движущихся объектов трёх видов: колёсный, грузовой (скорость падает с загрузкой) и устаревший (зависит от напряжения, может быть заблокирован). Все виды реализованы одной структурой с полем-типом и switch внутри Speed(). Проведите ревью и отрефакторьте код так, чтобы добавление нового вида транспорта не требовало правки существующего.
Как на собесе: 25 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.
review.gogo
1packagemain23import(4"errors"5"math"6)78typemoverTypeint910const(11TypeWheeledmoverType=112TypeCargomoverType=213TypeLegacymoverType=314)1516typeMoverinterface{17Speed()(float64,error)18}1920typemixedMoverstruct{21_typemoverType22loadint23voltagefloat6424lockedbool25}2627funcNewMover(tmoverType,loadint,voltagefloat64,lockedbool)Mover{28return&mixedMover{t,load,voltage,locked}29}3031func(mmixedMover)Speed()(float64,error){32switchm._type{33caseTypeWheeled:34returnm.baseSpeed(),nil3536caseTypeCargo:37returnmath.Max(0,m.baseSpeed()-m.loadFactor()*float64(m.load)),nil3839caseTypeLegacy:40ifm.locked{41return0,nil42}43returnm.scaledSpeed(m.voltage),nil4445default:46return0,errors.New("should be unreachable")47}48}4950func(mmixedMover)scaledSpeed(voltagefloat64)float64{51returnmath.Min(24.0,voltage*m.baseSpeed())52}5354func(mmixedMover)loadFactor()float64{55return9.056}5758func(mmixedMover)baseSpeed()float64{59return12.060}