Programming Tips: Implied Booleans and the Ternary Operator
Tue Dec 11 08:40:52 EST 2012
This isn't Domino- or XPages-specific per se, but I figured I'd make a post about some of my favorite stylistic bits in many programming languages: implied boolean values and the ternary operator, which are distinct but often used together.
What I mean by "implied boolean values" is when a language lets you use things that aren't strictly comparisons or boolean values in if/then tests. The best example for this is probably C (and no doubt the languages that came before it): for a long time, C didn't actually have a boolean data type. Instead, the convention was to use 1 for "true" and 0 for "false" - and many libraries would map constants to those values. That's well enough on its own, but the fun part was that the real rule behind it is that C treats ANY non-zero numeric value as true. Most of the time, that doesn't matter too much, but there are occasions where you can take advantage of that property to save a bit of code without sacrificing readability.
Many languages, such as JavaScript, continue this tradition, and also allow for implied null checking this way (I can't be bothered to look into C's deal with nulls). To demonstrate:
var foo = null if(foo) { alert("foo") } else { alert("not foo") } if(!foo) { alert("not foo") } else { alert("foo") }
That code will display "not foo" twice. JavaScript acts the same way for "undefined" values, such as uninitialized object properties:
var foo = { bar: 1 } if(foo.bar) { alert("yep") } else { alert("nope") } if(foo.baz) { alert("yep") } else { alert("nope") }
That will display "yep" followed by "nope". This can be handy if you want to test for, say, the presence of an attribute value in an HTML entity (it also treats "" as false).
Though JavaScript and, by extension, SSJS support thing kind of thing, Java is stricter about this kind of thing, forcing you to specifically test for null.
That brings me to the ternary operator, which is one of my favorite things in the world. If you're not familiar with it, the ternary operator is a shorthand way to do an if/then test that results in a value. As a demonstration:
var result = a > b ? option1 : option2
While you can get the same job done with a normal if/then/else block, that operator saves you some typing and, more importantly, often makes it easier to understand your intent. They can even be chained together, though you should be careful not to create too much of a mess:
var result = a == 1 ? option1 : a == 2 ? option2 : a == 3 ? option3 : option4
In this case, Java DOES support the operator in pretty much the same way as every other non-PHP language (including Formula - @If(...) is basically this in different garb). EL in XPages supports this too, but only in ${}-bound values (due to Designer complaining about "invalid" syntax in #{}-bound values... presumably, you could write your own value bindings programmatically).
I use this kind of thing all the time. One pretty common use is to provide default values, either by checking the current state of a variable and re-assigning it as necessary or looking in, say, an options for overrides:
title = title ? title : "default title" someVal = options.someVal ? options.someVal : "default someVal"
If you want to be EXTRA slick, you can take advantage of an extra property of JavaScript's "or" operator:
title = title || "default title"
That basically means "use the value of title unless it's null/false/0, in which case use 'default title'".
Hopefully, you can put some of these tricks to good use. Used properly, this kind of thing can drastically simplify your code while making it much easier to read and understand.