これは良い質問です。どちらを使用するかの好みは、最も一般的な使用例に帰着すると思います。ほとんどのユース ケースはどちらの 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)
)。