Я хочу написать метод на Java, который проверяет, что некоторые условия выполняются для некоторых данных, и подтверждает, что данные действительны или , в противном случае выдает соответствующее сообщение об ошибке.
Проблема в том, что мы не можем вернуть более одной вещи из метода, поэтому мне интересно, каково лучшее решение (с точки зрения читабельности и удобства обслуживания).
Первое решение. Просто, но мы не можем знать, что именно провалило проверку:
boolean verifyLimits1(Set<Integer> values, int maxValue) {
for (Integer value : values) {
if (value > maxValue) {
return false; // Out of limits
}
}
return true; // All values are OK
}
Второе решение. У нас есть сообщение, но мы используем исключения так, как не должны (кроме того, это, вероятно, должно быть проверенное исключение для конкретного домена, слишком много накладных расходов IMO):
void verifyLimits2(Set<Integer> values, int maxValue) {
for (Integer value : values) {
if (value > maxValue) {
throw new IllegalArgumentException("The value " + value + " exceeds the maximum value");
}
}
}
Третье решение. У нас есть подробное сообщение, но контракт не является чистым: мы заставляем клиента проверять, пуста ли строка (для чего ему нужно прочитать javadoc).
String verifyLimits3(Set<Integer> values, int maxValue) {
StringBuilder builder = new StringBuilder();
for (Integer value : values) {
if (value > maxValue) {
builder.append("The value " + value + " exceeds the maximum value/n");
}
}
return builder.toString();
}
Какое решение вы бы порекомендовали? Или есть лучший (надеюсь!)?
(Примечание: я создал этот небольшой пример, мой реальный пример использования касается сложных условий на разнородных данных, поэтому не сосредотачивайтесь на этом конкретном примере и предлагайте Collections.max(values) > maxValue ? "Out of range." : "All fine."
: -).)