Apply single responsibility principle
#Apply single responsibility principle ExtractExtract code into additional classes:
#Apply single responsibility principle Extract code into additional classes:
Apply single responsibility principle
Extract code into additional classes:
public interface ISBNSpecification {
default boolean isIBSNTypeisISBNType(String potentialISBN) {
return getPattern().matcher(potentialISBN).matches();
}
Pattern getPattern();
boolean validateChecksum(String isbn);
}
public interface ISBNSpecification {
default boolean isIBSNType(String potentialISBN) {
return getPattern().matcher(potentialISBN).matches();
}
Pattern getPattern();
boolean validateChecksum(String isbn);
}
public interface ISBNSpecification {
default boolean isISBNType(String potentialISBN) {
return getPattern().matcher(potentialISBN).matches();
}
Pattern getPattern();
boolean validateChecksum(String isbn);
}
Remove unnecessary dependencies
Try to minimize the "invasion" of additional libraries if you can simply say string.replace("-","")
.
#Apply single responsibility principle Extract code into additional classes:
ISBNSpecification
public interface ISBNSpecification {
default boolean isIBSNType(String potentialISBN) {
return getPattern().matcher(potentialISBN).matches();
}
Pattern getPattern();
boolean validateChecksum(String isbn);
}
ISBN13Specification
public class ISBN13Specification implements ISBNSpecification {
@Override
public Pattern getPattern() {
return Pattern.compile("^[0-9]{13}$"); // you may extract this as a constant
}
@Override
public boolean validateChecksum(String isbn) {
int sum = 0;
for (int i = 0; i < 12; i += 2) {
sum += digit(isbn.charAt(i));
sum += digit(isbn.charAt(i + 1)) * 3;
}
int computedChecksum = (10 - sum % 10) % 10;
int checksum = digit(isbn.charAt(12));
return checksum == computedChecksum;
}
private static int digit(char c) {
return Character.digit(c, 10);
}
}
ISBN10Specification
public class ISBN10Specification implements ISBNSpecification {
@Override
public Pattern getPattern() {
return Pattern.compile("^[0-9]{9}[0-9X]$"); // you may extract this as a constant
}
@Override
public boolean validateChecksum(String isbn) {
int sum = 0;
for (int i = 0; i < 9; i++) {
sum += digit(isbn.charAt(i)) * (i + 1);
}
int computedChecksum = sum % 11;
char cs = isbn.charAt(9);
int checksum = cs == 'X' ? 10 : digit(cs);
return checksum == computedChecksum;
}
private static int digit(char c) {
return Character.digit(c, 10);
}
}
lang-java