Weiß nicht, ob mir das besser gefällt. Ich würde die Positionskarte auch zu einem statischen Finale machen.
%Vor%Bereiche sorgen für ein bisschen weniger Durcheinander, IMO:
%Vor%Mit einem Injection-with-two-accumulator sollte es auch einfach sein, eine Liste von Dash-Positionen zu erstellen.
Sie könnten zuerst den Operator []
string verwenden, um die Teilstrings anstelle von substring
abzurufen und die Zwischenvariablen zu löschen. Zum Beispiel für length == 10
:
Jetzt gibt es ein bisschen Wiederholung dort. Sie können stattdessen zuerst alle isbn
Segmente und dann .join
sie mit '-'
erhalten:
Und noch viel mehr, anstatt auf isbn
jedes Mal zu verweisen, können Sie eine Liste der Bereiche erstellen, die Sie erhalten möchten, und sie dann alle gleichzeitig mit collect
:
Wenn Sie Code-Golf spielen möchten, können Sie auch Folgendes tun:
%Vor%Ich überlasse es Ihnen, herauszufinden, wie das funktioniert, aber ich denke, es ist wahrscheinlich keine gute Idee, das auf Produktionscode zu belassen, es sei denn, Sie wollen künftige Betreuer überraschen, hehe.
Beachten Sie auch, dass das Format für length == 13
dasselbe ist wie für length == 10
, aber mit einem anderen Präfix können Sie die gleiche Funktion in diesem Fall wiederverwenden. Die ganze Funktion (mit ein paar Tests) wäre:
Nun, ich denke, es gibt einige schlechte Gerüche in diesem Code. Kann isbn
sein null
? Zumindest für mich sieht das nicht wie eine Funktion aus, die sich um die Nichtigkeit ihres Arguments kümmern muss, oder zumindest ist das nicht klar, wenn man ihren Namen liest (es sollte eher wie formatIsbnOrNull
heißen, wenn beide ISBN - Zeichenfolgen und Nullwerte werden akzeptiert). Wenn Null-Werte nicht gültig sind, lassen Sie sie mit NullPointerException
explodieren, wenn Sie auf isbn.length()
zugreifen, damit der Aufrufer weiß, dass er ein falsches Argument übergeben hat, anstatt im Stillen die gleiche Null zurückzugeben.
Gleiches gilt für die return ISBN
am Ende. Wird erwartet, dass diese Funktion eine Zeichenfolge erhält, die weder 10 noch 13 Zeichen lang ist? Wenn nicht, besser throw new IllegalArgumentException()
und den Anrufer wissen lassen, dass er es falsch angerufen hat.
Schließlich bin ich mir nicht sicher, ob dies die "lesbarste" Lösung ist. Eine andere mögliche Lösung ist eine Zeichenfolge für das Format, z. B. '###-#-######-##-#'
. Ersetzen Sie dann #
s durch isbn
Zeichen. Ich denke, es könnte mehr selbstdokumentieren:
Erwägen Sie, die Methode wie hier gezeigt der String-Klasse hinzuzufügen. Beachten Sie, dass diese Antwort ein Spin auf einen cleveren Vorschlag in der epidemischen Antwort ist (re: collect).
Hinweis:
Dieser Code erweitert String um asIsbn
().
Der Bereich [0..2] benötigt nicht den Aufruf von asIsbn
(), aber die Symmetrie der Verwendung von collect
zweimal ist unwiderstehlich.
Groovy liefert den letzten Ausdruck in if/else
, daher ist 'return' nicht notwendig
Ich würde versuchen, Regex
... Ich denke, es ist ziemlich gut lesbar, wenn Sie wissen, wie man Regex, und es ist Javascript inspiriert Syntax in groovy ist auch ziemlich cool.
Noch eine Sache: Es ist ziemlich klar, wenn man sich die Capture-Gruppen ansieht, wie Ihre Strings für die gewünschte Formatierung aussehen.
%Vor%Btw, @epidemian Vorschlag mit Rückreferenzen ist großartig! Ich denke, der Code würde wie folgt aussehen:
%Vor%