TDD开发中功能实现重叠时的路径选择咨询
关于TDD实现灯光控制函数的路径选择咨询
我采用TDD完成了Advent of Code 2015第6题的开发:
先实现了turnOn函数(F#代码如下):
let turnOn (startx, starty) (endx, endy) (grid: bool[,]) = for x in startx..endx do for y in starty..endy do grid.[x, y] <- true
随后开始实现turnOff函数,先编写第一个测试用例:
[<Fact>] let ``can turn off a light`` () = let grid = Array2D.create 1000 1000 true do grid |> LightsController.turnOff (0, 0) (0, 0) grid |> Array2D.iteri (fun x y status -> let expected = not (x = 0 && y = 0) Assert.Equal(expected, status))
这促使我定义了turnOff函数:
let turnOff (startx, starty) (endx, endy) (grid: bool[,]) = grid.[0, 0] <- false
接着编写第二个测试用例:
[<Fact>] let ``can turn off another light`` () = let grid = Array2D.create 1000 1000 true do grid |> LightsController.turnOff (1, 1) (1, 1) grid |> Array2D.iteri (fun x y status -> let expected = not (x = 1 && y = 1) Assert.Equal(expected, status))
此时我面临两种实现路径:
- 路径1:遵循标准TDD流程,逐个编写测试并迭代生产代码,待其结构与
turnOn一致后,重构两个函数并提取核心算法; - 路径2:复制
turnOn代码到turnOff函数中,修改关键部分(将grid.[x, y] <- true调整为对应逻辑),同时复制turnOn的所有测试用例用于turnOff以确保功能正常,之后再重构两个函数提取核心算法。
我更倾向于第二种方案,因为它效率更高且无需重复造轮子,但对复制粘贴的做法存在疑虑,特此咨询该场景下的合理选择。
内容的提问来源于stack exchange,提问作者Mehdi.Valizade
相关产品推荐
相关产品推荐

