我已经看到在指定一系列索引时使用的两种替代约定,例如
subString(int startIndex, int length);与
subString(int startIndex, int endIndex);就您可以使用它们做什么而言,它们显然是等效的,唯一的区别是您是否指定了结束索引或范围的长度。
我假设在所有情况下,startIndex都是包含的,并且是endIndex独占的。
在定义API时,是否有任何令人信服的理由优先选择其中一个?
发布于 2013-01-11 14:18:48
我更喜欢length one,因为它减少了我要在文档中询问/查找的问题。
对于基于endIndex的端点--这是一个包含性端点还是排他性端点?
(对于任何一种变体,都可能会问到关于startIndex的相同问题,但这将是一个使其成为独占的反常的API )。
发布于 2013-01-12 01:47:56
如何消除位置论元的歧义...
经过这么多年,我们不是发现更好了吗?
啊,是的,也许在Smalltalk中,因为这个问题被标记为语言不可知论...
aString copyFrom: startIndex to: stopIndex.
aString substringOfLength: length startingAt: startIndex.更少的模棱两可,但也许我们还需要再等30年才能更广泛地采用这种风格
(它可能看起来太简单而不是认真的)
发布于 2013-01-11 14:28:18
这是一个很好的问题,我认为使用哪个用例的偏好可以归结为最常见的用例。大多数使用这两种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))时将需要额外的计算。
https://stackoverflow.com/questions/14272255
复制相似问题