0

私は Web 開発の状態管理を学んでおり、以下のような純粋な機能を備えたこの redux チュートリアルに出くわしました。ただし、ステートメント:「action.todo.id = state.todos.length + 1;」この純粋な関数は... IMPUREだったと思います。教えてください、ありがとう!

export function rootReducer(state: IAppState, action): IAppState {

    switch (action.type) {
        case ADD_TODO:
            action.todo.id = state.todos.length + 1;    
            return Object.assign({}, state, {
                todos: state.todos.concat(Object.assign({}, action.todo)),
                lastUpdate: new Date()
            })

        case TOGGLE_TODO:
            var todo = state.todos.find(t => t.id === action.id);
            var index = state.todos.indexOf(todo);
            return Object.assign({}, state, {
                todos: [
                    ...state.todos.slice(0, index),
                    Object.assign({}, todo, {isCompleted: !todo.isCompleted}),
                    ...state.todos.slice(index+1)
                ],
                lastUpdate: new Date()
            })
        case REMOVE_TODO:
            return Object.assign({}, state, {
                todos: state.todos.filter(t => t.id !== action.id),
                lastUpdate: new Date()
            })
        case REMOVE_ALL_TODOS:
            return Object.assign({}, state, {
                todos: [],
                lastUpdate: new Date()
            })
    }
    return state;
}
4

2 に答える 2

2

TL;DR - いいえ、そうではありません。

純関数の定義を調べてみましょう。ウィキペディアから:

コンピューター プログラミングでは、純粋関数は次のプロパティを持つ関数です。

  1. その戻り値は、同じ引数に対して同じです (ローカル静的変数、非ローカル変数、変更可能な参照引数、または I/O デバイスからの入力ストリームで変化はありません)。

  2. その評価には副作用がありません (ローカル静的変数、非ローカル変数、変更可能な参照引数または I/O ストリームの変更はありません)。

関数は 2 番目の条件に準拠していますが、new Date()- を使用すると不純になります。

あなたの場合の不純物の理由は、渡されたパラメーターに関係なく、関数呼び出しごとに日付が異なるという事実です。

純粋にするには、日付を追加のパラメーターとして渡す必要があります。これにより、同じ入力に対して同じ出力を得ることができます。

Zaptree はまた、アイテム ID の長さを変更すること action.todo.id = state.todos.length + 1は、それを参照する他の当事者に影響を与える可能性があるため、不純であると述べていました。

于 2019-05-15T13:14:24.213 に答える