12

インデックスの範囲を指定するときに使用される 2 つの代替規則を見てきました。

subString(int startIndex, int length);

対。

subString(int startIndex, int endIndex);

それらは明らかに、それらでできることの点で同等です。唯一の違いは、終了インデックスまたは範囲の長さを指定するかどうかです。

すべての場合において、startIndex は包括的であり、endIndex は排他的であると想定しています。

API を定義するときに、どちらかを優先する説得力のある理由はありますか?

4

4 に答える 4

7

lengthドキュメントで尋ねたり調べたりする質問が1つ少ないという理由だけで、私はその方が好きです。

ベースの場合endIndex- それは包括的または排他的なエンドポイントですか?

(どちらの亜種についても、 について同じ質問をすることができますがstartIndex、それを排他的にするのはひねくれた API になります)。

于 2013-01-11T06:18:47.827 に答える
3

位置引数のあいまいさを解消する方法...

  1. 長い名前を使用する subStringFromUpto( startIndex , stopIndex )

  2. ライブラリ全体で統一された規則を使用する

これらすべての年月の後、私たちはより良いものを見つけませんでしたか?

質問には言語にとらわれないタグが付けられているので、おそらく Smalltalk で...

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

あいまいさは減りましたが、そのようなスタイルがより広く採用されるまでには、さらに 30 年待たなければならない可能性があります
(おそらく、単純すぎて真剣に見えません)。

于 2013-01-11T17:47:55.933 に答える
2

これは良い質問です。どちらを使用するかの好みは、最も一般的な使用例に帰着すると思います。ほとんどのユース ケースはどちらの API を使用しても同じように単純ですが、次の 1 つを考慮してください。

5 で始まり、文字列の最後で終わる部分文字列を取得したいとします。インデックス ベースのバージョンを使用すると (2 番目のインデックスが排他的であると仮定して)、次のように簡単です。

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

長さベースの API の場合:

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

その 2 番目のアプローチは、はるかに簡潔で明白ではありません。ただし、これは、長さが残りの文字列のオーバーフローを引き起こす場合、それを適切にサポートすることを単に述べるだけで解決できます (たとえば、残りのstr.subString(5, str.length());文字数よりも多くの文字を要求している場合でも、インデックス 5 から最後まですべてを取得します)。 )。Ruby は、負のインデックスなどの高度なものをサポートすることに加えて、 String#spliceメソッドでこれを行います。

私の意見では、特に負のインデックスが許可されていない場合は、インデックス ベースのアプローチがより具体的です。これにより、API に何を期待するかが非常に明確になり、これは良いことです。自分の足を撃ちにくくします。ただし、Ruby のように十分に文書化された API を使用すると、プログラマーは簡単に権限を与えられ、適切な部分文字列化を行うことができます。

また、一般に、部分文字列操作を実行しているときは、開始点と終了点を知っていることがよくあります。長さベースのアプローチでは、API を呼び出すときに追加の計算が必要になります (例: substring(startIndex, endIndex - startIndex))。

于 2013-01-11T06:28:17.853 に答える