实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的

What is the best practice for implementing a comparison method who's comparison type is chosen at runtime?

本文关键字:比较 类型 运行时 选择 是什么 最佳 方法 实现      更新时间:2023-09-26

假设您得到A,并希望将其与B进行比较。有时您可以检查A<B,有时您需要检查AB。您希望在一个方法中实现这一点,该方法将某种形式的"比较类型"作为其参数之一。对于如何做到这一点,是否有"最佳实践"?

为了清楚起见,我现在提供了一个如何做到这一点的例子。当传入a标志时,比较方法为"大于",反之亦然。

function func(a, b, c) {
    var cmp = a ? gt : lt;
    if (cmp(b, c)) {
        return 'Hi';
    }
    return 'Bye';
}
function lt(a, b) {
    return a < b;
}
function gt(a, b) {
    return a > b;
}

当您需要在升序和降序之间进行选择时,我通常会在处理排序时这样做:

var cmp = a ? 1 : -1
if(b*cmp > c*cmp){ // not sure if you want a > or a  < here
    return 'Hi'
}else{
    return 'Bye'
}

一个简短的版本是使用带xor的布尔逻辑:(注意,对于b==c的情况,它给出了错误的结果)

function func(a, b, c) {
    if ((b > c)^!a) {
        return 'Hi';
    }
    return 'Bye';
}

说明:若你们制作了一张有4种可能性的表格,你们就得到了:

a|b>c|预期输出

true|true|Hi-

true|false|再见

false | true |再见

false|false|Hi-

如果你认为Hi为真,Bye为假,如果a和b>c相等,你想要一个真,如果不相等,你就想要一个假。Xor做了类似的事情,如果2相等,则给出false,如果它们不同,则给出true。反过来,我们得到了我们想要的结果

若你们制作了相同的表格,但考虑到了相同的情况,你们可能会得到这样的结果:

  function func(a, b, c) {
    if(b == c || (b > c)^a){
      return 'Bye'
    }
    return 'Hi'
  }

这个怎么样?

if((a && b > c) || (!a && b < c)) {
    return 'Hi';
} else {
    return 'Bye';
}

我认为这仍然易于阅读和理解,涵盖了所描述的需求,并使代码简洁无重复。