【问题标题】:(start, end) vs. (start, length) in API designAPI 设计中的(开始,结束)与(开始,长度)
【发布时间】:2013-01-11 05:29:49
【问题描述】:

我已经看到在指定索引范围时使用了两种替代约定,例如

subString(int startIndex, int length);

对比

subString(int startIndex, int endIndex);

就你可以用它们做什么而言,它们显然是等价的,唯一的区别是你是指定结束索引还是范围的长度。

我假设在所有情况下 startIndex 都是包容性的,而 endIndex 是排斥性的。

在定义 API 时,是否有任何令人信服的理由优先选择其中一个?

【问题讨论】:

  • 顺便说一句,我认为使用 firstIndex/lastIndex 更好——对于开始/结束索引,是否包含 endIndex 处的元素是一个悬而未决的问题,因此必须深入研究文档。

标签: api language-agnostic coding-style api-design


【解决方案1】:

我更喜欢length ,因为它让我少了一个问题要问/在文档中查找。

对于基于 endIndex 的端点 - 这是一个包容性或独占性端点?

(对于任一变体,可以询问关于 startIndex 的相同问题,但它会是一个不正当的 API,使其具有排他性)。

【讨论】:

    【解决方案2】:

    如何消除位置参数的歧义...

    1. 使用较长的名称 subStringFromUpto( startIndex , stopIndex )

    2. 在整个库中使用统一约定

    这么多年过去了,我们没有找到更好的吗?

    是的,也许在 Smalltalk 中,因为问题被标记为与语言无关...

    aString copyFrom: startIndex to: stopIndex.
    aString substringOfLength: length startingAt: startIndex.
    

    不那么含糊,但也许我们还需要再等 30 年才能更广泛地采用这种风格
    (它可能看起来太简单了,不严肃)

    【讨论】:

      【解决方案3】:

      这是一个很好的问题,我认为使用哪种偏好归结为最常见的用例。使用任一 API 的大多数用例都同样简单,但考虑一下这个:

      你想得到一个从 5 开始到字符串末尾结束的子字符串。使用基于索引的版本(假设它的第二个索引是独占的),它很简单:

      str.subString(5, str.length());
      

      使用基于长度的 API:

      str.subString(5, str.length() - 5);
      

      第二种方法不那么简洁和明显。但是,这可以通过简单地说明如果长度会导致剩余字符串溢出来解决,它将优雅地支持这一点(例如,str.subString(5, str.length()); 将抓取从索引 5 到结尾的所有内容,即使它可能要求更多字符比剩下的)。除了支持负索引等高级功能之外,Ruby 还使用他们的 String#splice 方法来做到这一点。

      在我看来,基于索引的方法更具体,尤其是在不允许使用负索引的情况下。这使得对 API 的期望变得非常明显,这可能是一件好事;让自己更难射中自己的脚。然而,像 Ruby 这样有据可查的 API 可以很容易地赋予程序员权力,并且可以进行一些优雅的子字符串化。

      我还发现,一般来说,当我执行子字符串操作时,我通常知道我的起点和终点。使用基于长度的方法,这将需要在调用 API 时进行额外的计算(例如substring(startIndex, endIndex - startIndex))。

      【讨论】:

        【解决方案4】:

        应该对典型的调用站点进行研究,以找出哪种方法产生更简洁的代码(因此可能是正确的代码)。

        我喜欢这样的论点,即使用“长度”您不必查看文档,但您可能已经在查看文档以确定第二个整数是“结束”还是“长度”。如果您将其命名为 endExclusive,那么它就像是自我记录。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-17
          • 2022-08-15
          • 2014-06-13
          • 1970-01-01
          • 2020-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多