Elm:
代码重构

如何进行重构:

假设你有一个Elm函数功能过于复杂,比如UI逻辑和状态更新混为一谈。这是重构的完美候选。原始代码如下:

updateAndFormat : String -> Model -> (Model, Cmd Msg)
updateAndFormat input model =
    let
        updatedModel = { model | userInput = input }
    in
    if String.length input > 5 then
        ( updatedModel, Cmd.none )
    else
        ( model, Cmd.none )

重构之后,我们通过将逻辑拆分到不同的函数中来分离关注点:

-- 更新逻辑是分开的
updateUserInput : String -> Model -> Model
updateUserInput input model = 
    { model | userInput = input }

-- 格式化(视图)逻辑也是分开的
formatUserInput : Model -> (Model, Cmd Msg)
formatUserInput model =
    if String.length model.userInput > 5 then
        ( model, Cmd.none )
    else
        ( { model | userInput = "" }, Cmd.none ) -- 举例来说,如果输入太短就清除输入。

-- 更新函数现在使用辅助函数
updateAndFormat : String -> Model -> (Model, Cmd Msg)
updateAndFormat input model =
    model
    |> updateUserInput input
    |> formatUserInput

经过这些改变,你有了清晰的分离,每个函数都更易于理解和测试。

深入探讨

把重构作为一种正式的实践可以追溯到编程的早期,当时代码变更的成本已经被认识到是开发过程中的一个关键方面。特别是,马丁·福勒在1990年代末出版的《重构:改善既有代码的设计》一书,真正为重构设立了基于结构化方法的舞台,并提供了用以识别重构机会的“代码异味”目录。

在Elm的语境中,重构利用了该语言的强项,比如其强类型系统,这在过程中促进了信心。手动重构的替代方法可以包括自动化代码转换工具,但与一些更老的语言相比,Elm在这一领域的工具仍在成熟中。实现细节通常围绕着常见的重构,如函数提取、重命名和简化条件表达式。Elm的编译器是重构的关键盟友,因为它不会让你轻易脱身——每当有什么地方不对劲时,它都会大声提醒,确保你重构的代码依然能够正常工作。

另见