Refactoring in JavaScript: het guard clause-pattern

Refactoring in JavaScript: het guard clause-pattern

Deze korte refactoringtutorial laat zien hoe je guard clauses schrijft voor je if-statements, in plaats van geneste if .. else-logica. Dat levert schone code op die makkelijk te lezen is. Het voorbeeld is in JavaScript, maar dezelfde manier van programmeren werkt in elke taal: PHP, Java, enzovoort.

Wat is een guard clause?

Het guard clause-pattern is simpelweg een techniek om vroeg in een methode te testen, bijvoorbeeld in een constructor. Heeft een methode (of een object) bepaalde waarden nodig om goed te werken, en hoort de applicatie die code nooit met ongeldige invoer aan te roepen, dan gooit de guard clause een exception zodra een waarde niet aan een van de opeenvolgende voorwaarden voldoet. Zo voorkom je onder meer dat je tijdens de uitvoering van een methode de ene if-else in de andere nest.

JavaScript-voorbeeld van de guard clause-techniek

Stel dat je een methode moet schrijven die een datum formatteert op basis van haar waarde: dat kan een timestamp zijn, een Date-object of een string, en voldoet ze aan geen van die drie, dan is het een fout. De verleiding is groot om een reeks geneste if else if else if else te schrijven. 

Zonder 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();
}

Met 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);
}

Je ziet meteen dat de code met guard clauses veel leesbaarder is, wat het lezen en het onderhoud makkelijker maakt, voor jezelf en voor je collega’s.

Conclusie

Guard clauses en validatietests doen allebei aan invoervalidatie. Het verschil zit in de vraag of de ongeldige invoer verwacht wordt en bij de applicatie hoort, of dat ze onverwacht is. Gebruik exceptions alleen voor de onverwachte gevallen, en gebruik gewone validatielogica voor de problemen die je in de binnenkomende data verwacht.

JavaScriptPHP

Damien Flandrin Webdeveloper sinds 2010, maker van Gekkode en Email Impact. Elk artikel wordt vóór publicatie getest op een echt project. Contact
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.