How AI is applied across API Evangelist and APIs.io. Read my AI disclosure →
API Evangelist API Evangelist
Discovery
Learnings
Guidance
Toolbox
Alignment
API Evangelist LLC

Keep Function Parameters Tidy

calendar_today May 19, 2013 person domain json

We’ve all been there before: You finished putting together an awesome class or function whose behavior can be configured down to the smallest degree, and now to wire up all the different configuration values: function jsonapi ( url , data , pre_execute_hook , success_hook , failure_hook , error_hook , post_execute_hook , async , method , jsonp ) { … } What a mess. Can you imagine trying to call that monstrosity? jsonapi ( ‘http://www.example.com/rest/doSomethingAwesome’ , { “subscribe” : [ “peter” , “henrietta” , “xavier” ]}, null , mySuccessHandler , myFailureHandler , myErrorHandler , null , null , null , true ); At least you have some job security — nobody is going to want to maintain that thing! However, there’s a better way to organize your function parameters using JSON: function jsonapi ( options ) { // Merge options with default values. options = $ . extend ( { // Standard Options ‘url’ : ‘’ , // Hooks ‘pre_execute’ : null , ‘success’ : null , ‘failure’ : null , ‘error’ : null , ‘post_execute’ : null , // Advanced Options ‘async’ : true , ‘method’ : ‘post’ , ‘jsonp’ : null , ‘data’ : null }, ( options || {}) ); } Note that we are using the extend() function from the jQuery library to merge values in the options parameter. When you are invoking the function, pass a JSON-encoded object as the value of the options parameter: jsonapi ({ “url” : ‘http://www.example.com/rest/doSomethingAwesome’ , “data” : { “subscribe” : [ “peter” , “henrietta” , “xavier” ]}, “success” : mySuccessHandler , “failure” : myFailureHandler , “error” : myErrorHandler , “jsonp” : true }); You might have noticed several advantages to this method: The values you are passing at invocation time are self-documenting — even without looking at the function signature, you can tell which option each value corresponds to. You can omit any options that should use the default value — in the above example, the we did not have to pass a null value to the pre_execute, post_execute, method and async options; the function automatically uses default values if they are omitted from the JSON object passed to it. Individual options can be documented in the function body itself. p One thing to be careful about though, is that the different options are no longer part of the function’s signature, so IDE tooltips and auto-completion won’t work. Make sure you document well your functions and the options they expect if you are using this technique!

open_in_new Read original post