Припустимо, у нас є метод, 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-сервер, json, xml, бінарний тощо), тому я спробував визначити найнижчий загальний знаменник, який би відповідав більшості імен імен.
foo
функцію, яка є чіткою в аргументах, яку вона приймає, і мати другу допоміжну функцію, яка може спробувати "очистити" аргумент, з якого слід використовувати foo
. Таким чином, кожен метод має менше робити самостійно, і ними можна керувати та інтегруватись більш чисто. Якщо спускатися цим маршрутом, можливо, також було б корисно відійти від важкої конструкції для винятку; ви можете використовувати щось на зразок Optional
, а потім мати функції, які споживають foo
викидання виключень, якщо це необхідно.