复杂性大于 AngularJS 控制器中的授权(SonarLint 问题) [英] Complexity greater than authorized in AngularJS Controller (SonarLint issue)

查看:33
本文介绍了复杂性大于 AngularJS 控制器中的授权(SonarLint 问题)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将 SonarLintEclipse 一起使用,并且我正在使用 AngularJS 编写应用程序.我的控制器有问题,所以我试图清理一下以使其更清晰,然后 SonarLint 弹出了一个问题:

I use SonarLint with Eclipse, and I'm codding an application using AngularJS. I had a problem with a controller so I was trying to clean it a bit to see clearer, and then SonarLint popped me up an issue :

函数的复杂度为 11,大于授权的 10.

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

这是我的控制器的代码:

And here's the code of my controller :

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

Is there something wrong with it ? I assume this issue would be about too much nested loops/functions, but as far as I can see it's not (apart from the functions start/stop/resume/pause which are calling update, but it isn't complexity 11, is it ?). + I double checked the brackets/parenthesis, I don't think the problem comes from there.

推荐答案

如果你想消除复杂性,你可以做一个函数:

If you want to remove complexity you can make one function :

    $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请求的服务,这是一个更好的做法.

Or use a service that handle your http request, It's a better practice.

我在我的 Angular 应用程序中使用这个样式指南:https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md

I'm using this styleguide for my angular applications : https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md

为您的 http 请求创建一个简单的服务:

Creating a simple service for your http request :

(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 改变了,你只需要在你的服务中改变它们.

First it seems to take more code and more complexity to your app, but if you need to stop your generator in an other page or in a component/directive, you just have to inject your 'generator' service and do generator.stop(); and by doing this, if one day your endpoint url changed, you only have to change them in your service.

这篇关于复杂性大于 AngularJS 控制器中的授权(SonarLint 问题)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆