Как я могу уменьшить цикломатическую сложность, чтобы улучшить качество кода?
Всякий раз, когда я пишу фрагмент кода, над которым я работаю, цикломатическая сложность этой функции слишком велика, т.е. (12). Но я немного озадачен тем, как я могу переписать его таким образом, чтобы он работал.
Это функция, которая продолжает выдавать это сообщение:
function(options, callback) {
if(typeof options === 'function') { // A callback has been provided as 2nd
// argument (no options)
callback = options;
options = {};
} else if(callback === undefined) { // No callback has been provided, even
// as 2nd argument
throw new Error('[LOKLAK-FETCHER] No callback provided');
}
var settings = [ 'count', 'source', 'fields', 'limit', 'tzOffset',
'minified' ]; // Field names for all the possible parameters
var defaults = [ 100, 'cache', '', '', 0, true ]; // Default values
// Check if no options have been provided
if(typeof options === 'undefined') {
options = {}; // Create 'options' to avoid ReferenceErrors later
}
//Check if there are any data elements set
var tweetsEl = document.getElementById("tweets");
var dataset = tweetsEl.dataset;
if(dataset.count) {
options[settings[0]] = dataset.count; //count is index 0
}
var query;
if(dataset.query) {
query = dataset.query.replace(/\s/gi, '%20').replace(/#/gi, '%23').replace('_',"");
//replace spaces and hashtags in URL
} else {
//query = "fossasia";
}
if(dataset.start) {
query = query + "&since:" + dataset.start;
}
if(dataset.end) {
query = query + "&until:" + dataset.end;
}
if(dataset.from) {
query = "from:" + dataset.from;
}
// Write unset options as their default
for(var index in settings) {
if(options[settings[index]] === undefined) {
options[settings[index]] = defaults[index];
}
}
// Create the URL with all the parameters
var url = 'https://api.loklak.org/api/search.json' +
'?callback=loklakFetcher.handleData' +
'&q=' + query +
'&count=' + options.count +
'&source=' + options.source +
'&fields=' + options.fields +
'&limit=' + options.limit +
'&timezoneOffset=' + options.tzOffset +
'&minified=' + options.minified ;
// If the script element for JSONP already exists, remove it
if(script !== null) {
document.head.removeChild(script);
}
/**
* Invokes the callback function, passing the data from the server as the
* first and only argument.
* @param {object} data JSON coming from loklak's API
*/
this.handleData = function(data) {
callback(data);
};
// Create the script tag for JSONP
script = document.createElement("script");
script.src = url;
document.head.appendChild(script);
}
Я хотел бы услышать несколько советов о том, как я мог бы структурировать свой код таким образом, чтобы избежать подобных ситуаций.