我最近在内部javascript库中添加了一个HasValue函数:
function HasValue(item) {
return (item !== undefined && item !== null);
}
在与同事交流期间,我们提出了添加另一个基本上只是反过来的函数的想法:也许HasNoValue或IsNothing
如果我们最终这样做,我们会:
function HasNoValue(item) {
return (item === undefined || item === null);
}
function HasValue(item) {
return !HasNoValue(item);
}
但是,我们不确定同时拥有它们或HasValue是否更具可读性。 哪个更具可读性/首选?
A:
if (HasValue(x) && !HasValue(y))
B:
if (HasValue(x) && HasNoValue(y))
答案 0 :(得分:20)
我非常喜欢A到B.“!”是一个应该被所有人理解的编程习语。
答案 1 :(得分:12)
如果!HasValue(y)
和HasNoValue(y)
在y
的整个输入范围内保证在逻辑上等效,那么我会更喜欢!HasValue(y)
。
我会毫不犹豫地拥有一个名为HasNoValue(y)
的函数,因为不可避免地会有人写!HasNoValue(y)
。
答案 2 :(得分:8)
到目前为止,我正在投票“A” 。
对于每个和任何布尔返回函数执行此操作所带来的额外维护负担与值得理解且非常易读的“!”相比是不值得的,事实上我相信“B”实际上更少可读,因为它很容易错过名称中间的“No”。
答案 3 :(得分:2)
我知道我会对这个观点非常孤独,如果我在合作项目中面对这个选择,我肯定会选择A,因为很明显它是正确的要做的事情,但我不得不说我很欣赏选项B的冗长。单词比符号更容易阅读和理解,即使它像我们心爱的感叹号那样平凡。
特别是现在IDE比以前有更好的智能感知,我通常倾向于选择比以前更加冗长的所有命名。 10次中有9次,可读性胜过小的性能差异,请放下手。
答案 4 :(得分:1)
只是为了减少代码行数并且因为你的函数返回一个布尔值,我会说要使用方法A.如果你不得不担心可读性,你总是可以尝试:
if ( HasValue(x) && !(HasValue(y)) )
答案 5 :(得分:0)
我会说选项A更清楚,你确切地知道它意味着什么。
答案 6 :(得分:0)
我会选择A,但那只是我。