Załóżmy, że mamy metodę, foo(String bar)
która działa tylko na ciągach, które spełniają określone kryteria; na przykład musi być małymi literami, nie może być pusty lub mieć tylko białe znaki i musi pasować do wzorca [a-z0-9-_./@]+
. Dokumentacja metody podaje te kryteria.
Czy metoda powinna odrzucić wszelkie odchylenia od tych kryteriów, czy też powinna bardziej wybaczać niektóre kryteria? Na przykład, jeśli początkową metodą jest
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;
}
A drugą metodą wybaczania jest
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;
}
Czy dokumentacja powinna zostać zmieniona, aby oświadczyć, że zostanie przekształcona i ustawiona na przekształconą wartość, jeśli to możliwe, czy też metoda powinna być tak prosta, jak to możliwe i odrzucać wszelkie odchylenia? W takim przypadku bar
może zostać ustawiony przez użytkownika aplikacji.
Podstawowym przypadkiem użycia tego są użytkownicy uzyskujący dostęp do obiektów z repozytorium za pomocą określonego identyfikatora ciągu. Każdy obiekt w repozytorium powinien mieć unikalny ciąg identyfikujący go. Te repozytoria mogą przechowywać obiekty na różne sposoby (serwer sql, json, xml, binarny itp.), Więc próbowałem zidentyfikować najniższy wspólny mianownik, który pasowałby do większości konwencji nazewnictwa.
foo
funkcję, która jest rygorystyczna pod względem akceptowanych argumentów, i mieć drugą funkcję pomocniczą, która może próbować „wyczyścić” argument, z którego chcesz skorzystać foo
. W ten sposób każda metoda ma mniej do zrobienia sama, a ich zarządzanie i integracja są czystsze. Idąc tą drogą, prawdopodobnie pomocne byłoby również odejście od projektu ciężkiego od wyjątków; możesz użyć czegoś takiego jak Optional
zamiast, a następnie mieć funkcje, które zużywają foo
wyjątki rzucania, jeśli to konieczne.