Я пытаюсь реализовать шаблон команды для управления роботом.Я использую это, чтобы изучить, как реализовать шаблон команды в F #.Ниже приведена моя реализация:
type Walle(position, rotate) =
let (x:float,y:float) = position
let rotation = rotate
member this.Move(distance) =
let x2 = distance * sin (System.Math.PI/180.0 * rotation)
let y2 = distance * cos (System.Math.PI/180.0 * rotation)
let newPosition = (x+x2, y+y2)
Walle(newPosition, rotation)
member this.Rotate(angle) =
let newRotation =
let nr = rotation + angle
match nr with
| n when n < 360.0 -> nr
| _ -> nr - 360.0
Walle(position, newRotation)
let Move distance = fun (w:Walle) -> w.Move(distance)
let Rotate degrees = fun (w:Walle) -> w.Rotate(degrees)
let remoteControl (commands:List<Walle->Walle>) robot =
commands |> List.fold(fun w c -> c w)
let testRobot() =
let commands = [Move(10.0);Rotate(90.0);Move(16.0);Rotate(90.0);Move(5.0)]
let init = Walle((0.0,0.0),0.0)
remoteControl commands init
В попытке найти функциональное решение я решил заставить действия робота возвращать новый экземпляр робота в его новом положении после каждого вызова (избегать мутаций).Я также сделал командные функции близкими по состоянию, необходимому для выполнения действий.
Мне было любопытно, считают ли люди, что это были хорошие проектные решения при реализации шаблона?Или, если есть какие-то другие советы, которые люди могут дать по внедрению шаблона?