Предположим, у нас есть метод, foo(String bar)
который работает только со строками, которые соответствуют определенным критериям; например, он должен быть в нижнем регистре, не должен быть пустым или иметь только пробел и должен соответствовать шаблону [a-z0-9-_./@]+
. Документация для метода устанавливает эти критерии.
Должен ли метод отклонять какие-либо отклонения от этого критерия или метод должен быть более щадящим по некоторым критериям? Например, если начальный метод
public void foo(String bar) {
if (bar == null) {
throw new IllegalArgumentException("bar must not be null");
}
if (!bar.matches(BAR_PATTERN_STRING)) {
throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING);
}
this.bar = bar;
}
И второй способ прощения
public void foo(String bar) {
if (bar == null) {
throw new IllegalArgumentException("bar must not be null");
}
if (!bar.matches(BAR_PATTERN_STRING)) {
bar = bar.toLowerCase().trim().replaceAll(" ", "_");
if (!bar.matches(BAR_PATTERN_STRING) {
throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING);
}
}
this.bar = bar;
}
Следует ли изменить документацию, указав, что она будет преобразована и по возможности установлена на преобразованное значение, или метод должен быть максимально простым и отклонять любые отклонения? В этом случае bar
может быть установлено пользователем приложения.
Основным вариантом использования для этого будут пользователи, которые обращаются к объектам из хранилища по определенному строковому идентификатору. Каждый объект в хранилище должен иметь уникальную строку для его идентификации. Эти репозитории могут хранить объекты различными способами (sql server, json, xml, binary и т. Д.), Поэтому я попытался определить наименьший общий знаменатель, который соответствовал бы большинству соглашений об именах.
foo
функцию, которая строго соответствует аргументам, которые она принимает, и иметь вторую вспомогательную функцию, которая может попытаться «очистить» аргумент, который будет использоваться foo
. Таким образом, у каждого метода меньше работы, и они могут более четко управляться и интегрироваться. Если идти по этому пути, вероятно, было бы также полезно отойти от тяжелого дизайна; Optional
вместо этого вы можете использовать что-то подобное , а затем иметь функции, которые потребляют foo
исключения исключений, если это необходимо.