Как я могу уменьшить цикломатическую сложность, чтобы улучшить качество кода?

Всякий раз, когда я пишу фрагмент кода, над которым я работаю, цикломатическая сложность этой функции слишком велика, т.е. (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);
}

Я хотел бы услышать несколько советов о том, как я мог бы структурировать свой код таким образом, чтобы избежать подобных ситуаций.

0 ответов

Другие вопросы по тегам