【问题标题】:Is there a "canonical" name for a function combining min() and max()?结合 min() 和 max() 的函数是否有“规范”名称?
【发布时间】:2014-04-30 22:57:40
【问题描述】:

我发现我经常最终编写一个我总是称之为“clamp()”的函数,它是min()max() 的组合。此函数是否有标准的“规范”名称?

它总是看起来像这样:

function clamp($val, $lower, $upper)
{
  if ($val < $lower)
    return $lower;
  else if ($val > $upper)
    return $upper;
  else
    return $val;
}

或者干脆使用内置的min()max()函数:

function clamp($val, $lower, $upper)
{
  return max($lower, min($upper, $val));
}

存在变体:您还可以检查无效输入,其中lower &gt; upper,并抛出异常或反转输入。或者您可以忽略输入的顺序并将其称为三函数的中值,但这可能会造成混淆。

【问题讨论】:

  • 我会避免为您的参数提供与使用的函数相同的名称,特别是因为它们不用于匹配对(即 $min 与 max() 一起使用,反之亦然)。也许是 $lower 和 $upper。
  • @BenBlank:好主意。编辑了问题
  • 我使用名称 InRange() 但我的评论不是关于名称,而是关于参数的顺序。我发现它更容易阅读:InRange(min,value,max) 比 (value,min,max)

标签: language-agnostic standards nomenclature


【解决方案1】:

clamp是个好名字。

让我们把它作为标准。

【讨论】:

  • 似乎已经是标准的(至少在图形中):en.wikipedia.org/wiki/Clamping_%28graphics%29
  • 在我了解它是什么之后,这是一个很棒的名字。标准加一。
  • 我觉得“clip”比较常用。
  • 数字可能会被钳位,而图像可能会被剪裁。
  • C++17 有std::clamp
【解决方案2】:

在某些语言中,您有功能限制

num = limit(val, min, max)

【讨论】:

    【解决方案3】:
    clip(val, lo, hi)
    

    【讨论】:

      【解决方案4】:

      我们在这里使用pin。实际上,我们将pin 用于简单范围,clamp 用于其他内容。

      【讨论】:

        【解决方案5】:

        我会选择一个函数名“rangeCheck”

        【讨论】:

        • 不好,rangeCheck 听起来像是 CHECKS。但它所做的是将值更改为在一个范围内。
        【解决方案6】:

        绑定呢?

        bound(min, val, max)
        

        还是constrain

        constrain(val, min, max)
        

        【讨论】:

          【解决方案7】:

          您对 InRangeClosestTo(Number, RangeLowerBound, RangeUpperBound) 或 ClosestInRange(Number, LowerBoundOfRange, UpperBoundOfRange) 有什么看法?他们的意思是“给我最接近数字的范围内的元素”,我希望这是显而易见的。

          这个概念比 Clamp 更精确,它有两个边但不多,或者如果数字不在范围内,可能不想返回任何内容的 Limit 或 Bound,

          对我来说,它们比我看到的其他部分更清晰;虽然理解它们可能需要几秒钟的时间,但您只需要对名称进行推理,最多可以简单地看一下评论以确认;当你看到它有多精确时,感觉很好(它很精确,对吧?)。

          您可能只会怀疑范围是否包含在内,但我认为大多数人会正确地认为它是包含在内的。或者,您可以使用 InInclRangeClosestTo 和 InExclRangeClosestTo,尽管我没有看到很多用于独占范围的用途。

          当然,如果你想使用它们,你应该有一个自动完成的 IDE。

          【讨论】:

            【解决方案8】:

            中位数

            因为它可以泛化到更多的值。

            【讨论】:

            • 这不是要查找有关样本集的统计信息。这是关于强制数字在特定范围内。
            • @MSN:从技术上讲,median(val, min, max) 将与clamp(val, min, max) 做同样的事情。另外,中位数()的参数顺序无关紧要。但这并不是很明显(至少,对我来说不是)。
            • 中位数具有自我描述性的优势。你得到了中间元素。例如,如果我的最小值小于最大值,“clamp”会抛出异常吗?在那种情况下,哪个参数是最小值?第一还是第二?这些细节可能因地而异。
            • 我必须不同意中位数是自我描述的,因为我们不希望给定一组值的中位数,而是将给定值限制在某些边界内。虽然这在内部可能是相同的操作(虽然不完全是,但足够接近),但该中值调用的目的不像钳位那样明确,因此其他人更难阅读代码。
            猜你喜欢
            • 1970-01-01
            • 2017-08-06
            • 1970-01-01
            • 2019-09-21
            • 2011-08-01
            • 2013-02-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多