
The other day, I was working with the Flex function BindingUtil.bindProperty(). I always have a hard time remembering which pair of arguments comes first, the ‘site’ or the ‘host’ and to be honest, the names don’t really make much sense to me. “Oh, if only this were an Objective-C project I would have to laboriously type out each name of each parameter.” I thought, “It would be so much more obvious if it were writen like Bind.property("foo").fromObject(bar).toTheValueOfProperty("foo").ofObject(baz);.”
What followed was the discovery/invention of just such a thing, a nested, super-verbose function. The function achieves this by returning an instance of an internal class with nothing in it except for the next step in the chain.
package
{
public class Bind
{
public static function updateProperty(object:Object, property:String):BindSource {
return new BindSource(object, property);
}
}
}
import mx.binding.utils.BindingUtils;
class BindSource {
private var targetObject:Object;
private var targetProperty:String;
public function BindSource(targetObject:Object, targetProperty:String):void {
this.targetObject = targetObject;
this.targetProperty = targetProperty;
}
public function whenSourcePropertyChanges(object:Object, property:String):void {
BindingUtils.bindProperty(targetObject, targetProperty, object, property);
}
}
To call this function you would use:
Bind.updateProperty(foo, "bar").whenSourcePropertyChanges(baz, "bar");
Kinda cool! I soon realized that this technique has some characteristics that Objective-C messages don’t have. For example, each step can use more than one parameter (plus they each get their own code hinting). You can also provide multiple choices for what to do next providing a sort of branching behavior.
AngleFinder.getAngleOfVector(4, 4).inDegrees() // 45°
AngleFinder.getAngleOfVector(4, 4).inRadians() // π/4
You can even do free-form stacking of functions like this.
new Calculator (5) // 5
.plus(3) // 8
.times(2) // 16
.dividedBy(4) // 4
.minus(1) // 3
.plus(2) // 5
.equals();
I proudly named these “Matryoshka Functions” after the Russian stacking dolls even though I’m sure I’m not the first to try something like this. As it turns out, they’re about 10% practical and 90% clever hack. Even though there could be some potential use for this (especially with complicated, repetitive tasks), this technique conflicts too much with the way we normally code in ActionScript. Still, I thought it was cool enough to share with everyone.
Pros:
- Very descriptive
- Branching and stacking effect is interesting and potentially useful
- Code hinting shows the next step in the function as well as the parameter names
- Looks cool!
Cons:
- Abominable code style. Too weird to be useful.
- Difficult to know when to stop calling functions
- Not completing the function will produce unexpected results with no compile-time errors
- Each step requires you to pass the parameters from the previous step
Can you find any use of these? Can you think of a more efficient way to write the functions? Any other thoughts?
Check out the source with multiple examples (FlashBuilder project).
MatroshkaFunctionDemo