Ich habe zwei alternative Konventionen gesehen, die bei der Angabe eines Bereichs von Indizes verwendet wurden, z. B.
%Vor%gegen
%Vor%Sie sind offensichtlich in Bezug auf das, was Sie mit ihnen tun können, gleichwertig. Der einzige Unterschied besteht darin, ob Sie den Endindex oder die Länge des Bereichs angeben.
Ich nehme an, dass in allen Fällen startIndex inclusive und endIndex exclusive ist.
Gibt es zwingende Gründe dafür, beim Definieren einer API eine der anderen vorzuziehen?
Ich würde das length
one bevorzugen, weil es mir eine weniger Frage gibt, die ich in der Dokumentation nachfragen / nachschlagen kann.
Für die endIndex
basierte - ist das ein inklusive oder exklusiver Endpunkt?
(Für beide Varianten kann die gleiche Frage zu
Wie man Positionsargumente disambiguiert ...
Verwenden Sie längere Namen subStringFromUpto (startIndex, stopIndex)
verwenden einheitliche Konventionen für die gesamte Bibliothek
Haben wir nach all den Jahren nicht besser gefunden?
Ach ja, vielleicht in Smalltalk, da die Frage sprach-agnostisch getaggt ist ...
%Vor%Weniger Ambiguität, aber vielleicht müssen wir noch 30 Jahre warten, bis sich solch ein Stil mehr durchsetzt (es sieht wahrscheinlich zu einfach aus, um ernst zu sein)
Das ist eine gute Frage und ich denke, dass die Präferenz für die Verwendung auf die häufigsten Anwendungsfälle zurückzuführen ist. Die meisten Anwendungsfälle sind mit beiden APIs gleichermaßen einfach, berücksichtigen Sie jedoch Folgendes:
Sie möchten einen Teilstring erhalten, der bei 5 beginnt und am Ende des Strings endet. Bei Verwendung der indexbasierten Version (vorausgesetzt, dass der zweite Index exklusiv ist) ist dies so einfach wie:
%Vor%Mit der length-basierten API:
%Vor% Dieser zweite Ansatz ist viel weniger prägnant und offensichtlich. Dies kann jedoch dadurch gelöst werden, dass einfach gesagt wird, dass, wenn die Länge einen Überlauf der verbleibenden Zeichenfolge verursacht, dies unterstützt (zB str.subString(5, str.length());
würde alles von Index 5 bis zum Ende greifen, obwohl es nach mehr Zeichen fragen könnte) als sind übrig). Ruby macht dies mit ihrer Methode String # splice zusätzlich zu Unterstützung für fortgeschrittene Dinge wie negative Indizes.
Meiner Meinung nach ist der indexbasierte Ansatz konkreter, insbesondere wenn negative Indizes nicht erlaubt sind. Dies macht es sehr offensichtlich, was von der API zu erwarten ist, was eine gute Sache sein kann; es wird schwieriger, sich in den Fuß zu schießen. Eine gut dokumentierte API, wie Ruby, macht es jedoch leicht, den Programmierer zu befähigen, und kann für einen gewissenhaften Teilstring sorgen.
Ich finde auch, dass ich im Allgemeinen, wenn ich Teilstrings operiere, oft meine Anfangs- und Endpunkte kenne. Bei dem auf Länge basierenden Ansatz wird dies eine zusätzliche Berechnung erfordern, wenn die API aufgerufen wird (z. B. substring(startIndex, endIndex - startIndex)
).
Jemand sollte eine Studie typischer Call-Sites durchführen, um herauszufinden, welcher Ansatz einen prägnanteren Code ergibt (und daher wahrscheinlich den Code korrigiert).
Ich mag das Argument, dass man bei der Verwendung von 'length' nicht auf die Dokumentation schauen muss, aber vielleicht sehen Sie sich bereits die Dokumentation an, um zu bestimmen, ob die 2. Ganzzahl das 'Ende' oder die 'Länge' ist. Wenn Sie es endExclusive nennen, dann ist es genauso selbstdokumentierend.
Tags und Links language-agnostic api coding-style api-design