(Start, Ende) vs. (Start, Länge) im API-Design

8

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?

    
mikera 11.01.2013, 05:29
quelle

4 Antworten

5

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 % gestellt werden, aber es wäre eine perverse API, die sie ausschließt)

    
Damien_The_Unbeliever 11.01.2013 06:18
quelle
3

Wie man Positionsargumente disambiguiert ...

  1. Verwenden Sie längere Namen subStringFromUpto (startIndex, stopIndex)

  2. 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)

    
aka.nice 11.01.2013 17:47
quelle
2

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) ).

    
Marc Baumbach 11.01.2013 06:28
quelle
0

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.

    
George Forman 13.07.2016 17:16
quelle