Javascript 使用字符串作为参数来控制函数结果是一种反模式吗?

Javascript 使用字符串作为参数来控制函数结果是一种反模式吗?,javascript,Javascript,我试图确定在编写可以执行多个操作的函数时,最佳实践是什么。我目前的解决方案是使用一个字符串参数来告诉函数要做什么(例如,updateTasks('complete selected',data);) 我意识到我可以将这个函数拆分为多个函数,但我会以这种方式重复很多次。我的另一个选择是以布尔语句的形式使用更多的参数,但我读到了 目标 有少量的论据 保持干燥,或分成多个功能 数据集 作用 根据以下人员的建议进行更新: 用法示例 这是一个最佳实践,还是将功能拆分为一个最佳实践?我希望我的代码尽可能

我试图确定在编写可以执行多个操作的函数时,最佳实践是什么。我目前的解决方案是使用一个字符串参数来告诉函数要做什么(例如,
updateTasks('complete selected',data);

我意识到我可以将这个函数拆分为多个函数,但我会以这种方式重复很多次。我的另一个选择是以布尔语句的形式使用更多的参数,但我读到了

目标
  • 有少量的论据
  • 保持干燥,或分成多个功能
数据集 作用 根据以下人员的建议进行更新:

用法示例
这是一个最佳实践,还是将功能拆分为一个最佳实践?我希望我的代码尽可能地干燥易读。

我不知道有任何反模式。事实上,有一个问题。但是,与其传递字符串,不如传递函数以返回完整状态

const completeAllAction = () => true; //prev, isSelected parms ignored
const uncompleteAllAction = () => false;
const compleSelectedAction = (prev, isSelected ) =>  isSelected ? true : prev; 
const compleNonSelectedAction = (prev, isSelected ) =>  !isSelected ? true : prev; 
const uncompleSelectedAction = (prev, isSelected ) =>  isSelected ? false : prev; 
const uncompleNonSelectedAction = (prev, isSelected ) =>  !isSelected ? false : prev; 

const updateTasks = (action, data) => {
  const taskChanges = data.tasks.map(task => {
    const isSelected = data.selectedTasks.indexOf(task.id) > -1;
    const newComplete = action(task.complete, isSelected);
    return Object.assign({}, task, {complete: newComplete});
  });
  return taskChanges;
};


updateTasks(completeAllAction, data);
我强烈建议你不要省略if后面的{bloc}语句。详情见Crockford's

您还可以使用来减少参数计数并保持代码干燥

const getUpdateTasksFunction = action => {
    //return a function that takes the data object
    return (data) => {
        return data.tasks.map(task => {
            const isSelected = data.selectedTasks.indexOf(task.id) > -1;
            const newComplete = action(task.complete, isSelected);
            return Object.assign({}, task, {complete: newComplete});
        });
    }
}

const uncompleteAll = getUpdateTasksFunction(uncompleteAllAction);
const compleNonSelected = getUpdateTasksFunction(compleNonSelectedAction);
 //  ... continue for each action

//usage with only one param
const newData = uncompleteAll(data);

关于最佳实践的问题是离题的,因为它们主要是基于观点的。您可能更幸运的是,这是一种当前状态的枚举,它被序列化到某种外部数据库以进行作业处理吗?只是一个观察:三个
if
,对于
return Object.assign有不同的条件({},task,{complete:true})
和三个
if
返回Object.assign的条件不同({},task,{complete:false})传递一个像
{complete:true,selected:false}
这样的对象怎么样?没有什么规定你必须使用多个参数来传递多个布尔值。
updateTasks('complete selected', data);
const completeAllAction = () => true; //prev, isSelected parms ignored
const uncompleteAllAction = () => false;
const compleSelectedAction = (prev, isSelected ) =>  isSelected ? true : prev; 
const compleNonSelectedAction = (prev, isSelected ) =>  !isSelected ? true : prev; 
const uncompleSelectedAction = (prev, isSelected ) =>  isSelected ? false : prev; 
const uncompleNonSelectedAction = (prev, isSelected ) =>  !isSelected ? false : prev; 

const updateTasks = (action, data) => {
  const taskChanges = data.tasks.map(task => {
    const isSelected = data.selectedTasks.indexOf(task.id) > -1;
    const newComplete = action(task.complete, isSelected);
    return Object.assign({}, task, {complete: newComplete});
  });
  return taskChanges;
};


updateTasks(completeAllAction, data);
const getUpdateTasksFunction = action => {
    //return a function that takes the data object
    return (data) => {
        return data.tasks.map(task => {
            const isSelected = data.selectedTasks.indexOf(task.id) > -1;
            const newComplete = action(task.complete, isSelected);
            return Object.assign({}, task, {complete: newComplete});
        });
    }
}

const uncompleteAll = getUpdateTasksFunction(uncompleteAllAction);
const compleNonSelected = getUpdateTasksFunction(compleNonSelectedAction);
 //  ... continue for each action

//usage with only one param
const newData = uncompleteAll(data);