Сложность выше разрешенной в контроллере 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 ответа:
Если вы хотите удалить сложность, вы можете сделать одну функцию:
$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(); });