Lesbarer Quellcode – Heute: Wie validiere ich Methodenparameter?
Fast alle Softwareentwickler sind sich einig, dass Quellcode lesbar sein soll und für andere Entwickler möglichst lesbar sein soll.
Was allerdings als lesbar und leicht verständlich ist, ist nicht immer so eindeutig. Neben den vereinbarten Styleguides und den eigenen Vorlieben gibt es dann noch andere Kriterien.
Ein Beispiel ist die Validierung von Parametern. Viele generische Bibliotheken beinhalten entsprechende Funktionen. Von den von mir benutzten Bibliotheken dürften zwei der bekanntesten Google Guava und die schon zu den Altmeistern gehörende apache-commons Bibliothek sein. Beide beinhalten Methoden zur Validierung von Parametern. Bei Google handelt es sich um die Klasse Preconditions mit den checkArgument()-Funktionen, bei Apache Commons sind es die Methoden der Klasse Validate (für Java bis 1.4) bzw. Validate (für Java 5+). Egal für welche Variante man sich entscheidet, beide Methoden werfen eine IllegalArgumentException.
Jetzt habe ich ein Projekt, in dem beide Klassen (Guava und apache-commons) genutzt werden. Ob das sinnvoll ist, zwei sich soweit überdeckende allgemeine Bibliotheken zu nutzen, wäre einen eigenen Blogpost wert, daher will ich hier nicht weiter darauf eingehen. Allerdings stellt sich dann die Frage, ob man jetzt zu den Precondition-Klassen oder die Validate-Klassen bei der Argumentvalidierung greift:
package de.kaiserpfalzEdv.blog.style; import static com.google.common.base.Preconditions.checkArgument; public class ValidationStyle { public void checkWithPrecondition(String argument) { checkArgument(argument != null && !argument.isEmpty(), "You have to give a not-null and not-empty argument!"); ... } ... }
package de.kaiserpfalzEdv.blog.style; import org.apache.commons.lang3.Validate.notEmpty; public class ValidationStyle { public void checkWithValidate(String argument) { notEmpty(argument, "You have to give a not-null and not-empty argument!"); ... } ... }
Auf den ersten Blick sieht die apache-commons-Variante unten eleganter aus. Das ist sie auch, da die Google-Variante immer einen kompletten boolschen Ausdruck erfordert. Allerdings kann man – wenn man sowieso schon Guava und apache-commons eingebunden hat, auch zu einer dritten Variante greifen:
package de.kaiserpfalzEdv.blog.style; import static com.google.common.base.Preconditions.checkArgument; import static org.apache.commons.lang3.StringUtils.isNotEmpty; public class ValidationStyle { public void checkWithPreconditionAndStringUtils(String argument) { checkArgument(isNotEmpty(argument), "You have to give a not-null and not-empty argument!"); ... } ... }
In dieser Variante kann mn sofort erkennen, dass ein Argument überprüft wird („checkArgument“) und was denn geprüft wird („isNotEmpty“). Im Moment ist diese Variante meine Lieblingsvariante. Aber ich bin für Anregungen offen. Die letzte Variante will ich nur noch der Vollständigkeit halber darstellen: alles selbst machen …
package de.kaiserpfalzEdv.blog.style; import java.langIllegalArgumentException; public class ValidationStyle { public void checkWithPreconditionAndStringUtils(String argument) { if (argument == null || argument.isEmpty) { throw new IllegalArgumentException("You have to give a not-null and not-empty argument!"); } ... } ... }