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);