Guard clauses w JavaScripcie: refactoring zagnieżdżonych if

Guard clauses w JavaScripcie: refactoring zagnieżdżonych if

Ten krótki poradnik o refactoringu pokazuje, jak pisać guard clauses, czyli klauzule strażnicze, dla swoich instrukcji if, zamiast zagnieżdżać logikę warunkową if … else. To jeden z najszybszych sposobów na czysty i czytelny kod. Przykład jest w JavaScripcie, ale ten sam styl działa w każdym języku, w PHP, w Javie i w pozostałych.

Czym jest guard clause?

Wzorzec guard clauses to po prostu sposób na szybkie sprawdzenia na wejściu metody, na przykład w konstruktorze. Kiedy metoda (albo instancja obiektu) potrzebuje określonych wartości, żeby działać poprawnie, a aplikacja nigdy nie powinna wołać tego kodu z niepoprawnymi danymi, guard clause rzuca wyjątek, gdy tylko wartość nie przejdzie kolejnego warunku. Technika pozwala między innymi uniknąć piętrzenia zagnieżdżonych bloków if … else na ścieżce wykonania metody.

Przykład techniki guard clauses w JavaScripcie

Wyobraź sobie, że masz napisać metodę formatującą datę zależnie od jej wartości: może to być timestamp, obiekt Date albo ciąg znaków, a wszystko inne jest błędem. Kusi wtedy, żeby napisać łańcuch zagnieżdżonych if / else if / else. 

Bez guard clauses

javascript
function getDate(date) {
  let result;
  if (!isEmpty(date)) {
       if (isTimestamp(date)) {
          result = formatWithTimestamp(date);
       else if (isDateObject(date))
          result = formatWithObject(date);
       else if (isString(date))
          result = formatWithString(date);
       else
          throw new DateFormatException(date);
      }
      return result;
  }
  return emptyDateError();
}

Z guard clauses

javascript
function formatDate(date) {
  if (isEmpty($date)) return emptyDateError();
  if (isTimestamp(date)) return formatWithTimestamp(date);
  if (isDateObject(date)) return formatWithObject(date);
  if (isString(date)) return formatWithString(date);
  throw new DateFormatException(date);
}

Różnicę widać od razu: z guard clauses kod czyta się dużo łatwiej, a utrzymanie go, przez ciebie albo przez kolegów z zespołu, staje się prostsze.

Podsumowanie

Guard clauses i testy walidacyjne robią to samo: sprawdzają dane wejściowe. Różnica sprowadza się do tego, czy niepoprawne dane są spodziewane i wpisane w działanie aplikacji, czy naprawdę niespodziewane. Wyjątków używaj wyłącznie do przypadków niespodziewanych, a zwykłą logikę walidacji do problemów, o których już wiesz, że mogą wystąpić w danych wejściowych.

JavaScriptPHP

Damien Flandrin Web developer od 2010 roku, twórca Gekkode i Email Impact. Każdy artykuł jest sprawdzany na prawdziwym projekcie przed publikacją. Kontakt
Newsletter

Nowe testy, poradniki i projekty — e-mailem.

Powtarzalne testy, wersjonowany kod, datowane wyniki. Nigdy spamu.