2013-09-12 6 views
1

У меня есть следующие Java-код, который фиалки в Checkstyle о том, что «цикломатическая Сложность 11 (максимально допустимый в 10)»цикломатическая Сложность 11 (максимально допустимый в 10) в Java коде

public boolean validate(final BindingResult bindingResult) { 
     boolean validate = true; 
     for (String channel : getConfiguredChannels()) { 
      switch (channel) { 
      case "SMS": 
       // do nothing 
       break; 
      case "Email": 
       // do nothing 
       break; 
      case "Facebook": 
       // do nothing 
       break; 
      case "Voice": 
       final SpelExpressionParser parser = new SpelExpressionParser(); 
       if (parser 
         .parseExpression(
           "!voiceMessageForm.audioForms.?[audioId == '' || audioId == null].isEmpty()") 
         .getValue(this, Boolean.class)) { 
        bindingResult.rejectValue("voiceMessageForm.audioForms", 
          "message.voice.provide.all.audios"); 
        validate = false; 
       } 
       boolean voiceContentErrorSet = false; 
        boolean voiceDescriptionErrorSet = false; 
        for (AudioForm audioForm : (List<AudioForm>) parser 
          .parseExpression(
            "voiceMessageForm.audioForms.?[description.length() > 8000]") 
          .getValue(this)) { 
         if (audioForm.getAddAudioBy().equals(
           AudioForm.AddBy.TTS) 
           && !voiceContentErrorSet) { 
          voiceContentErrorSet = true; 
          bindingResult.rejectValue(
            "voiceMessageForm.audioForms", 
            "message.voice.content.exceed.limit"); 
         } else { 
          if (!voiceDescriptionErrorSet) { 
           voiceDescriptionErrorSet = false; 
           bindingResult 
             .rejectValue(
               "voiceMessageForm.audioForms", 
               "message.describe.voice.content.exceed.limit"); 
          } 
         } 
         validate = false; 
        } 
       break; 
      default: 
       throw new IllegalStateException("Unsupported channel: " 
         + channel); 
      } 
     } 
     return validate; 
    } 
} 

Пожалуйста предложите подходящий способ избежать этой проблемы с чеком.

+1

Таким образом, ваша сложность для этого метода довольно высока. Хорошо, разделите свой метод на более мелкие методы. Как и вся итерация audioForm и проверка дополнительного метода, и просто работайте с результатами этого метода. Также рассмотрите проверку инструкции switch. Прямо сейчас у вас есть только действие для канала «Голос». Либо используйте if if else здесь, либо просто извлеките весь блок case для «Voice» другому методу. – Matthias

+1

Получите работу с более высокой циклической степенью сложности? Язык в щеках, но формирующий большие и сложные постановки (как и вы) без каких-либо промежуточных переменных, затрудняет чтение или отладку кода. Включение всего этого в один метод кажется симптомом того же самого. Ваш код почти в порядке или неплохой. Но черт возьми, он должен быть лучше структурирован. –

+0

Было бы вежливо просто * посмотреть * на ваш вопрос, когда вы его написали, и исправить форматирование и отступы. Вы ожидаете, что другие помогут вам бесплатно, так что меньше всего вы можете сделать это легко и безболезненно для них. Просто переформатируйте любой код, который вы вставляете в SO сначала, и убедитесь, что он имеет отступы с пробелами. (Или, если вы не заботитесь о тех, кто может ответить на вопрос, тогда вы можете заботиться о своем рейтинге репутации SO ... Плохо отформатированный код вряд ли получит upvotes.) – hyde

ответ

4

Я бы продолжил и извлек код вашего «Голоса» к другому методу. После этого ваш метод validate будет выглядеть следующим образом: (Вы можете использовать инструменты рефакторинга вашего IDE, чтобы сделать это.)

public boolean validate(final BindingResult bindingResult) { 
    boolean validate = true; 
    for (String channel : getConfiguredChannels()) { 
     switch (channel) { 
     case "SMS": 
      // do nothing 
      break; 
     case "Email": 
      // do nothing 
      break; 
     case "Facebook": 
      // do nothing 
      break; 
     case "Voice": 
      validate = validateVoice(bindingResult); 
     default: 
      throw new IllegalStateException("Unsupported channel: " 
        + channel); 
     } 
    } 
    return validate; 
} 

Edit: (Добавлено извлеченный метод, хотя я на самом деле не смотреть на него.)

private boolean validateVoice(final BindingResult bindingResult) { 
    boolean validate = true; 
    final SpelExpressionParser parser = new SpelExpressionParser(); 
    if (parser.parseExpression("!voiceMessageForm.audioForms.?[audioId == '' || audioId == null].isEmpty()").getValue(this, Boolean.class)) { 
     bindingResult.rejectValue("voiceMessageForm.audioForms", "message.voice.provide.all.audios"); 
     validate = false; 
    } 
    boolean voiceContentErrorSet = false; 
    boolean voiceDescriptionErrorSet = false; 
    for (AudioForm audioForm : (List<AudioForm>) parser.parseExpression("voiceMessageForm.audioForms.?[description.length() > 8000]").getValue(this)) { 
     if (audioForm.getAddAudioBy().equals(AudioForm.AddBy.TTS) && !voiceContentErrorSet) { 
      voiceContentErrorSet = true; 
      bindingResult.rejectValue("voiceMessageForm.audioForms", "message.voice.content.exceed.limit"); 
     } else { 
      if (!voiceDescriptionErrorSet) { 
       voiceDescriptionErrorSet = false; 
       bindingResult.rejectValue("voiceMessageForm.audioForms", "message.describe.voice.content.exceed.limit"); 
      } 
     } 
     validate = false; 
    } 
    return validate; 
} 
+0

Спасибо, однако можете ли вы показать метод ValidateVoice? – ronan

+0

Я добавил. Но я не проверял. (Например, voiceDescriptionErrorSet выглядит подозрительно для меня, для чего вам нужен этот bool?). – Sambuca

+0

Я удалил thenvoiceDescriptionerrorSet как правильно идентифицированный вами. Спасибо, теперь код работает отлично. спасибо – ronan

Смежные вопросы