复杂性大于AngularJS控制器中的授权(SonarLint问题) [英] Complexity greater than authorized in AngularJS Controller (SonarLint issue)
问题描述
我将 SonarLint 与 Eclipse 一起使用,我正在使用 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.
编辑:
我正在使用此样式指南进行角度应用: 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();
并通过这样做,如果一个当您的端点网址更改时,您只需在服务中更改它们。
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屋!