Сложность выше разрешенной в контроллере AngularJS (проблема SonarLint)


Я использую SonarLint с Eclipse, и я кодирую приложение с помощью AngularJS. У меня была проблема с контроллером, поэтому я пытался очистить его немного, чтобы видеть яснее, а затем SonarLint выскочил мне вопрос:

Функция имеет сложность 11, которая больше разрешенной 10.

А вот код моего контроллера:

app.controller('LauncherCtrl', function ($scope, $http) {

    $scope.genStatus = "stopped";

    $scope.startgenerator = function() {
        $http.get('/start').success(function () {
            $scope.updateStatus();
        });
    };

    $scope.resumegenerator = function() {
        $http.get('/resume').success(function () {
            $scope.updateStatus();
        });
    };

    $scope.suspendgenerator = function() {
        $http.get('/suspend').success(function () {
            $scope.updateStatus();
        });
    };

    $scope.stopgenerator = function() {
        $http.get('/stop').success(function () {
            $scope.updateStatus();
        });
    };

    $scope.updateStatus = function() {              
        $http.get('/status').success(function (response) {
              $scope.genStatus = response.data;
        });
    };

    $scope.updateStatus();
});

С ним что-то не так ? Я предполагаю, что этот вопрос будет слишком много вложен циклы/функции, но насколько я могу видеть, это не так (кроме функций start / stop / resume/pause, которые вызывают обновление, но это не сложность 11, не так ли ?). + Я дважды проверил скобки / скобки, я не думаю, что проблема исходит оттуда.

2 2

2 ответа:

Если вы хотите удалить сложность, вы можете сделать одну функцию:

    $scope.startgenerator = function() {
        $http.get('/start').success(function () {
            $scope.updateStatus();
        });
    };

    $scope.resumegenerator = function() {
        $http.get('/resume').success(function () {
            $scope.updateStatus();
        });
    };

    $scope.suspendgenerator = function() {
        $http.get('/suspend').success(function () {
            $scope.updateStatus();
        });
    };

    $scope.stopgenerator = function() {
        $http.get('/stop').success(function () {
            $scope.updateStatus();
        });
    };

To

$scope.generatorAction = function(action) {
    $http.get('/' + action).success(function () {
        $scope.updateStatus();
    });
};

А затем использовать его следующим образом:

$scope.generatorAction('stop');

Или используйте службу, которая обрабатывает ваш http-запрос, это лучшая практика.

Правка:

Я использую этот стиль для моих угловых приложений: https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md

Создание простого сервиса для вашего http запроса:

(function() {
  'use strict';

  angular
    .module('yourModuleName')
    .factory('generator', generatorFactory);

  function generatorFactory($http) {

     var service = {
        start: start,
        resume: resume,
        suspend: suspend,
        stop: stop
     }

     return service;

     function start() {
        return $http.get('/start');
     }

     function resume() {
        return $http.get('/start');
     }

     function suspend() {
        return $http.get('/suspend');
     }

     function stop() {
        return $http.get('/stop');
     }
  }

})();

А затем в вашем контроллер:

app.controller('LauncherCtrl', function ($scope, generator, $http) {

    $scope.genStatus = "stopped";

    $scope.startgenerator = function() {
        generator.start().then(function () {
            $scope.updateStatus();
        });
    };

    $scope.resumegenerator = function() {
        generator.resume().then(function () {
            $scope.updateStatus();
        });
    };

    $scope.suspendgenerator = function() {
        generator.suspend().then(function () {
            $scope.updateStatus();
        });
    };

    $scope.stopgenerator = function() {
        generator.stop().then(function () {
            $scope.updateStatus();
        });
    };

    $scope.updateStatus = function() {              
        $http.get('/status').success(function (response) {
              $scope.genStatus = response.data;
        });
    };

    $scope.updateStatus();
});
Сначала кажется, что требуется больше кода и больше сложности для вашего приложения, но если вам нужно остановить генератор на другой странице или в компоненте/директиве, вам просто нужно ввести свой сервис "генератор" и сделать generator.stop();, и, сделав это, если однажды Ваш url конечной точки изменится, вам нужно будет только изменить их в вашем сервисе.

С ним что-то не так?

Вы ищете объективный ответ на субъективный вопрос. Предположим, что чем сложнее становится функция, тем больше вы (или кто-то другой) будете бороться за ее сохранение. Эта проблема говорит вам, что вы достигли произвольной точки, где код может быть трудно понять.

Это не сложность 11, не так ли?

Способ подсчета сложности SonarQube не совсем соответствует ни одному из в настоящее время сформулированы стандарты, но вот как он получил число 11:

app.controller('LauncherCtrl', function ($scope, $http) {  // +1

    $scope.genStatus = "stopped";

    $scope.startgenerator = function() {                   // +1
        $http.get('/start').success(function () {          // +1
            $scope.updateStatus();
        });
    };

    $scope.resumegenerator = function() {                 // +1
        $http.get('/resume').success(function () {        // +1
            $scope.updateStatus();
        });
    };

    $scope.suspendgenerator = function() {                // +1
        $http.get('/suspend').success(function () {       // +1
            $scope.updateStatus();
        });
    };

    $scope.stopgenerator = function() {                   // +1
        $http.get('/stop').success(function () {          // +1
            $scope.updateStatus();
        });
    };

    $scope.updateStatus = function() {                    // +1
        $http.get('/status').success(function (response) {// +1
              $scope.genStatus = response.data;
        });
    };

    $scope.updateStatus();
});