Как мне провести рефакторинг этого вложенного оператора IF? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть эта функция, которая имеет более 3 вложенных операторов if (4 вложенных If в функции). Я пытаюсь решить проблему с гидролокатором, где написано refactor this code to not nest more than 3 IF/FOR/WHILE/TRY statements. Я искал вокруг, но не смог найти ничего слишком полезного, можно ли уменьшить? - если так, как бы я поступил так? Любые отзывы приветствуются

Вот функция

function redirectNonSupportedUsers(country) {

    var countryCode = getCodeByCountry(country);

    if (typeof countryCode !== 'undefined' && !isCountrySupported(countryCode)) ---> Nesting 1{

        var redirectURL = $('.menu-select-country li[data-country="' + countryCode + '"] a').attr('href');
        var newQuery = '';

        if (redirectURL) {    ---->Nesting 2

            var pageQuery = '';

            var redirectQuery = '';
            if (window.location.search) {

                pageQuery = window.location.search.substr(1).split('&');

            }
            if (redirectURL.indexOf('?') > -1) {    ---->Nesting 3

                var redirectSplit = redirectURL.split('?');

                redirectURL = redirectSplit[0];

                if (typeof redirectSplit[1] !== 'undefined') { ---->Nesting 4

                    redirectQuery = redirectSplit[1].split('&');

                }
            }
            var mergedQueries = com.trp.fai.utility.mergeStringArrays(redirectQuery, pageQuery);

            if (typeof mergedQueries !== 'undefined' && mergedQueries.length > 0) {

                newQuery = '?' + mergedQueries.join('&');

            }
        } else {

            redirectURL = 'http://.com';

            newQuery = '?src=' + countryCode;

        }
        changeCountryCookie(countryCode);
        window.location.replace(redirectURL + newQuery);

    } else if (typeof countryCode === 'undefined') {
        noCountryInformation();

    } else {
        handleCountry();

    }
}
return {

    getGeoLocation: function(country) {

      checkCountryCookie(country);

      handleCountry();

    },

    changeCountryCookie: function(country) {

      changeCountryCookie(country);

    },

    getGeoLocationV2: function() {

      var theSrc = $.url().param('src');

      var countryCookie = $.cookie('trp-country');

      if (typeof theSrc !== 'undefined') {

        var countryCheckTheSrc = getCountryByCode(theSrc.toUpperCase());

      }
      if (typeof theSrc !== 'undefined' && typeof countryCheckTheSrc !== 'undefined') {

        if (countryCookie !== countryCheckTheSrc) {

          $.cookie('trp-country', countryCheckTheSrc, { domain: cookieDomain, path: '/', expires: 365 });

        }
        checkCountryCookie(countryCheckTheSrc);

      } else {
        if (typeof countryCookie !== 'undefined') {

          checkCountryCookie(countryCookie);
        } else {

          getCountry();

        }}}};

})(jQuery);

1 Ответ

1 голос
/ 17 октября 2019

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

Но одна вещь, которую вы, вероятно, могли бы сделать, это разложить эту функцию еще раз и начать использовать возвращаемые значения. Например, отделите этот фрагмент кода и верните redirectURL в вашей новой функции.

if (redirectURL) {    ---->Nesting 2

            var pageQuery = '';

            var redirectQuery = '';
            if (window.location.search) {

                pageQuery = window.location.search.substr(1).split('&');

            }
            if (redirectURL.indexOf('?') > -1) {    ---->Nesting 3

                var redirectSplit = redirectURL.split('?');

                redirectURL = redirectSplit[0];


                if (typeof redirectSplit[1] !== 'undefined') { ---->Nesting 4

                    redirectQuery = redirectSplit[1].split('&');

                }
            }
            var mergedQueries = com.trp.fai.utility.mergeStringArrays(redirectQuery, pageQuery);



            if (typeof mergedQueries !== 'undefined' && mergedQueries.length > 0) {

                newQuery = '?' + mergedQueries.join('&');

            }
        } else {

            redirectURL = 'http://corporate.troweprice.com';

            newQuery = '?src=' + countryCode;

        }

Если вам нужно вернуть несколько элементов, вы можете либо использовать глобальные переменные, либо вернуть объект и деструктурировать его вдругая сторона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...