javascript-复杂度大于AngularJS Controller中授权的复杂度(SonarLint问题)

我将SonarLint与Eclipse结合使用,并且正在使用AngularJS编写应用程序.我的控制器有问题,因此我尝试对其进行清洁以使其更清晰,然后SonarLint弹出一个问题:

Function has a complexity of 11 which is greater than 10 authorized.

这是我的控制器的代码:

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,是吗? ?).我仔细检查了括号/括号,我认为问题不出在这里.

解决方法:

如果您想消除复杂性,可以执行以下一项功能:

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

首先,它似乎需要更多的代码和更多的复杂性给您的应用程序,但是如果您需要在其他页面或组件/指令中停止生成器,则只需注入您的“ generator”服务并执行generator.stop() ;这样一来,如果有一天您的端点URL发生更改,则只需在服务中进行更改.

上一篇:【Android】8.0 Intent向下一个活动传递数据、返回数据给上一个活动


下一篇:Centos6.9安装SonarQube7.6