Skip to content

Commit a880dd5

Browse files
committed
Procedural approach refactor in String Calculator kata. Short description of the kata in the main README.
1 parent 877ed5e commit a880dd5

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,19 @@
2626
* [Fizz Buzz kata](fizz-buzz)
2727
* JMH
2828
* 11 implementations of a simple algorithm with performance comparison
29+
* [String Calculator kata](string-calculator)
30+
* Spock
31+
* incremental development (9 steps of discovering new requirements)
32+
* the same algorithm written using object-oriented and procedural approach
33+
* strategy (policy) pattern
34+
* value objects
35+
* regular expressions
2936

3037
## In progress
31-
* [String Calculator kata](string-calculator)
38+
* [Unusual Spending kata](unusual-spending)
3239

3340
## To do
3441
### Katas
35-
* [Unusual Spending kata](unusual-spending)
3642
* [Manhattan Distance kata](manhattan-distance)
3743
* [The Lift kata](the-lift)
3844
* [Social Network kata](social-network)

string-calculator/src/main/java/io/github/jonarzz/kata/string/calculator/procedural/SplitStreamStringCalculator.java

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,15 @@ public class SplitStreamStringCalculator implements StringCalculator {
2121
public int add(String numbers) {
2222
var valueToSplit = numbers;
2323
var delimiterRegex = "[\\n,]";
24-
if (numbers.startsWith(DELIMITER_PREFIX)) {
25-
var split = numbers.split("\\n", -1);
26-
if (split.length == 2) {
27-
var unescapedDelimiter = split[0].replaceFirst("^" + DELIMITER_PREFIX, "");
28-
var matcher = EXTENDED_DELIMITER_PATTERN.matcher(unescapedDelimiter);
29-
if (matcher.find()) {
30-
Set<String> delimiters = new HashSet<>();
31-
do {
32-
delimiters.add(quote(matcher.group(1)));
33-
} while (matcher.find());
34-
delimiterRegex = join("|", delimiters);
35-
} else {
36-
delimiterRegex = Pattern.quote(unescapedDelimiter);
37-
}
38-
valueToSplit = split[1];
39-
}
24+
if (!numbers.startsWith(DELIMITER_PREFIX)) {
25+
return calculateSum(valueToSplit, delimiterRegex);
26+
}
27+
var split = numbers.split("\\n", -1);
28+
if (split.length != 2) {
29+
return calculateSum(valueToSplit, delimiterRegex);
4030
}
31+
delimiterRegex = calculateDelimitersFrom(split[0]);
32+
valueToSplit = split[1];
4133
return calculateSum(valueToSplit, delimiterRegex);
4234
}
4335

@@ -64,4 +56,17 @@ private int calculateSum(String valueToSplit, String delimiterRegex) {
6456
return sum;
6557
}
6658

59+
private String calculateDelimitersFrom(String delimitersInput) {
60+
var unescapedDelimiter = delimitersInput.replaceFirst("^" + DELIMITER_PREFIX, "");
61+
var matcher = EXTENDED_DELIMITER_PATTERN.matcher(unescapedDelimiter);
62+
if (!matcher.find()) {
63+
return quote(unescapedDelimiter);
64+
}
65+
Set<String> delimiters = new HashSet<>();
66+
do {
67+
delimiters.add(quote(matcher.group(1)));
68+
} while (matcher.find());
69+
return join("|", delimiters);
70+
}
71+
6772
}

0 commit comments

Comments
 (0)