【发布时间】:2017-08-22 10:53:37
【问题描述】:
为了编写具有良好可读性的优质代码,我采用currying functions 方法,为大部分重复代码sn-ps 制作纯辅助函数。我刚刚观察到我的项目中到处都有存在/类型检查,以避免任何可能的错误,例如type of undefined.
检查如下:
if (param){
action...
}
我正在考虑创建一个需要两个参数的全局辅助函数; param 需要检查,action function 在检查通过时执行操作。比如:
function isExist(param, action){
if (param){
action();
}
}
此功能不适用于所有 sn-ps/案例。我怎样才能使它在所有情况下都高效且具有全局功能?这也是正确的方法。如果不是,那么我应该遵循什么来实现我的目标的最佳方法是什么?
示例:
if (userInput){
saveToDB(userInput);
}
if (valueFromDB){
performSomeAction();
}
if (username && password){
validate(username, password)
}
我希望代码中不同点的所有这些检查都被单个辅助函数替换,有点像:
isExist( userInput, saveToDB(userInput) );
isExist( valueFromDB, performSomeAction );
isExist( (username && password), validate(username, password) );
通过这种方式,我们将这 9 行代码替换为仅 3 行代码。这就是我想要实现的目标。
【问题讨论】:
-
这种模式称为守卫。您应该考虑一个替代的惰性版本,它期望函数(也称为谓词)而不是条件作为参数并且是柯里化的。比你可以传入
Array.prototype.every/some进行逻辑合取/析取。 -
@ftor 谢谢。我没明白
an alternative, lazy version that expects functions是什么意思。你能解释一下吗? -
@adi
var checker = p => f => (...args) => p(...args) ? f(...args) : null; var checkNotNull = checker(args => args.every(x => x != null)); var safeAdd = checkNotNull((a, b) => a + b)); safeAdd(3, 1) /* 4 */; safeAdd(null, 2) /* null */; -
在旁注中,通常您希望尝试以最小化空/未定义检查的方式编写代码。如果你用 g 的结果和 h
f(g(h(args)))的结果调用 f,那么你只需要检查 h 中的参数,而不是 f 或 g。编写仅使用已知良好输入调用的简单函数,并将空检查移至边缘(用户输入、ajax 数据等)。这对于性能和可读性都比在所有地方使用警卫/可能/任何地方都更可取。 -
嘿@JaredSmith,是的,你是对的。感谢您的宝贵意见。
标签: javascript optimization functional-programming parameter-passing purely-functional