复杂性大于AngularJS控制器中的授权(SonarLint问题)

时间:2016-08-03 10:30:40

标签: javascript angularjs sonarqube complexity-theory

我将 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 个答案:

答案 0 :(得分:3)

如果您想要消除复杂性,您可以创建一个功能:

    $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.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();
});

首先,它似乎会为您的应用程序带来更多代码和更多复杂性,但如果您需要在其他页面或组件/指令中停止生成器,则只需注入“生成器”服务并执行{{通过这样做,如果有一天您的端点网址发生了变化,您只需在服务中更改它们。

答案 1 :(得分:2)

  

它有什么问题吗?

您正在寻找主观问题的客观答案。让我们说一个函数越复杂,你(或其他人)就越难以维护它。这个问题告诉您,您已经达到了代码可能难以理解的任意点。

  

它不是复杂性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();
});