如何管理更新路径/消息构建器的爆炸?

Dan*_*lan 7 elm

我已经完成了Elm指南,并注意到非常简单的例子,update函数增长到3个案例,Msg类型可以有3个构造函数.我想在一个中间项目,这将增长到20,在一个高级项目,它可能是数百.你是如何管理的?我预见如果每个开发人员都需要为其功能添加新的构造函数,那么这就是版本控制争用的来源.

我参与了react-redux项目,它有一个结合Reducer来解决这个问题的概念.我没有在Elm遇到过这个概念.它有吗?

Tos*_*osh 6

您可以定义msg类型由子/子msg类型组成,当然,updater可以与子函数组合.即.

-- Counter


type CounterMsg
    = Increment
    | Decrement


type alias CounterModel =
    Int


updateCounter : CounterMsg -> CounterModel -> ( CounterModel, Cmd msg )
updateCounter msg model =
    case msg of
        Increment ->
            ( model + 1, Cmd.none )

        Decrement ->
            ( model - 1, Cmd.none )



-- Todo


type TodoMsg
    = AddTodo String


type alias TodoModel =
    List String


updateTodo : TodoMsg -> TodoModel -> ( TodoModel, Cmd msg )
updateTodo msg model =
    case msg of
        AddTodo str ->
            ( str :: model, Cmd.none )



-- unified


type alias Model =
    { counter : CounterModel
    , todos : TodoModel
    }


type Msg
    = Counter CounterMsg
    | Todo TodoMsg


initModel =
    { counter = 0, todos = [] }


update : Msg -> Model -> ( Model, Cmd msg )
update msg model =
    case Debug.log "message" msg of
        Counter countermsg ->
            let
                ( newmodel, cmd ) =
                    updateCounter countermsg model.counter
            in
                ( { model | counter = newmodel }, cmd )

        -- etc...
        _ ->
            ( model, Cmd.none )
Run Code Online (Sandbox Code Playgroud)