I'm similarly embarrassed to say that before reading this thread, I wasn't familiar with the use of "bikeshedding" as a gloss on Parkinson's Law of Triviality. But while I really like the formulation, I'm concerned about the way it can be used as rhetorical device to dismiss valid concerns about the semantics of an API.
I suppose I'm in the Sarah Allen camp on this: language shapes thought. I think the name "exports", which begat "module" was a wrong turn. To me, it makes more sense for the other side of the "require" API to be a corresponding function.
I like "publish" for this. I propose this kind of implementation (minus locking)
var runModule = ...//implementation dependent var bindings = {}; var require = function(moduleName){ //circular dependency check if (bindings[moduleName] == UNPUBLISHED) throw ...; //Run script if no binding for module if (bindings[moduleName] === void 0){ bindings[moduleName] = UNPUBLISHED; try { var moduleScope = { require : require, publish: function(value){ //error to publish twice in same module if (bindings[moduleName] != UNPUBLISHED) throw ...; bindings[moduleName] = value; } } runModule(moduleName, moduleScope); } finally{ if (bindings[moduleName] == UNPUBLISHED) { //OK, module didn't publish anything. //It will run again. delete bindings[moduleName]; } } } return bindings[moduleName]; }
I guess I'm also psyched about the new bike shed, but I do care what color it is.
No comments:
Post a Comment